2015-10-15 117 views
2

我需要知道爲什麼在將從ROW_NUMBER窗口函數生成的列轉換爲某種數據類型時性能差異很大的原因。轉換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) 

任何人都可以給我這是什麼概念?

回答

3

ROW_NUMBER()函數返回值bigint數據類型和常量40000返回int

由於數據類型存在差異(是的,即使是intbigint)sql-server也無法正確估計carnality並選擇非最優執行計劃。

您應該在實際的執行計劃中看到它。

+1

很好的解釋,我沒有想過,謝謝! – Sherlock

1

ROW_NUMBER()返回BIGINT。 當查詢執行時,如果列的值不正確,它會嘗試轉換真正的格式值。

請參閱Predicates瞭解更多信息。

+0

謝謝,加上一個用於謂詞鏈接 – Sherlock