繁体   English   中英

带where子句执行的SQL查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM