子查询的 SQL 查询优化

Posted

技术标签:

【中文标题】子查询的 SQL 查询优化【英文标题】:SQL query optimization for subqueries 【发布时间】:2013-05-10 18:40:10 【问题描述】:

我正在尝试加快存储过程,并有以下子查询:

    SELECT
    ...
        ISNULL((SELECT Table1.Order WHERE Table2.STATUS <> 'R'),0) AS 'Order',
        ISNULL((SELECT Table1.Order WHERE Table2.STATUS = 'R'),0) AS 'Reject',
    ...
FROM Table1
LEFT JOIN
Table2
ON Table1.KEY=Table2.KEY

有没有办法更有效地编写上述内容?

我在想一个 IF 语句什么的,但不太清楚如何写。

我问这个是因为我读到最好尽量减少子查询以提高性能。

【问题讨论】:

这是有效的语法吗?子查询中的 FROM 在哪里? 请提供完整有效的查询。 你为什么选择它作为两个单独的列? "...我读到最好尽量减少子查询以提高性能。" 您希望更改会有所帮助。希望不能很好地扩展。改为学习阅读execution plan。 @MartinSmith 哦,太恶心了。现在我们如何忘记这一点。 【参考方案1】:

尝试使用 CASE WHEN:

SELECT 
       /* ... */
       [Order] = CASE
                   WHEN t2.STATUS <> 'R' THEN t1.[Order]
                   ELSE 0
                 END,
       Reject = CASE
                  WHEN t2.STATUS = 'R' THEN t1.[Order]
                  ELSE 0
                END
       /* ... */                
FROM   Table1 t1
       LEFT JOIN Table2 t2
         ON t1.[KEY] = t2.[KEY] 

【讨论】:

+1 但请不要将 'single quotes' 用作别名 - 某些形式的此类已被弃用,这使它们看起来非常像字符串文字。 [square brackets] 是首选。 @Mike - 谢谢,这就是我要找的东西!...感谢大家的意见。【参考方案2】:

您可以尝试对 SQL Server 使用 oracle "UNION" 等效项。我曾在 Oracle 10g 上工作过,您可以像这样使用,

SELECT Table1.Order 
FROM Table1, Table2 
WHERE Table2.STATUS <> 'R' and Table1.id=Table2.id

UNION or UNION ALL

SELECT Table1.Order 
FROM Table1, Table2 
WHERE Table2.STATUS = 'R' and Table1.id=Table2.id

我不确定这是否对您有所帮助...!总之……

【讨论】:

以上是关于子查询的 SQL 查询优化的主要内容,如果未能解决你的问题,请参考以下文章

查询优化,(子查询)(sql-transact)

如何优化此 SQL Server 查询 - 多个子查询

使用子查询优化 SQL 查询

MySQL5.7性能优化系列——SQL语句优化——使用物化策略优化子查询

SQL 优化器/执行计划 - 重复子查询

有关优化此多层(具有多层子查询)SQL 查询的提示