Questions tagged «sql-server-2014»

SQL Server 2014(主要版本12.0.xxxx)。还请标记sql-server。

2
为什么更改声明的连接列顺序会引入排序?
我有两个表,它们具有相同的命名,类型和索引键列。其中一个具有唯一的聚集索引,另一个具有非唯一索引。 测试设置 设置脚本,包括一些实际的统计信息: DROP TABLE IF EXISTS #left; DROP TABLE IF EXISTS #right; CREATE TABLE #left ( a char(4) NOT NULL, b char(2) NOT NULL, c varchar(13) NOT NULL, d bit NOT NULL, e char(4) NOT NULL, f char(25) NULL, g char(25) NOT NULL, h char(25) NULL --- and a …

1
SQL Server:如何跟踪CREATE INDEX命令的进度?
SQL Server 2014标准版 我已经读过dm_exec_requests中的percent_complete不适用于CREATE INDEX,实际上,percent_complete坚持为0。所以这无济于事。 我目前使用下面的方法,该方法至少向我展示了运动(未阻止创建索引)。但是我不知道我是整个过程的%10还是%99。 我尝试了这里描述的方法:https : //dba.stackexchange.com/a/102545/6229, 但是它显示出明显的错误完成时间(对于60分钟以上的过程,它基本上显示“现在”,即我进入了10分钟) ) 我如何获得线索? SELECT percent_complete, estimated_completion_time, reads, writes, logical_reads, text_size, * FROM sys.dm_exec_requests AS r WHERE r.session_id <> @@SPID AND r.session_id = 58

1
DBA从事新工作的第一天-检查备份和安全性-如何?还有什么要检查的?
通常,当我在新环境中启动时,我倾向于检查备份在哪里,何时进行了最后一次完全备份,何时应用了最后一次还原,还检查了安全性。 我这样做的方法是通过T-SQL。 检查备份 ;with Radhe as ( SELECT @@Servername as [Server_Name], B.name as Database_Name, ISNULL(STR(ABS(DATEDIFF(day, GetDate(), MAX(Backup_finish_date)))), 'NEVER') as DaysSinceLastBackup, ISNULL(Convert(char(11), MAX(backup_finish_date), 113)+ ' ' + CONVERT(VARCHAR(8),MAX(backup_finish_date),108), 'NEVER') as LastBackupDate ,BackupSize_GB=CAST(COALESCE(MAX(A.BACKUP_SIZE),0)/1024.00/1024.00/1024.00 AS NUMERIC(18,2)) ,BackupSize_MB=CAST(COALESCE(MAX(A.BACKUP_SIZE),0)/1024.00/1024.00 AS NUMERIC(18,2)) ,media_set_id = MAX(A.media_set_id) ,[AVG Backup Duration]= AVG(CAST(DATEDIFF(s, A.backup_start_date, A.backup_finish_date) AS int)) ,[Longest Backup Duration]= …

1
急切的后台打印操作符对于从群集的列存储中进行此删除有用吗?
我正在测试从群集的列存储索引中删除数据。 我注意到执行计划中有一个急切的假脱机操作员: 具有以下特征: 删除6000万行 1.9使用GiB TempDB 14分钟执行时间 连续计划 1在线轴上重新绑定 估计扫描成本:364.821 如果我诱使估算器低估了,我会得到一个更快的计划,避免使用TempDB: 估计扫描成本:56.901 (这是一个估计的计划,但是注释中的数字正确。) 有趣的是,如果我通过运行以下命令刷新增量存储,则线轴会再次消失: ALTER INDEX IX_Clustered ON Fact.RecordedMetricsDetail REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON); 仅当增量存储中的页面阈值超过某个阈值时才引入假脱机。 要检查增量存储的大小,我正在运行以下查询来检查表的行内页面: SELECT SUM([in_row_used_page_count]) AS in_row_used_pages, SUM(in_row_data_page_count) AS in_row_data_pages FROM sys.[dm_db_partition_stats] as pstats JOIN sys.partitions AS p ON pstats.partition_id = p.partition_id WHERE p.[object_id] = OBJECT_ID('Fact.RecordedMetricsDetail'); 第一个计划中的假脱机迭代器是否有任何合理的好处?我必须假定它旨在提高性能,而不是用于万圣节保护,因为它的存在不一致。 …

4
为什么在相同计划中,(相同)1000个唯一索引的估计成本不同?
在下面的查询中,两个执行计划都估计将对唯一索引执行1,000次查找。 搜索是由对同一源表的有序扫描驱动的,因此看起来应该最终以相同的顺序搜索相同的值。 两个嵌套循环都有 <NestedLoops Optimized="false" WithOrderedPrefetch="true"> 有人知道为什么第一个计划的成本为0.172434,而第二个计划的成本为3.01702吗? (问题的原因是,由于明显降低了计划成本,因此向我建议了第一个查询,这是一种优化。实际上,我认为它似乎在做更多的工作,但我只是想解释这个差异。) ) 设定 CREATE TABLE dbo.Target(KeyCol int PRIMARY KEY, OtherCol char(32) NOT NULL); CREATE TABLE dbo.Staging(KeyCol int PRIMARY KEY, OtherCol char(32) NOT NULL); INSERT INTO dbo.Target SELECT TOP (1000000) ROW_NUMBER() OVER (ORDER BY @@SPID), LEFT(NEWID(),32) FROM master..spt_values v1, master..spt_values v2; INSERT INTO dbo.Staging …

