在执行连接时选择所有列或仅选择所需的列,哪个对性能更好?

gau*_*v b 2 sql sql-server ssis sql-server-2008

我被要求对一个 SQL Server 查询进行性能调优,该查询中有很多连接。

例如

LEFT JOIN 
    vw_BILLABLE_CENSUS_R CEN ON DE.Client = CEN.Client
                             AND CAL.REPORTING_MONTH = CEN.REPORTING_MONTH
Run Code Online (Sandbox Code Playgroud)

几乎有 25 个列vw_Billing_Cenus_R,但我们只想使用其中的 3 个。所以我想知道,如果我只选择所需的列,然后像这样执行联接,而不是从视图或表中选择所有列

LEFT JOIN (SELECT [Column_1], [Column_2], [Column_3] 
           FROM vw_BILLABLE_CENSUS_R) CEN ON DE.Client = CEN.Client
                                          AND CAL.REPORTING_MONTH = CEN.REPORTING_MONTH
Run Code Online (Sandbox Code Playgroud)

那么这会提高性能吗?

EzL*_*zLo 5

重要的部分是您在最外面实际使用的列SELECT,而不是选择加入的列。SQL Server引擎足够聪明,能够意识到如果不需要的话,他不需要从引用的表(或视图)中检索所有列。

因此以下两个查询应该产生完全相同的查询执行计划:

SELECT
    A.SomeColumn
FROM
    MyTable AS A
    LEFT JOIN (
        SELECT
            *
        FROM
            OtherTable AS B) AS X ON A.SomeColumn = X.SomeColumn

SELECT
    A.SomeColumn
FROM
    MyTable AS A
    LEFT JOIN (
        SELECT
            B.SomeColumn
        FROM
            OtherTable AS B) AS X ON A.SomeColumn = X.SomeColumn
Run Code Online (Sandbox Code Playgroud)

区别在于您是否实际使用所选列(在条件 where 或实际检索值中),如下所示:

SELECT
    A.SomeColumn,
    X.* -- * has all X columns
FROM
    MyTable AS A
    LEFT JOIN (
        SELECT
            B.*
        FROM
            OtherTable AS B) AS X ON A.SomeColumn = X.SomeColumn


SELECT
    A.SomeColumn,
    X.* -- * has only X's SomeColumn
FROM
    MyTable AS A
    LEFT JOIN (
        SELECT
            B.SomeColumn
        FROM
            OtherTable AS B) AS X ON A.SomeColumn = X.SomeColumn
Run Code Online (Sandbox Code Playgroud)