【问题标题】:SQL Server : Improving query performance?SQL Server:提高查询性能?
【发布时间】:2015-11-26 13:36:35
【问题描述】:

我对 SQL Server 查询比较陌生。

我正在尝试编写一个查询,其中显示了我公司的分支机构。我有 3 种方法:

  1. 写一个子查询:

    Select
        (Select branchname 
            from branchtable 
            where branchPK = primarycompanybranchfk
        ) as branchone,
        (Select branchname 
            from branchtable 
            where branchPK = secondarycompanybranchfk
        ) as branchtwo
    from companytable
    
  2. 使用连接:

    Select 
        a.branchname as branchone,
        b.branchname as branchtwo
    from companytable c
    left join branchtable a     
        on a.branchPK = c.primarycompanybranchfk
    left join branchtable b 
        on b.branchPK = c.secondarycompanybranchfk
    
  3. 使用子表的连接:

     Select 
        branchfirst.branchname as branchone,
        branchsecond.branchname as branchtwo
     from companytable c
     left join (
        Select branchPK as prikey,
             branchname as branchname 
        from branchtable
     ) branchfirst 
            on branchfirst.prikey= c.primarycompanybranchfk
    left join (
        Select branchPK as prikey,
            branchname as branchname 
        from branchtable
    ) branchsecond 
        on branchsecond.prikey= c.secondarycompanybranchfk
    

如果我使用第 3 种场景而不是第 2 种场景,或者如果我的分支表包含超过 10 列,反之亦然,是否有任何性能改进?

【问题讨论】:

  • SQL Server 以及其他几个 Microsoft 产品往往有两个与每个版本相关联的不同数字 - 一个是“营销”版本号,近年来一直是年份编号,另一个是另一个是内部版本号(显示在很多地方)。您不应该缩短年份版本号,因为这两个数字不对齐(经常)。例如。 SQL Server 版本 8 被称为“SQL Server 2000”,而“SQL Server 2008”的版本号为 10。
  • 而且 - 顺便说一句 - 还有一个信息:@Damien_The_Unbeliever 如果不使用 @ 符号和他的用户名,将不会收到通知。所以他可能连你的谢意都得不到……
  • @Damien_The_Unbeliever:感谢您提供有关版本号的信息。
  • @Shnugo:注意到先生!谢谢
  • 您好 Gerald,我刚刚查看了您的个人资料。您提出了 18 个问题,但接受的答案不超过 8 个。请在这里看一下:someone-answers。关键是,未被接受的问题永远保持开放。谢谢

标签: sql-server performance sql-server-2008


【解决方案1】:

还有一个提示 :-) 尝试设置每个人都可以复制的示例。使用您自己的表会使这变得更加困难...

在大多数情况下,2 和 3 是相同的,“嵌套列”在这种情况下是最快的:

试试这个并设置“包括执行计划”选项。所以你可以在之后比较执行计划(还有两个变种CROSS APPLY,与2和3完全一样)。

确切发生的事情 - 当然 - 更复杂的场景要复杂得多。这取决于现有的索引和统计信息。

SELECT c.COLUMN_NAME,
    (SELECT t.TABLE_NAME FROM INFORMATION_SCHEMA.TABLES AS t WHERE c.TABLE_NAME=t.TABLE_NAME) AS TABLE_NAME
from INFORMATION_SCHEMA.COLUMNS as c

SELECT c.COLUMN_NAME,t.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS as c
INNER JOIN INFORMATION_SCHEMA.TABLES AS t ON c.TABLE_NAME=t.TABLE_NAME

SELECT c.COLUMN_NAME,t.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS as c
INNER JOIN (SELECT t.TABLE_NAME FROM INFORMATION_SCHEMA.TABLES AS t) AS t ON c.TABLE_NAME=t.TABLE_NAME

SELECT c.COLUMN_NAME,t.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS as c
CROSS APPLY INFORMATION_SCHEMA.TABLES AS t 
WHERE c.TABLE_NAME=t.TABLE_NAME

SELECT c.COLUMN_NAME,t.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS as c
CROSS APPLY (SELECT t.TABLE_NAME FROM INFORMATION_SCHEMA.TABLES AS t WHERE c.TABLE_NAME=t.TABLE_NAME) AS t

【讨论】:

    【解决方案2】:

    在这种情况下,两者将具有相同的性能,因为查询优化器会将两者视为相同的查询。但是,如果您在嵌套查询中有一个过滤器,那么它的作用会更快。

    加入所需数量的数据而不是完整的数据集很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-03
      • 2015-08-01
      • 2019-03-20
      • 1970-01-01
      • 2015-02-18
      • 2022-01-09
      • 2014-03-23
      • 1970-01-01
      相关资源
      最近更新 更多