【问题标题】:SQL performance - Filtering on query before or after unionsSQL 性能 - 在联合之前或之后过滤查询
【发布时间】:2016-06-25 17:27:29
【问题描述】:

我的查询如下所示:

SELECT PersonId,
       Note,
       Amount
FROM Table1 A
WHERE A.PersonId = @PersonId

UNION 

SELECT PersonId,
       Note,
       Amount
FROM Table2 B
WHERE B.PersonId = @PersonId

UNION 

SELECT PersonId,
       Note,
       Amount
FROM Table3 C
WHERE C.PersonId = @PersonId

现在,这个查询最终会返回数千个结果,所以我想构建性能最好的查询。我想知道这是否比在联合之后过滤 PersonId 更有效:

SELECT * FROM 
(
SELECT PersonId,
       Note,
       Amount
FROM Table1 A

UNION 

SELECT PersonId,
       Note,
       Amount
FROM Table2 B

UNION 

SELECT PersonId,
       Note,
       Amount
FROM Table3 C
) A
WHERE A.PersonId = @PersonId

【问题讨论】:

    标签: c# query-performance


    【解决方案1】:

    首先,您将拥有一个查询优化器。
    速度上不会有差异,因为PersonId在显示层。
    查询优化器将更改显示参数的执行顺序,以使参数数量最少。
    因此,两个查询的速度将相等。
    如果你有兴趣,可以在你的 SQL 开发者那里看到这个执行计划。

    【讨论】:

    • 连接会不会一样?加入每个查询而不是最后?
    • 在您的 sql 开发人员中亲自尝试。比较两者,你就会得到你的结果。据我认为加入可能会更快。我认为查询优化器会将您的联合查询重建为连接查询。所以加入会更快。但是为什么你的 PersonID 不是主键呢?
    猜你喜欢
    • 2012-05-27
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    相关资源
    最近更新 更多