1

WH.dbo.vw_FactTable是一个巨大的表 100mill 行具有良好的索引DateKey

这几乎是瞬间运行的:

1.

SELECT  COUNT(*)
FROM    WH.dbo.vw_FactTable bi
WHERE   DateKey >= 20130101 AND
        DateKey <= 20130110 

这需要两分钟:

2.

SELECT  COUNT(*)
FROM    WH.dbo.vw_FactTable bi
WHERE   CONVERT(DATETIME,CONVERT(CHAR(8),DateKey,112)) >= '01 JAN 2013' AND
        CONVERT(DATETIME,CONVERT(CHAR(8),DateKey,112)) <= '10 JAN 2013' 

为什么如此不同?

执行计划完全不同 -1似乎选择Merge Join

在此处输入图像描述

2对于哈希匹配:

在此处输入图像描述

有没有明显的方法来调整查询2

4

2 回答 2

2

在第二个查询中,由于您使用 where 子句 (Convert) 中的函数,因此在运行时评估此函数的结果,SQL Server 查询引擎必须扫描整个表以获取必要的数据。

于 2013-08-30T17:22:08.000 回答
2

人们已经在评论中击中了它,重组字段中性索引,这将与您的第一个查询类似:

SELECT  COUNT(*)
FROM    WH.dbo.vw_FactTable bi
WHERE   DateKey BETWEEN CAST(CAST(REPLACE(CAST('01 JAN 2013' AS DATE),'-','')AS VARCHAR(12))AS INT)
                    AND CAST(CAST(REPLACE(CAST('10 JAN 2013' AS DATE),'-','')AS VARCHAR(12))AS INT)
于 2013-08-30T17:27:59.103 回答