【发布时间】:2016-11-04 09:52:28
【问题描述】:
我有大约 80 列的表“BigTable”,但我需要生成一个“Rank”列,我将在更新期间使用它。我的查询现在看起来像这样。
UPDATE bt
SET bt.UpdateColumn = CASE WHEN (SomeCondition >= bt.RankField)
THEN bt.UpdateColumn + 0.01
ELSE bt.UpdateColumn
END
FROM (SELECT bt.*,RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS RankField FROM BigTable bt) bt
INNER JOIN AnotherTable atbl
ON bt.Col1 = atbl.Col2
如果我把我的代码改成这样会更好。在连接期间,派生表中的列数是否重要。
UPDATE bt
SET bt.UpdateColumn = CASE WHEN (SomeCondition >= bt.RankField)
THEN bt.UpdateColumn + 0.01
ELSE bt.UpdateColumn
END
FROM (SELECT bt.Col1,RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS RankField FROM BigTable bt) bt
INNER JOIN AnotherTable atbl
ON bt.Col1 = atbl.Col2
【问题讨论】:
-
如果您担心性能问题,请测试添加索引是否有帮助。加入索引字段将显着提高性能。增加您加入的表的数量将不可避免地减慢结果检索 - 这就是为什么,i.m.o.我们需要始终优化我们的连接和表索引。
标签: sql sql-server performance join derived-table