【发布时间】:2019-03-14 06:30:52
【问题描述】:
请问有什么方法可以知道更新表/索引统计的合适时机吗?
最近,我们的 BI-DWH 中的主要数据集市表之一 SQL Server 2012 的性能越来越差。 所有索引每个周末都会根据它们的碎片百分比进行重组/重建,现在它们低于 avg_fragmentation_in_percent 的 5%。
所以我们检测到这是由过时的表/索引统计信息或表碎片等引起的。
一般来说,我们设置了 autostats,并且 Table/index 统计信息在 2018 年 7 月更新,也许现在还不是时候根据他们的优化器进行更新, 由于这张表很大,总记录在7亿左右,每天增加约50万条记录。
这是该表的 PK 统计数据和实际记录数。
-- statistics
dbcc show_statistics("DM1","PK_DM1")
Name Updated Rows Rows Sampled Steps Density AveragekeylengthString Index Filter Expression Unfiltered Rows
------------------------------------------------------------------------------------------------------------------------------------------------------
PK_DM1 07 6 2018 2:54PM 661696443 1137887 101 0 28 NO NULL 661696443
-- actual row count
select count(*) row_cnt from DM1;
row_cnt
-------------
706723646
-- Current Index Fragmmentations
SELECT a.index_id, name, avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(N'DM1'),
OBJECT_ID(N'dbo.DM1'), NULL, NULL, NULL) AS a
JOIN sys.indexes AS b
ON a.object_id = b.object_id AND a.index_id = b.index_id;
GO
index_id name avg_fragmentation_in_percent
--------------------------------------------------
1 PK_DM1 1.32592173128252
7 IDX_DM1_01 1.06209021193359
9 IDX_DM1_02 0.450888386865285
10 IDX_DM1_03 4.78448190118396
因此,统计行数和实际记录数之间的差异不到 10%,但超过 4500 万。 我想知道在这种情况下是否值得手动更新表/索引统计信息。
如果您有任何其他信息决定了更新统计数据的适当时机,我们将不胜感激。
谢谢。
-- 结果
感谢 @scsimon 的建议,我详细检查了所有索引统计信息,发现主索引缺少 RANGE_HI_KEY - 该索引基于注册日期,并且在 2018 年 7 月上次更新统计信息之后没有范围。 (该声明是用户在搜索2018年9月记录时提出的)
所以我决定更新表/索引统计信息并确认相同的查询从 1 小时 45 分钟缩短到 3.5 分钟。
Deelpy 对我的问题的所有建议表示感谢。
最好的问候。
【问题讨论】:
-
你怎么知道你的性能问题是由统计问题引起的?
-
我想说你需要一个充分的理由来偏离推荐的准则:docs.microsoft.com/en-us/sql/relational-databases/indexes/…
-
感谢您的参考,@user1443098。但我认为索引碎片似乎很低。如有误会,请告知。
-
IIUC,您询问何时更新统计信息和索引。除特殊情况外,我会根据指南设置自动统计和重组/重建索引。而且,我见过其中的一些!
-
@user1443098 再次感谢 :)
标签: sql-server statistics database-tuning