1
SQL Server 2014:有关不一致的自连接基数估计的任何解释?
考虑SQL Server 2014中的以下查询计划: 在查询计划中,自联接ar.fId = ar.fId产生的估计值为1行。但是,这在逻辑上是不一致的估计:ar只有20,608行,并且只有一个不同的值fId(准确地反映在统计数据中)。因此,此联接产生行(~424MMrow)的全叉积,导致查询运行几个小时。 我很难理解为什么SQL Server会提出一个很容易证明与统计数据不一致的估计。有任何想法吗? 初步调查和其他细节 根据Paul 在这里的答案,似乎用于估计联接基数的SQL 2012和SQL 2014启发式方法应该可以轻松处理需要比较两个相同直方图的情况。 我从跟踪标志2363的输出开始,但无法轻松理解。下面的代码段是否表示SQL Server正在比较的直方图fId和bId以便估计仅使用的联接的选择性fId?如果是这样,那显然是不正确的。还是我误读了跟踪标志输出? Plan for computation: CSelCalcExpressionComparedToExpression( QCOL: [ar].fId x_cmpEq QCOL: [ar].fId ) Loaded histogram for column QCOL: [ar].bId from stats with id 3 Loaded histogram for column QCOL: [ar].fId from stats with id 1 Selectivity: 0 请注意,我想出了几种变通办法,这些变通办法包含在完整的repro脚本中,并将此查询缩短为毫秒。这个问题的重点是了解行为,如何在以后的查询中避免它,以及确定它是否应与Microsoft一起提交。 …

2
为什么LEN()函数严重低估了SQL Server 2014中的基数?
我有一个带有字符串列和谓词的表,该谓词检查具有一定长度的行。在SQL Server 2014中,无论我要检查的长度如何,我都会看到1行的估计。这产生了非常糟糕的计划,因为实际上有成千上万甚至上百万的行,并且SQL Server选择将此表放在嵌套循环的外侧。 对于SQL Server 2014的基数估计为1.0003,而SQL Server 2012的基数估计为31,622,是否有解释?有没有好的解决方法? 以下是问题的简短摘要: -- Create a table with 1MM rows of dummy data CREATE TABLE #customers (cust_nbr VARCHAR(10) NOT NULL) GO INSERT INTO #customers WITH (TABLOCK) (cust_nbr) SELECT TOP 1000000 CONVERT(VARCHAR(10), ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) AS cust_nbr FROM master..spt_values v1 CROSS …

4
由于“ XTP_CHECKPOINT”,数据库“ database_name”的事务日志已满
我有一个问题XTP_CHECKPOINT。 我正在使用SQL Server2014。我有一个处于简单恢复模型模式的数据库。它也在被复制。 没有公开交易。我已经跑了DBCC OPENTRAN,它返回: “没有活跃的公开交易。” 但是,每当我尝试创建或删除表或删除数据时,我都会不断收到此消息:( 我用单词替换了实际的数据库名称database_name) “由于'XTP_CHECKPOINT',数据库'database_name'的事务日志已满” 有谁知道为什么会发生这种情况,更重要的是,我如何才能阻止这种情况发生? 是的,数据库确实处于SIMPLE恢复模型模式。即,事务日志应自动截断。 顺便说一句,我处于完全恢复模式的另一个数据库做了同样的事情,开始返回同样的错误: 由于“ XTP_CHECKPOINT”,数据库“ database_name”的事务日志已满 我试图将日志增长设置更改为无限制增长,但它不允许我返回相同的错误。 除了文件组之外,我完全不需要任何XTP东西就可以重现该问题。方法如下:http : //pastebin.com/jWSiEU9U

