SQL联合子句优化

Posted

技术标签:

【中文标题】SQL联合子句优化【英文标题】:SQL Union Clause Optimization 【发布时间】:2017-07-10 20:57:16 【问题描述】:

如果我的查询如下,我该如何优化它以更快地运行? thingstables 是不变的。 different_tables 是另一组表。

Select * from (
    select things from tables where condition 1
    Union
    select things from tables where condition 2
    union
    select things from tables where condition 3
    union
    select things from different_tables where condition 4
    union 
    select things from different_tables where condition 5
)

【问题讨论】:

如果tables 是一张表,different_tables 是同一张表,您可以在条件中使用 OR。 select things from tables where condition 1 or condition 2 or condition 3 UNION select things from different_tables where condition 4 or condition 5 您的 Oracle 版本与此处相关。 12c 为 union all 查询提供了一个新的 concurrent parallel execution 功能。你需要union,或者你可以用union all吗? 您需要做的第一件事是查看比其他操作花费更长的行源操作 (RSO)。如果你幸运的话,你会发现像延迟过滤这样的低悬的果实。您用于查看 RSO 的工具取决于您的许可证。免费提供的一件事是扩展的 SQL 跟踪。但是找到一个易于理解 RSO 的分析器是关键。有一个简单的解决方法可能是真的。但是,您可能还有很长的优化之路。追踪它并知道。不要猜测。 这是一个不可能回答的问题。它太模糊了。性能调优与细节有关:数据量、数据倾斜、可用索引、业务规则等。显然,您可能出于保密原因混淆查询,但除非您可以发布特定内容,否则我们无法帮助您。互联网上充斥着关于解决调优问题的一般文章。你需要开始谷歌搜索。 Select * from ( select things from tables where condition 1 AND condition 2 AND condition 3 union select things from different_tables where condition 4 AND condition 5 ) -> 鉴于提供的信息,这是最优化的方法。此外 - 这取决于实际的表、其中的数据以及加入 tablesdifferent_tables 表的任何其他可能方式。此外,根据用例,您可以将查询具体化并将其放在一个平面表中,或者将其插入到一个表中,这样您就可以更快地访问它。 【参考方案1】:

为什么会有这么多工会?

首先,我们可以通过使用IN() 语句来显着减少联合的数量。仅此操作即可为您节省大量开销。它实际上相当于使用一系列or 条件,但它更容易读写。

select * from (
  select things from tables where condition in (1,2,3)
  union
  select things from different_tables where condition in (4,5)
)

条件是否已编入索引?

如果condition没有被索引,你应该考虑索引它。


为什么是派生表?

在您发布的示例中,没有理由使用派生表,只需使用

select things from tables where condition in (1,2,3)

union

select things from different_tables where condition in (4,5)

应该够了


一个带有更复杂的where 子句的示例。

select 
  things 
from 
  tables 
where 
  condition_1 in (1,2,3)
  or condition_2 = 4
  or (
    condition_1     = 1
    and condition_3 = 5
  )

上面的示例显示了一个查询,如果满足三个主要条件中的任何一个,它将提取记录。如果您在同一张表上进行操作,您应该仍然可以合并您的查询。

【讨论】:

只是一个(明显的)注释:in 用于根据一组值检查单个列的值。在答案中,第一个查询将检查 condition 列的值是 1、2 还是 3。in 不能用于做多重检查等。例如,你不能做 @987654331 @。不清楚 OP 对 SQL 的舒适程度,所以我想指出这一点。 还在学习中,感谢帮助。这些条件中的每一个都有多个检查并结合其他条件,您对此有什么建议吗? @VarunRajagopal:当然,使用or 声明。 @RobbieToyota:我没想澄清这一点。感谢您的意见。 @VarunRajagopal:如果这回答了您的问题,请考虑接受答案 :)

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

mysql 多表联合查询啥用

怎样使数据库中的多表实现联合查询

SQL多个表联合查询优化的问题

优化联合 sql 查询

SQL优化案例分享--联合索引

联合查询sql注入