SQL优化 - 冗余布尔逻辑

时间:2017-09-20 13:56:37

标签: sql oracle

DB是Oracle 11g,如果这很重要的话。我有一个带有long where子句的查询 - 由三个中等大小的子块组成(显然必须全部评估为true)。但是,对于两个子块,每个语句都只是通过AND连接。因此,对于每个这样的子块,前面的AND,一个左括号和一个右括号是多余的。会删除这些会改善我查询的执行时间吗?

select * from tbl 
where 1=1 AND (x OR y OR (w AND z))
AND (a AND b AND c)
AND (d AND e AND f);

select * from tbl 
where 1=1 AND (x OR y OR (w AND z))
AND a AND b AND c
AND d AND e AND f;

显然这些查询会返回相同的记录,但执行时间有何不同?

1 个答案:

答案 0 :(得分:1)

看起来您的代码类似于:

<RequireAll>
Require all granted
Require not ip 1.0.1.0/24
Require not ip 1.0.2.0/23
Require not ip 1.0.8.0/21
Require not ip 1.0.32.0/19
Require not ip 1.1.0.0/24
Require not ip 1.1.2.0/23
Require not ip 1.1.4.0/22
:

在这种情况下,当然有些括号是多余的,即它可以改写为:

where (a = 1 and b = 2 and c = 3)
  and (d = 4 and e = 5 and f = 6)
  and (g = 7 or h = 8 or i = 9)

然而,两个查询之间的性能没有差异,因为它们在语义上是相同的。