我需要知道在将从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)
任何人都可以告诉我这背后的概念是什么?
答案 0 :(得分:3)
ROW_NUMBER()
函数返回bigint
数据类型的值,常量40000
返回int
。
由于数据类型的这种差异(是的,甚至是int
和bigint
),sql-server无法正确估计死亡率并选择不是最佳执行计划。
您应该在实际执行计划中看到它。
答案 1 :(得分:1)
ROW_NUMBER()返回BIGINT。 当查询执行时,如果列的值不正确,它将尝试转换true格式值。
请参阅Predicates了解详情。