转换ROW_NUMBER列会影响性能

时间:2015-10-15 03:41:48

标签: sql sql-server sql-server-2008

我需要知道在将从ROW_NUMBER窗口函数生成的列转换为特定数据类型时,为什么会出现性能差异的原因。

示例:

WITH MyCte AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY ID ASC) AS rownumber, * FROM (
        SELECT DISTINCT * FROM (
            SELECT 
                j.*, 
                -- Other columns here
            FROM Table j 
                -- Join to other tables here
)

 -- Filter records
SELECT  *
FROM    MyCte
WHERE CONVERT(INT, rownumber) BETWEEN CONVERT(INT, 40000) AND  CONVERT(INT, 40010)

如果我首先将rownumber列转换为INT,它将只执行最多3秒,这是理想的。

WHERE CONVERT(INT, rownumber) BETWEEN CONVERT(INT, 40000) AND  CONVERT(INT, 40010)`

但如果我不转换它,将花费将近1分钟来执行查询。

WHERE rownumber BETWEEN CONVERT(INT, 40000) AND  CONVERT(INT, 40010)

任何人都可以告诉我这背后的概念是什么?

2 个答案:

答案 0 :(得分:3)

ROW_NUMBER()函数返回bigint数据类型的值,常量40000返回int

由于数据类型的这种差异(是的,甚至是intbigint),sql-server无法正确估计死亡率并选择不是最佳执行计划。

您应该在实际执行计划中看到它。

答案 1 :(得分:1)

ROW_NUMBER()返回BIGINT。 当查询执行时,如果列的值不正确,它将尝试转换true格式值。

请参阅Predicates了解详情。