表#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;
答案 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的源表上仍然有索引,这些索引对于您的完整查询仍然有帮助。使用临时表,您肯定必须同时填充整个表和索引。