数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

2
获取联接表中聚合值的增量计数
我在MySQL 5.7.22数据库中有两个表:posts和reasons。每个帖子行都有并且属于许多原因行。每个原因都有一个相关的权重,因此每个帖子都有一个相关的总权重。 对于10个重量点的每个增量(即0、10、20、30等),我希望获得总权重小于或等于该增量的帖子数。我希望这样做的结果看起来像这样: weight | post_count --------+------------ 0 | 0 10 | 5 20 | 12 30 | 18 ... | ... 280 | 20918 290 | 21102 ... | ... 1250 | 118005 1260 | 118039 1270 | 118040 总权重大致呈正态分布,有一些非常低的值和一些非常高的值(当前最大值为1277),但大部分位于中间。大约有120,000行posts,而大约有120 行reasons。每个帖子平均有5或6个原因。 表格的相关部分如下所示: CREATE TABLE `posts` ( id BIGINT PRIMARY …

2
返回属性不包含特定字符的xml序列
考虑以下简单的XML: <xml> <customer name="Max"> <email address="me@you.com" /> </customer> <customer name="Erik"> <email address="erik@your-mom.com" /> </customer> <customer name="Brent"> <email address="brentcom" /> </customer> </xml> 我想获取<Customer>序列列表,其中address该<email>项目的属性不包含@。 所以,我想要的输出看起来像: <customer name="Brent"> <email address="brentcom" /> </customer> mcve: DECLARE @x XML = '<xml> <customer name="Max"><email address="me@you.com" /></customer> <customer name="Erik"><email address="erik@your-mom.com" /></customer> <customer name="Brent"><email address="brentcom" /></customer> </xml>'; 该查询: SELECT …
10 sql-server  xml  xquery 

1
从具有聚集索引的SQL Server表删除数据期间,B树是否重新平衡?
我在SQL Server数据库中有一个表,在主键上有聚簇索引。该表有100万行。如果我从表中删除了1万行,执行删除操作期间索引是否会被重组? 删除操作是存储过程的一部分。一次,一个以上的客户端可以执行该存储过程,但是每个单独的运行都将删除其自己的一组行(由主键唯一标识)。当多个客户端执行该过程时,我将无法使用(U型)键锁。阻止程序锁属于同一表中的一行,并且不属于任何同时运行的事务。不应有任何阻塞,因为每次运行都试图删除自己的行集。由于已关闭锁升级,因此不会发生。 我怀疑,删除操作一定会导致索引重新平衡,因此在重组过程中,它可能会对表的任何行进行键锁定。 我对此表示感谢。

2
将整数强制转换为上限(十进制)的问题
我有这种情况,看起来MySQL正在采用最大的十进制值,并尝试将其他值转换为该值。 问题是此查询是由外部库生成的,因此至少在此级别上我无法控制此代码。您知道如何解决此问题吗? SELECT 20 AS x UNION SELECT null UNION SELECT 2.2; +------+ | x | +------+ | 9.9 | -- why from 20 to 9.9 | NULL | | 2.2 | +------+ 预期结果 +------+ | x | +------+ | 20 | -- or 20.0, doesn't matter really in my …

2
每一批都会导致编译
我们有一个第三方应用程序,它可以批量发送T-SQL语句。 该数据库托管在SQL Server 2016 Enterprise SP1 CU7、16核和256GB内存上。启用即席优化。 这是正在执行的查询的虚拟示例: exec sp_executesql N' IF @@TRANCOUNT = 0 SET TRANSACTION ISOLATION LEVEL SNAPSHOT select field1, field2 from table1 where field1=@1 option(keep plan, keepfixed, loop join) select field3, field4 from table2 where field3=@1 option(keep plan, keepfixed, loop join)', N'@1 nvarchar(6)',@1=N'test' 当我监视数据库并查看批处理/秒和编译/秒时,我注意到它们始终相同。在高负载下,这可以是1000批/秒和1000编译/秒。在平均负载下,有150个批次/秒。 我分析了最近编译的计划的查询缓存: SELECT TOP …

2
如果并行交换事件死锁是无受害者的,这有问题吗?
我们在生产环境中会看到很多此类查询内并行线程死锁(SQL Server 2012 SP2-是的...我知道...),但是当查看通过扩展事件捕获的死锁XML时,受害者名单是空的。 <victim-list /> 死锁似乎在4个线程之间,两个带有WaitType="e_waitPipeNewRow",两个带有WaitType="e_waitPipeGetRow"。 <resource-list> <exchangeEvent id="Pipe13904cb620" WaitType="e_waitPipeNewRow" nodeId="19"> <owner-list> <owner id="process4649868" /> </owner-list> <waiter-list> <waiter id="process40eb498" /> </waiter-list> </exchangeEvent> <exchangeEvent id="Pipe30670d480" WaitType="e_waitPipeNewRow" nodeId="21"> <owner-list> <owner id="process368ecf8" /> </owner-list> <waiter-list> <waiter id="process46a0cf8" /> </waiter-list> </exchangeEvent> <exchangeEvent id="Pipe13904cb4e0" WaitType="e_waitPipeGetRow" nodeId="19"> <owner-list> <owner id="process40eb498" /> </owner-list> <waiter-list> <waiter id="process368ecf8" …

1
SQL Server逐行访问
我有一个这样组织的表(简体) Name, EMail, LastLoggedInAt 我在SQL Server中有一个用户(RemoteUser),该用户只能看到LastLoggdInAt字段不为null的数据(通过选择查询)。 看来我可以做到?可能吗?

1
如何为包含负值和零值的列乘行?
我试图获取按查询分组的特定列的所有行的乘积。我发现的大多数示例都将我引向了exp,sum并且log exp(sum(log([Column A]))) 我遇到的问题是该列包含一些零值,因此当零传递给log函数时出现此错误: 发生无效的浮点运算。 我以为我可以通过使用case表达式来解决这个问题,但是那似乎并没有像我认为的那样起作用,因为它似乎可以评估所有情况。 select Name, Product = case when min([Value]) = 0 then 0 when min([Value]) <> 0 then exp(sum(log(I))) -- trying to get the product of all rows in this column end from ids group by Name SqlFiddle 给定以下结果集: Id Name Value _________________________________ 1 a 1 …

1
优化2,135,044,521行表上的索引
我有一张大桌子的I / O问题。 一般统计 该表具有以下主要特征: 环境:Azure SQL数据库(层为P4 Premium(500个DTU)) 行:2,135,044,521 1,275个已使用的分区 聚集和分区索引 模型 这是表的实现: CREATE TABLE [data].[DemoUnitData]( [UnitID] [bigint] NOT NULL, [Timestamp] [datetime] NOT NULL, [Value1] [decimal](18, 2) NULL, [Value2] [decimal](18, 2) NULL, [Value3] [decimal](18, 2) NULL, CONSTRAINT [PK_DemoUnitData] PRIMARY KEY CLUSTERED ( [UnitID] ASC, [Timestamp] ASC ) ) GO ALTER …


4
SQL Server查询存储-什么是“临时”查询?
我一直在深入研究SQL Server查询存储,并且经常看到对“临时”查询的引用。但是,我还没有看到查询存储确定什么是即席查询。我已经看到了可以将其推断为没有参数的查询或仅执行一次查询的地方。为此是否存在正式定义?我的意思不是一般。我的意思是,它与查询存储有关。 例如,此页面显示了一个从查询存储中删除临时查询的示例,但是它所使用的条件似乎是执行计数仅为一个。这似乎是临时查询的奇怪定义。顺便说一句,如果您转到页面,请搜索“删除临时查询”。

1
确定导致数据库卡在RESTORING状态的根本原因
我知道有一些问题可以解决数据库卡在RESTORING状态中的问题,并使用这些解决方案手动将数据库恢复在线状态,但是我的情况有所不同。 我使用Powershell脚本进行了自动还原,该脚本将生产的副本还原到DEV实例。这些脚本在大约一年内没有发生变化,并且偶尔会完成还原过程,但是还原后的数据库仍处于RESTORING状态(有时脚本可以正常工作,有时会失败)。 每当我手动重新运行该过程时,或者从SSMS的用户界面或通过T-SQL手动还原数据库时,它都会毫无问题地完成。 我找到了建议CHECKDB在还原后的数据库上运行的答案,但没有任何结果导致此问题。 由于还原脚本还原了数据库的完整备份并使用了一个"WITH RECOVERY"选项,因此我试图找出可能停止还原过程的原因,尽管实际上是使用进行还原的"WITH RECOVERY"。 真的很感谢任何建议,因为我一直努力了解为什么会不时发生这种情况。 我非常想解决问题的根本原因,而不是解决症状,那就是再次手动还原数据库。 更新: Github Gist如@Brent建议- 在此处。

1
谁在使用我的工作线程?SQL Server 2014-HADR
最近,我们在SQL Server 2014 HADR环境中遇到问题,其中一台服务器的工作线程不足。 我们收到消息: AlwaysOn可用性组的线程池无法启动新的工作线程,因为没有足够的可用工作线程。 我已经打开了另一个问题,以获得一个(我认为)应该帮助我分析问题的语句(是否可以查看哪个SPID使用哪个调度程序(工作线程)?)。尽管现在有了查询来查找正在使用系统的线程,但我不明白为什么该服务器用完了工作线程。 我们的环境如下: 4 Windows Server 2012 R2 SQL Server 2014企业版 24个处理器-> 832个工作线程 256 GB内存 12个可用性组(整体) 642个数据库(整体) 因此,出现问题的服务器具有以下配置: 5个可用性组(3个主要/ 2个辅助) 325个数据库(127个主要/ 198个次要) MAXDOP = 8 Cost Threshold for Parallelism = 50 电源计划设置为“高性能” 为了“解决”该问题,我们手动将一个可用性组故障转移到辅助服务器。该服务器的配置现在为: 5个可用性组(2个主要/ 3个辅助) 325个数据库(77个主要数据库/ 248个辅助数据库) 我正在使用以下语句监视可用线程: declare @max int select @max = max_workers_count …

2
不相关的列会影响select语句的查询时间吗?
我只是好奇。 假设您有一个包含100万条记录/行的表。 select order_value from store.orders 该表在实际查询时间内是1个字段,2个字段还是100个字段是否有所不同?我的意思是除“ order_value”以外的所有字段。 现在,我正在将数据推送到数据仓库。有时我将字段转储到表中,“将来可能在某天使用”-但是现在没有任何查询。这些“外部”字段会直接或间接影响不包含它们的选择语句吗(否*我的意思是)?

1
在Python中检索到的SQL Server VARCHAR列的编码问题
最近,我们遇到了与字段相关的编码问题,该字段在SQL Server中存储为varchar(120)。在SSMS中,varchar显示为: “谁杀了乔本?” 但是,将其引入python后,显示为: 我已经从Python方面对此进行了研究,并且没有任何奇怪的事情发生。我的理论是,SQL Server中的varchar接受的是UTF-8字符,这些字符在python中的显示方式不同于SSMS。我对SQL Server中的编码不是很熟悉。有人可以让我知道以下内容: SSMS中有没有办法查看varchar的编码?例如,看到\ x82而不是显示当前来自SSMS的逗号? 我们正在使用SQL Server2008。是否可以在不使用导入/导出工具或转储到平面文件的情况下,将任何UTF-8字符的编码更改为ASCII字符?即可以通过查询进行此转换吗? 有什么方法可以通过查询以编程方式识别有问题的记录(问题定义为ASCII不支持的UTF-8字符)? 先感谢您! 使用,sp_help N'table_name';我发现此VARCHAR列的归类为SQL_Latin1_General_CP1_CI_AS。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.