【发布时间】:2022-01-08 10:21:34
【问题描述】:
我正在尝试找出最佳选择,我的主要要求是减少 IO。
- 我有一个包含 500M 记录的表,下面提到的查询是在表上选择默认的聚集索引扫描。
- 我试图创建一个覆盖非聚集索引,但它仍然选择聚集索引扫描作为默认值。所以我强迫它使用覆盖索引,我的观察是逻辑读取从 3M 下降到 1M,但 CPU 和持续时间增加了。
- 我正在尝试了解这种行为以及这里的最佳做法。
查询:
set statistics time, io on;
select
min(CampaignID),
max(CampaignID)
from Campaign
where datecreated < dateadd(day, -90, getutcdate())
go
CREATE NONCLUSTERED INDEX [NCIX]
ON [dbo].[Campaign](DateCreated)
INCLUDE (Campaignid)
go
select
min(CampaignID),
max(CampaignID)
from Campaign with (index = NCIX)
where datecreated < dateadd(day, -90, getutcdate())
set statistics time, io off;
消息:
(1 row affected)
Table 'Campaign'. Scan count 2, logical reads 3548070, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
(8 rows affected)
(1 row affected)
SQL Server Execution Times:
CPU time = 14546 ms, elapsed time = 14723 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 3 ms.
(1 row affected)
Table 'Campaign'. Scan count 1, logical reads 1191017, physical reads 0, page server reads 0, read-ahead reads 19, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
(6 rows affected)
(1 row affected)
SQL Server Execution Times:
CPU time = 163953 ms, elapsed time = 164163 ms.
执行计划:
【问题讨论】:
-
没有“最佳”。在某些情况下,一种表现更好,而另一种则表现更好。在您的示例中,扫描速度更快,SQL Server 正在使用它,因为它知道(正确猜测)扫描表比使用索引搜索所需的工作更少,然后查找所有匹配的记录。我们不知道你的索引,我们不知道你的数据,很难说别的。以我的经验,最好的办法是让 SQL Server 在大多数情况下进行选择。您可以提供帮助,但我不会使用索引提示。
-
谢谢,我一定会考虑您的意见。但是根据您的要求,我已经包含了索引定义,以便了解我的要求。
-
对这里的逻辑读取有什么想法吗?选择的 sql 服务器正在执行 350 万次逻辑读取,而带有索引提示的 SQL 服务器正在执行 110 万次逻辑读取。
-
索引很好,有了这个,我可以说SQL Server要么按日期顺序查询索引,很可能得到大多数/很多记录,然后需要排序(聚合) 用于获取 MIN 和 MAX 的 ID。另一种选择是遍历聚集索引上的数据并按顺序获取 ID(我假设您的聚集索引键是 ID)。当匹配您的 where 条件的记录数接近记录总数时,第二个更快。
-
分享执行计划的好方法是上传到Paste The Plan 并将链接添加到您的问题。计划的图像并不是故事的全部。
标签: sql-server sql-execution-plan