[英]Sql query with where clause execution
我有一个查询,如:
(q1)
select a,b,c,d from abc
where param='x'
union
(q2)
select e,f,g,h from abc
where param='y'
我想知道<param>='y'
是否会执行query1 ?? 这是因为Recodset“ abc”非常大,实际查询涉及同一参数上的5-6个并集(您可能会看到一次只需要一个查询数据)。 因此,如果要从所有查询中获取数据并根据where子句进行过滤,则将产生很大的开销,而如果在此之前进行过滤,则实际上只有五分之一的查询会被执行。
谢谢Himanshu
如果你写类似
where 1 = 2
可以在不接触数据库的情况下进行评估,那么Oracle将足够聪明,可以跳过对表的访问。
这甚至应该与绑定变量一起使用。
where ? = ?
当然,一旦涉及到列,就必须去查看数据。
如果“ param”是abc中的一列,则在为该列建立索引时会很有帮助。
但是,对查询性能的最大影响可能是“联合”,因为Oracle必须过滤掉重复的行。 根据结果集的大小,这是一项繁重的操作(排序,删除重复项)。 如果您不关心重复的结果(或者由于查询的定义而根本不可能),请使用“全部联合”:
select a,b,c,d from abc
union all
select e,f,g,h from abc
select *
from (
select 1 INDICATOR,
a, b, c
from abc
union all
select 2 INDICATOR,
a, b, c
from abc)
where indicator = 1;
这将不会在联合中执行第二个查询。 如您在执行计划中看到的,有一个过滤器 ,上面写着“ null不为null”。 但是,许多工会的开销很大。
我认为这是懒惰的编程,您正在尝试使数据库完成应用程序的工作。 您只需要一个带有多个串联的简单“ if”语句。
这个问题向我建议,您要避免对数据集进行两次全表扫描。 这项技术可能会对您有所帮助。
WITH
base AS
(
SELECT a,b,c,d,e,f,g,h FROM abc -- all columns of interest
WHERE param IN ('x', 'y') -- all rows of interest
),
q1 AS
(
select a,b,c,d from base -- one specific subset
where param='x'
),
q2 AS
(
select e,f,g,h from base -- the other specific subset
where param='y'
)
SELECT a,b,c,d FROM abc -- then the union of the sets
UNION
SELECT e,f,g,h FROM abc -- that you are interested in.
当您在参数上进行查找时,索引将具有很大的价值,从而可以用成本较低的INDEX扫描代替FULL TABLE SCAN。
如果参数中的一组不同值很小,则构建直方图可能会有所帮助。
与Oracle一样,您的工作量可能会有所不同。
我想听听一切对您有帮助。
正如其他人指出的那样,在评估了绑定变量之后,Oracle将从查询中删除无效代码分支。 您可以将联合替换为“全部联合”(无论如何都不重要),但是开发人员的意图会更清楚地显示出来(我,开发人员希望此处没有重复的对象)。
一个开放的问题(无论如何对我来说)是:您是否可以确定“ a”的数据类型与“ e”匹配,而“ b”的数据类型与“ f”匹配等等?
实际上,我自己从来没有实现过,只是阅读了一下,所以有人想验证我的意思。 但是,完全不同的方法可能是创建一个使用参数的存储过程。 该过程将为每个参数期望值有一个光标。 然后,您可以测试(IF)参数的值并返回ref游标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.