如何做到完美的SQL查询性能优化

时间:2012-07-23 14:31:39

标签: sql-server-2008 tsql

我正在尝试编写一个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

enter image description here

2

enter image description here

1 个答案:

答案 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的查询优化器可以选择从索引中选择几行 - 甚至几列上的索引扫描也会比表扫描)