1

我正在尝试编写一个 SQL 脚本来获取特定日期范围的数据。在下面显示的示例中,我仅尝试提取 1 天(日期时间)的数据。

但是完成查询执行只需要 3 多分钟。

我不太确定是否缺少要在Datetime列上创建的任何索引。如果是的话,有人可以建议我如何使这个 SQL 查询快速执行吗?

另请参阅查询执行计划和统计 IO 附加的快照。

非常感谢您的帮助。

SQL 查询

set Statistics IO on
declare @StartDate datetime,@EndDate datetime
set @StartDate = '2012-07-19 00:00:00.000'
set @EndDate = '2012-07-20 23:59:00.000'
select * from Admin_Letters A with (nolock)
Where A.Date_Linked > @StartDate and A.Date_Linked < @EndDate

执行计划快照

1.

在此处输入图像描述

2.

在此处输入图像描述

4

1 回答 1

3

SELECT *你的查询中,你不会有太多的运气来尝试优化任何东西......因为你从表中请求所有列,SQL Server 的查询优化器通常会进行表扫描,因为这样更快。

另外:table scan意味着您的表上没有任何聚簇索引-> 非常糟糕的选择。您应该在每个真实表上都有一个良好的聚簇索引!

一旦你有了它(例如在一个INT IDENTITY列上),那么你需要从那个表中决定你真正需要哪些列。在 上放置一个非聚集索引Date_Linked,并包含您真正需要的所有列 - 例如:

CREATE NONCLUSTERED INDEX IX01_Admin_Letters
ON dbo.Admin_Letters(Date_Linked)
INCLUDE (Col1, Col2, ..., ColN)   -- as **few** columns as possible!

然后一个

SELECT Date_Linked, Col1, Col2, ...ColN 
FROM dbo.Admin_Letters A
WHERE A.Date_Linked > @StartDate AND A.Date_Linked < @EndDate

真的会飞!(因为现在,SQL Server 的查询优化器可以选择只从索引中选择几行 - 甚至对几列的索引扫描也会比表扫描快得多)

于 2012-07-23T14:38:44.280 回答