【问题标题】:Does number of columns in a join table matter or affect performance连接表中的列数是否重要或影响性能
【发布时间】: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


【解决方案1】:

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

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

没有理由将这样的子查询放在不需要的地方。

【讨论】:

  • 对不起,我的错不是子查询,而是派生表(这有什么不同吗?)。此外,我需要在更新中使用排名字段。那么有没有更好的办法呢?
  • @Prakazz 。 . .他们是一样的东西。是的,完全一样。优化器非常聪明。
【解决方案2】:

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

试试这个,如果这个查询足够快那么你可以考虑创建索引等。 顺便说一句,知道“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多