数据库管理员

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

2
未找到足够好的计划的查询
我有一个SQL Server 2012数据库。我注意到Reason for early termination of statement optimization某些查询的价值,而所有查询都给出Good Enough Plan Found。现在我的问题是: 什么是“提早终止语句优化的原因”的所有可能类型。我确实在msdn中进行了搜索,但没有完整的值列表。 是否有DMV或扩展事件列出了由于找到了“足够好的计划”以外的原因而终止优化的所有查询?我引用了以下两篇文章,其中未列出所有可能性。[此外,它们在我的数据库中给了我不同的结果]。 查找:查询编译超时 识别不够好的查询计划

1
为什么搜索LIKE N'% %'匹配任何Unicode字符而=N' '匹配很多呢?
DECLARE @T TABLE( Col NCHAR(1)); INSERT INTO @T VALUES (N'A'), (N'B'), (N'C'), (N'Ƕ'), (N'Ƿ'), (N'Ǹ'); SELECT * FROM @T WHERE Col LIKE N'%�%' 退货 Col A B C Ƕ Ƿ Ǹ SELECT * FROM @T WHERE Col = N'�' 退货 Col Ƕ Ƿ Ǹ 使用下面的代码生成每个可能的双字节“字符”表明,该=版本与它们中的21,229个以及LIKE N'%�%'所有版本中的匹配(我尝试了一些具有相同结果的非二进制排序规则)。 WITH T(I, N) AS …

2
为什么串联运算符估计的行数少于其输入的行数?
在下面的查询计划摘要中,很明显,该Concatenation运算符的行估计应为~4.3 billion rows,或其两个输入的行估计之和。 但是,~238 million rows会产生一个估计值,从而导致次优Sort/ Stream Aggregate策略,该策略会将数百GB的数据溢出到tempdb。在这种情况下,逻辑上一致的估计将产生Hash Aggregate,消除了溢出,并显着提高了查询性能。 这是SQL Server 2014中的错误吗?在任何合理的情况下,估算值低于输入值可能是合理的?可能有哪些解决方法? 这是完整的查询计划(匿名)。我没有对该服务器的sysadmin访问权限,无法提供来自QUERYTRACEON 2363或类似跟踪标记的输出,但是如果有帮助的话,也许可以从管理员那里获取这些输出。 该数据库的兼容性级别为120,因此正在使用新的SQL Server 2014基数估计器。 每次加载数据时都会手动更新统计信息。给定数据量,我们当前正在使用默认采样率。较高的采样率(或FULLSCAN)可能会产生影响。

1
服务代理已备份,现在可以接收,但似乎没有处理
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 4年前。 事件通知有问题。在将消息发送到的机器/驱动器/数据库上(接收者),当没有人看时,驱动器已装满,因此已被整天备份。 现在我们已经释放了驱动器上的空间,它正在接受消息到队列中,但是它似乎没有在处理它们-没有插入新记录,即使队列现在有2200万条消息并且正在增长(!)。队列已启用: is_activation_enabled = 1 is_receive_enabled = 1 is_enqueue_enabled = 1 我在中看到了激活的SP activation_procedure,但是当我查看时SP_WHOISACTIVE,看不到任何活动的阅读器。 在我再次烧毁驱动器之前-我在做什么错?如何获取它来处理或刷新消息?提前致谢。 更新资料 一个想法-自从有了以来is_enqueue_enabled,也许它可以存储所有消息,直到可以处理所有消息为止?如果是这样,我可以安全地关闭它吗? CREATE PROCEDURE [dbo].[Parse_EN_Messages] AS --mdb 2012/09/05 version 1.2 -- With apologies and thanks to Remus Rusanu, Jonathon Kehayias, Mladen Prajdic, and Jasper Smith for writing -- …

