SQL用实际表替换cte以提高性能?

时间:2019-07-02 15:51:14

标签: sql sql-server

#temp(NrBL, LgnBL)上有一个索引。但是在SQL Server 2016中,无法对常用表表达式建立索引。使用另一个临时表而不是CTE并在(NrBL, LgnBL)上对其进行索引会更快吗?

WITH cte (NrBL, LgnBL, clientNr) AS 
(
    SELECT NrBL, LgnBL, clientNr
    FROM #temp
    WHERE Niveau=0
)
UPDATE a
SET a.ClientNr = cte.ClientNr
FROM #temp AS a
JOIN cte ON a.NrBL=cte.NrBL AND a.LgnBL = cte.LgnBL;

2 个答案:

答案 0 :(得分:2)

我认为具有窗口功能的可更新CTE是最好的方法:

import Foundation
struct Game {
    var word:String
    var incorrectMovesRemaining:Int
    var guessedLetter: [Character]

    mutating func playerGuessed(letter: Character) {
        guessedLetter.append(letter)
        if !word.characters.contains(letter) { // 'characters' is unavailable: Please use String directl
             incorrectMovesRemaining -= 1
        }
    }
}

您可以在WITH cte (NrBL, LgnBL, clientNr) AS ( SELECT t.*, MAX(CASE WHEN Niveau = 0 THEN clientNr END) OVER (PARTITION BY NrBL, LgnBL) as new_clientNr FROM #temp t ) UPDATE cte SET ClientNr = new_ClientNr WHERE new_clientNR IS NOT NULL; 上创建索引。

答案 1 :(得分:1)

使用临时表可能会有所帮助(查询优化器有时会使您感到惊讶),但是我发现临时表更有可能使事情变得更糟。

是正确的,您不能为CTE建立索引...但是,这并不意味着索引不会用于查询。 CTE的源表上仍然有索引,这些索引对于您的完整查询仍然有帮助。使用临时表,您肯定必须同时填充整个表和索引。