我正在尝试编写一个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
执行计划快照
答案 0 :(得分:3)
在您的查询中使用SELECT *
,尝试优化任何内容都不会有太多运气....因为您从表中请求所有列,SQL Server的查询优化器通常会去那里进行一次表扫描,因为那样更快。
另外:table scan
表示您的桌面上没有任何群集索引 - &gt;非常糟糕的选择。你应该在每个真实的桌子上都有一个良好的聚类索引!
完成后(例如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的查询优化器可以选择从索引中选择几行 - 甚至几列上的索引扫描也会比表扫描)