2
LIKE运算符的基数估计(局部变量)
我给人的印象是,LIKE在对未知场景进行所有优化时都使用运算符时,旧的和​​新的CE都使用9%的估计值(假设相关统计数据可用并且查询优化器不必求助于选择性猜测)。 当对信用数据库执行以下查询时,在不同的CE下我得到了不同的估计。在新的CE下,我收到了900行的估计值,而在旧的CE下,我收到了241.416的估计值,我不知道如何得出此估计值。有人能说清楚吗? -- New CE (Estimate = 900) DECLARE @LastName VARCHAR(15) = 'BA%' SELECT * FROM [Credit].[dbo].[member] WHERE [lastname] LIKE @LastName; -- Forcing Legacy CE (Estimate = 241.416) DECLARE @LastName VARCHAR(15) = 'BA%' SELECT * FROM [Credit].[dbo].[member] WHERE [lastname] LIKE @LastName OPTION ( QUERYTRACEON 9481, QUERYTRACEON 9292, QUERYTRACEON 9204, QUERYTRACEON …

1
为什么此MERGE语句导致会话被终止?
我有以下MERGE针对数据库发出的声明: MERGE "MySchema"."Point" AS t USING ( SELECT "ObjectId", "PointName", z."Id" AS "LocationId", i."Id" AS "Region" FROM @p1 AS d JOIN "MySchema"."Region" AS i ON i."Name" = d."Region" LEFT JOIN "MySchema"."Location" AS z ON z."Name" = d."Location" AND z."Region" = i."Id" ) AS s ON s."ObjectId" = t."ObjectId" WHEN NOT …

1
不可修复的空间索引损坏是否被视为正常现象?
我有一个空间索引用于该DBCC CHECKDB报告损坏: DBCC CHECKDB(MyDB) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS, TABLERESULTS 空间索引,XML索引或索引视图'sys.extended_index_xxx_384000'(对象ID xxx)不包含视图定义生成的所有行。这不一定代表此数据库中数据的完整性问题。 空间索引,XML索引或索引视图'sys.extended_index_xxx_384000'(对象ID xxx)包含视图定义未生成的行。这不一定代表此数据库中数据的完整性问题。 CHECKDB在表'sys.extended_index_xxx_384000'(对象ID xxx)中发现了0个分配错误和2个一致性错误。 维修等级为repair_rebuild。 删除并重新创建索引不会删除这些损坏报告。没有EXTENDED_LOGICAL_CHECKS但没有DATA_PURITY错误,则不会报告。 同样,CHECKTABLE此表花费45分钟,尽管它的CI大小为30 MB,大约有3万行。该表中的所有数据都是点geography数据。 在任何情况下都可以预期这种行为吗?它说:“这不一定代表完整性问题”。我应该做些什么?CHECKDB失败了,这是一个问题。 此脚本重现了该问题: CREATE TABLE dbo.Cities( ID int NOT NULL, Position geography NULL, CONSTRAINT PK_Cities PRIMARY KEY CLUSTERED ( ID ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, …

3
警告执行计划中缺少统计信息
我有一种我无法理解的情况。我的SQL Server执行计划告诉我,表上缺少统计信息,但是已经创建了统计信息: 但是,如果我们看一下表格,将会看到有一个自动创建的统计信息: 有人可以帮助您了解情况如何吗? 当前数据库上的Auto_Update和Auto_Create统计信息已打开。 我正在使用SQL Server 2014。

1
为什么删除行时非聚集索引使用更多空间?
我有一张有75亿行和5个索引的大表。当我删除大约1000万行时,我注意到非聚集索引似乎增加了它们存储在页面上的数量。 我写了一个查询dm_db_partition_stats来报告页面中的差异(之后-之前): 索引1是聚集索引,索引2是主键。其他的则是非集群且非唯一的。 为什么这些非聚集索引上的页面增加? 我希望最坏的数字保持不变。 我确实看到性能计数器报告了删除期间页面拆分的增加。 删除时,幻像记录是否必须移至另一页?这和“唯一符”有关吗? 我们正处于推出RCSI的中间阶段,但是现在,RCSI已关闭。 它是可用性组中的主要节点。我知道快照以某种方式在次要上使用。如果这很有意义,我会感到惊讶。我计划对此进行深入研究(查看dbcc页面输出)以了解更多信息。希望有人看到过类似的内容。

2
是否可以强制优化器在此分区视图中消除不相关的表?
我正在测试大型表的不同体系结构,并且看到的一个建议是使用分区视图,即将大型表分解为一系列较小的“分区”表。 1,2,3,4 在测试这种方法时,我发现有些东西对我来说并没有太大意义。当我在事实视图的“分区列”上进行过滤时,优化程序仅在相关表上进行搜索。此外,如果我在维度表的该列上进行过滤,则优化程序会消除不必要的表。 但是,如果我在维度的其他方面进行过滤,则优化器将在每个基本表的PK / CI上进行搜索。 这是有问题的查询: select od.[Year], AvgValue = avg(ObservationValue) from dbo.v_Observation o join dbo.ObservationDates od on o.ObservationDateKey = od.DateKey where o.ObservationDateKey >= 20000101 and o.ObservationDateKey <= 20051231 group by od.[Year]; select od.[Year], AvgValue = avg(ObservationValue) from dbo.v_Observation o join dbo.ObservationDates od on o.ObservationDateKey = od.DateKey where od.DateKey …

1
增量更新后统计信息消失
我们有一个使用增量统计信息的大型分区SQL Server数据库。所有索引均按分区对齐。当我们尝试通过分区在线重建分区时,在重建索引之后,所有统计信息都会消失。 下面是一个脚本,用于通过AdventureWorks2014数据库在SQL Server 2014中复制问题。 --Example against AdventureWorks2014 Database CREATE PARTITION FUNCTION TransactionRangePF1 (DATETIME) AS RANGE RIGHT FOR VALUES ( '20130501', '20130601', '20130701', '20130801', '20130901', '20131001', '20131101', '20131201', '20140101', '20140201', '20140301' ); GO CREATE PARTITION SCHEME TransactionsPS1 AS PARTITION TransactionRangePF1 TO ( [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], …

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.