SQL联合子句优化
Posted
技术标签:
【中文标题】SQL联合子句优化【英文标题】:SQL Union Clause Optimization 【发布时间】:2017-07-10 20:57:16 【问题描述】:如果我的查询如下,我该如何优化它以更快地运行? things
、tables
是不变的。 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 )
-> 鉴于提供的信息,这是最优化的方法。此外 - 这取决于实际的表、其中的数据以及加入 tables
和 different_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联合子句优化的主要内容,如果未能解决你的问题,请参考以下文章