为什么没有索引这个查询更快?

spi*_*non 5 sql t-sql sql-server-2008 query-performance

我继承了一个新系统,我试图对数据进行一些改进.我正在努力改进这个表,似乎无法理解我的发现.

我有以下表结构:

CREATE TABLE [dbo].[Calls](
    [CallID] [varchar](8) NOT NULL PRIMARY KEY,
    [RecvdDate] [varchar](10) NOT NULL,
    [yr] [int] NOT NULL,
    [Mnth] [int] NOT NULL,
    [CallStatus] [varchar](50) NOT NULL,
    [Category] [varchar](100) NOT NULL,
    [QCall] [varchar](15) NOT NULL,
    [KOUNT] [int] NOT NULL)
Run Code Online (Sandbox Code Playgroud)

该表中有大约220k的记录.我需要返回日期大于特定日期的所有记录.在这种情况下12/1/2009.此查询将返回大约66k记录,运行大约需要4秒.从我过去的系统来看,这似乎很高.特别是考虑到表中的记录很少.所以我想把时间缩短.

所以我想知道什么是一些好的方法来降低它?我尝试在表中添加日期列并将字符串日期转换为实际日期列.然后我在该日期列添加了索引,但时间保持不变.鉴于没有那么多记录,我可以看到表扫描如何快速但我认为索引可以减少时间.

我还考虑过查询月份和年份列.但我还没有尝试过.如果可能的话,我希望将其保留在日期栏之外.但如果不是,我可以改变它.

任何帮助表示赞赏.

编辑:这是我试图运行的测试并测试表的速度.我通常把列放出来,但为了简单起见,我使用了*:

SELECT *
FROM _FirstSlaLevel_Tickets_New
WHERE TicketRecvdDateTime >= '12/01/2009'
Run Code Online (Sandbox Code Playgroud)

编辑2:所以我提到我曾尝试使用包含recvddate数据的日期列创建一个表,但是作为日期而不是varchar.这就是TicketRecvdDateTime列在上面的查询中.我对这个表运行的原始查询是:

SELECT *
FROM Calls
WHERE CAST(RecvdDate AS DATE) >= '12/01/2009'
Run Code Online (Sandbox Code Playgroud)

Ran*_*der 5

您可能会遇到 SQL Server 中所谓的临界点。即使您在列上有适当的索引,如果返回的预期行数超过某个阈值(“临界点”),SQL Server 仍可能决定执行表扫描。

在您的示例中,这似乎很可能,因为您正在转动数据库中行数的 1/4。以下是一篇很好的文章,解释了这一点:http://www.sqlskills.com/BLOGS/KIMBERLY/category/The-Tipping-Point.aspx