连接表中的列数是否影响或影响性能

时间:2016-11-04 09:52:29

标签: sql sql-server performance join derived-table

我有“BigTable”表,它有大约80列但我需要生成一个“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   

2 个答案:

答案 0 :(得分:0)

使用子查询完全没有区别。

SQL Server有一个很好的优化器。优化器执行的操作之一是,一旦开始将页面数据加载到工作内存中,就从数据页中选择所需的列。事实上,SQL Server通常会将列上的表达式推送到此阶段。

没有理由在没有必要的情况下放置这样的子查询。

答案 1 :(得分:0)

希望您的数据库设计符合您的要求。 希望您正确处理您的要求。 这两个是最基本的东西。

试试这个,如果这个查询足够快,你可以考虑创建索引等。 顺便说一句,知道“ somecondition ”是编写正确查询所必需的。

 UPDATE bt
    SET bt.UpdateColumn = bt.UpdateColumn + 0.01                      
    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   
    where bt.RankField<=SomeCondition