Sql server 2008 如何实现SQL查询性能优化

Sql server 2008 如何实现SQL查询性能优化,sql-server-2008,tsql,Sql Server 2008,Tsql,我正在尝试编写一个SQL脚本来获取特定日期范围的数据。在下面所示的示例中,我尝试仅提取1天(datetime)的数据 但完成查询执行只需3分钟以上 我不太确定是否缺少在Datetime列上创建的索引。如果是,有谁能建议我如何快速执行此SQL查询 另请参阅查询执行计划和统计IO中附带的快照 非常感谢你的帮助 SQL查询 set Statistics IO on declare @StartDate datetime,@EndDate datetime set @StartDate = '2012-

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

但完成查询执行只需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
打开统计信息IO
声明@StartDate datetime,@EndDate datetime
set@StartDate='2012-07-19 00:00:00.000'
set@EndDate='2012-07-20 23:59:00.000'
使用(nolock)从管理员字母A中选择*
其中A.Date\u Linked>@StartDate和A.Date\u Linked<@EndDate
执行计划快照

1.

2.

使用查询中的
选择*
,您将不会有太多机会尝试优化任何内容。。。。由于您从表中请求所有列,SQL Server的查询优化器通常会进行表扫描,因为这样会更快

另外:
表扫描
意味着您的表上没有任何集群索引-->选择非常糟糕。您应该在每个实际表上都有一个良好的聚类索引

一旦你有了它(例如在
INT-IDENTITY
列上),你就需要决定你真正需要从该表中选择哪些列。在
Date\u 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
选择日期链接、列1、列2、…列n
来自dbo.Admin_字母A
其中A.Date\u Linked>@StartDate和A.Date\u Linked<@EndDate

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

OMG这太棒了。抱歉,我实际上需要此表中的3列。根据marc_的建议,我在Date_Linked上创建了非聚集索引,包括我需要的列名。现在查询只是执行得很快。现在只需2秒钟即可执行。非常感谢Marc_,谢谢你这么快就给了我一个好答案。