1
SQL Server-处理嵌套的非确定性视图堆栈中的字符串本地化
在对数据库进行概要分析时,我遇到了一个视图,该视图引用了一些不确定性函数,对于该应用程序池中的每个连接,每分钟可访问1000-2500次。从视图中看,一个简单的代码将产生以下执行计划:SELECT 对于少于一千行的视图来说,这似乎是一个复杂的计划,每隔几个月可能会看到一两行发生变化。但是随着以下其他情况的恶化,情况变得更糟: 嵌套视图是不确定的,因此我们无法为其编制索引 每个视图都引用多个UDFs来构建字符串 每个UDF都包含嵌套UDF的,以获取本地化语言的ISO代码 堆栈中的视图使用从s 返回的其他字符串构建器UDF作为JOIN谓词 每个视图堆被视为一个表,这意味着有INSERT/ UPDATE/ DELETE在每个触发器来写入底层表 在视图上,这些触发器使用CURSORS该EXEC存储过程作为参考更多的这些串建设UDF秒。 这对我来说似乎很烂,但是我只有几年使用TSQL的经验。它也会变得更好! 看来开发人员认为这是个好主意,做了所有这些工作,以便所存储的几百个字符串可以基于从UDF特定于模式的a返回的字符串进行翻译。 这是堆栈中的视图之一,但是它们都同样糟糕: CREATE VIEW [UserWKStringI18N] AS SELECT b.WKType, b.WKIndex , CASE WHEN ISNULL(il.I18NID, N'') = N'' THEN id.I18NString ELSE il.I18nString END AS WKString ,CASE WHEN ISNULL(il.I18NID, N'') = N'' THEN id.IETFLangCode ELSE il.IETFLangCode END AS IETFLangCode ,dbo.User3StringI18N_KeyValue(b.WKType, b.WKIndex, …

3
为什么创建一个简单的CCI行组最多需要30秒?
当我发现一些插入内容花费的时间比预期的长时,我正在进行一个涉及CCI的演示。要重现的表定义: DROP TABLE IF EXISTS dbo.STG_1048576; CREATE TABLE dbo.STG_1048576 (ID BIGINT NOT NULL); INSERT INTO dbo.STG_1048576 SELECT TOP (1048576) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN FROM master..spt_values t1 CROSS JOIN master..spt_values t2; DROP TABLE IF EXISTS dbo.CCI_BIGINT; CREATE TABLE dbo.CCI_BIGINT (ID BIGINT NOT NULL, INDEX CCI CLUSTERED COLUMNSTORE); 对于测试,我将从登台表中插入所有1048576行。只要它由于某种原因没有被修剪,就足以填充一个压缩的行组。 …

6
a = 0和b = 0以及…z = 0与a + b + c + d = 0的性能
这是一个简单的问题,我似乎找不到答案。 在性能方面,如果我有WHERE诸如这样的子句a=0 and b=0 and ... z=0,如果我用替换该条件,我会获得任何性能a+b+...+z=0吗? 换句话说,通过替换以下内容,可以提高性能吗? Select * From MyTable Where A=0 and B=0 and C=0 and D=0... 用 Select * From MyTable Where A+B+C+D=0... 我知道它可以依赖于索引,但是为此,我们只说不存在索引。算术运算符(+)的性能是否优于“或”或“与”逻辑运算符? 我的印象是,加法的效果要好于使用AND或OR的多个条件。 检测结果 在420万行的表上 返回行,其中A = 0 B = 0和C = 0-> 351748行 加法(A + B + C = 0)花费了5秒,而逻辑条件A = 0且B = …

1
使用GUI还原数据库-还原错误的文件
我只是在弄弄SSMS图形界面,并研究“恢复”任务的选项。 我注意到的一件事是,当我单击“生成脚本”时,查询的第一行是: RESTORE DATABASE [MyDatabase] FROM DISK = N'Server_Patch\Database_name_LOGSHIPPING.BKP' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 5 ( and a lot of log backups for point in time ) 好的,没问题,但是,我正在对该数据库进行每日备份。这Database_name_LOGSHIPPING.BKP是我一个月前用于日志传送的文件的名称。 为什么当我尝试使用SSMS图形界面还原备份时,它指向此备份文件?我什至没有这个文件了。 通过来自MSSQLTIPS的查询,我可以看到该数据库中的所有备份: SELECT CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, msdb.dbo.backupset.database_name, msdb.dbo.backupset.backup_start_date, msdb.dbo.backupset.backup_finish_date, msdb.dbo.backupset.expiration_date, CASE msdb..backupset.type WHEN 'D' THEN 'Database' WHEN 'L' …

3
通过互斥子类在类型/子类型设计模式中实现子类型的子类型
介绍 为了使该问题对将来的读者有用,我将使用通用数据模型来说明我面临的问题。 我们的数据模型由3个实体,这应标明的A,B和C。为了使事情简单,它们的所有属性都是int类型。 实体A具有以下属性:D,E和X; 实体B具有以下属性:D,E和Y; 实体C具有以下属性:D和Z; 由于所有实体都具有相同的属性D,因此我决定采用类型/子类型设计。 重要提示:实体是互斥的!这意味着实体是A或B或C。 问题: 实体A和B具有另一个公共属性E,但是该属性在实体中不存在C。 题: 如果可能的话,我想利用上述特征进一步优化设计。 老实说,我不知道如何执行此操作,也不知道从哪里开始尝试,因此不知道该帖子。

1
滚动总和/计数/日期间隔内的平均值
在一个涵盖18个月内成千上万个实体的交易的数据库中,我想运行一个查询,以将每个可能的30天期限entity_id与该30天内的交易金额和COUNT 个交易的总和进行分组。以我可以查询的方式返回数据。经过大量测试,此代码完成了我想要的大部分工作: SELECT id, trans_ref_no, amount, trans_date, entity_id, SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total, COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_count FROM transactiondb; 我将在更大的查询中使用类似以下内容的结构: SELECT * FROM …

3
SQL Server中的巨大数据和性能
我已经编写了一个带有SQL Server后端的应用程序,该应用程序可以收集和存储大量记录。我已经计算出,在高峰时,平均记录量约为每天3亿4千万(运行20小时)。 我的原始解决方案(在完成数据的实际计算之前)是让我的应用程序将记录插入到客户查询的同一张表中。显然,该崩溃和烧毁很快,因为不可能查询插入了这么多记录的表。 我的第二个解决方案是使用2个数据库,一个用于应用程序接收的数据,另一个用于客户端就绪的数据。 我的应用程序将接收数据,将其分块成约10万条记录,然后批量插入到临时表中。在记录约100k之后,应用程序将即时创建另一个具有与以前相同的架构的登台表,然后开始插入该表中。它将在作业表中创建一条记录,该表的名称具有100k条记录,并且SQL Server端的存储过程会将数据从登台表移至可用于客户端的生产表,然后删除表由我的应用程序创建的临时表。 除了具有Jobs表的登台数据库之外,两个数据库都具有相同模式的5个表的相同集合。暂存数据库在将要存储大量记录的表上没有完整性约束,键,索引等。如下所示,表名称为SignalValues_staging。目的是让我的应用程序尽快将数据装入SQL Server。动态创建表以便轻松迁移表的工作流程效果很好。 以下是我的登台数据库中的5个相关表以及我的作业表: 我编写的存储过程负责处理所有登台表中的数据并将其插入生产环境。以下是我的存储过程的一部分,该过程从登台表插入生产环境: -- Signalvalues jobs table. SELECT * ,ROW_NUMBER() OVER (ORDER BY JobId) AS 'RowIndex' INTO #JobsToProcess FROM ( SELECT JobId ,ProcessingComplete ,SignalValueStagingTableName AS 'TableName' ,(DATEDIFF(SECOND, (SELECT last_user_update FROM sys.dm_db_index_usage_stats WHERE database_id = DB_ID(DB_NAME()) AND OBJECT_ID = OBJECT_ID(SignalValueStagingTableName)) ,GETUTCDATE())) SecondsSinceLastUpdate FROM SignalValueJobs …

2
为什么这些字符在SQL Server中都相等?
我就是不明白。请参阅以下SQL查询: select nchar(65217) -- ﻁ select nchar(65218) -- ﻂ select nchar(65219) -- ﻃ select nchar(65220) -- ﻄ if nchar(65217) = nchar(65218) print 'equal' if nchar(65217) = nchar(65219) print 'equal' if nchar(65217) = nchar(65220) print 'equal' 基于传递关系,这意味着SQL Server会将它们全部视为相同的字符。 但是,在其他环境中(例如C#),它们是不同的。 我感到困惑的是: 字符串比较如何在SQL Server中工作 为什么比较在一台计算机和一个平台上的表现不一样,但是环境不同 这四个字符代表一个人类可理解的字符。为什么它们在Unicode字符图中如此丰富? 当然,这会导致巨大的问题,因为我正在处理文本处理应用程序,并且数据几乎来自任何地方,因此我需要在处理文本之前对其进行规范化。 如果我知道差异的原因,我可能会找到解决方案。谢谢。

3
生产中从INT到BIGINT的ALTER主键列(MySQL 5.6.19a)
生产数据库中的某些INNODB表即将达到INT AUTO_INCREMENT限制2147483647,我们需要将它们更改为BIGINT,否则写入将开始失败。 这些表位于在Amazon RDS上运行的生产MySQL 5.6.19a数据库中。 我们如何做这样的ALTER,而又不中断一直在发生的生产读取和插入? ALTER TABLE MYTABLECHANGE id idBIGINT NOT NULL AUTO_INCREMENT; 这是该表的DDL: CREATE TABLE `MYTABLE` ( `id` int(11) NOT NULL AUTO_INCREMENT, `siteId` int(11) NOT NULL, `filter` varchar(10) NOT NULL DEFAULT 'ALL', `date` varchar(10) NOT NULL, `cards` varchar(250) NOT NULL, `apples` varchar(45) NOT NULL, `carrots` varchar(45) NOT NULL, …
20 mysql  innodb 

4
将单独的范围合并为最大可能的连续范围
我正在尝试合并多个日期范围(我的负载最多约为500,大多数情况下为10),这些日期范围可能会或可能不会重叠到最大的连续日期范围内。例如: 数据: CREATE TABLE test ( id SERIAL PRIMARY KEY NOT NULL, range DATERANGE ); INSERT INTO test (range) VALUES (DATERANGE('2015-01-01', '2015-01-05')), (DATERANGE('2015-01-01', '2015-01-03')), (DATERANGE('2015-01-03', '2015-01-06')), (DATERANGE('2015-01-07', '2015-01-09')), (DATERANGE('2015-01-08', '2015-01-09')), (DATERANGE('2015-01-12', NULL)), (DATERANGE('2015-01-10', '2015-01-12')), (DATERANGE('2015-01-10', '2015-01-12')); 表看起来像: id | range ----+------------------------- 1 | [2015-01-01,2015-01-05) 2 | [2015-01-01,2015-01-03) 3 | [2015-01-03,2015-01-06) …

4
DBMS中的主键和超级键有什么区别
我是DBMS的新手,但仍在学习该理论。 我对这个关键业务感到非常困惑,在谷歌搜索之后,我将其范围缩小到只有我没有得到的两个关键(主键和超级键)。 我对DBMS有几个问题。如果您能为我回答,我将不胜感激。 1)DBMS中的主键和超级键有什么区别? 如果您可以使用一个全面的示例正确解释,请多多关照 2)主键和超级键都可以有多个列组合形成主键和超级键吗? 3)主键是超级键的子集,反之亦然吗?

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.