Oracle Query中的子选择

时间:2009-11-11 16:11:23

标签: performance oracle decorator

任何人都可以告诉我,如果它对Oracle 10g有用,是否使用:

SELECT col1 FROM myTable WHERE col2 = 'someval' AND col3 = "someotherval"

SELECT col1 FROM
    SELECT col1, col2, col3 FROM (
        SELECT * FROM myTable
    ) WHERE col2 = 'someval'
) WHERE col3 = "someotherval"

根据解释计划,上述费用是相同的,但在性能测量方面我是一个空白。

背景是:在我的应用程序中,我有几个基本查询,我需要在运行时通过任意标准进行修改,以便为不同的客户端提供数据集。 WHERE条件和获取的列特定于客户端配置文件,有些配置可能需要查看col2,而其他配置查看col5,依此类推。此外,用户可以在客户端配置之上添加其他条件和列。我正在考虑使用一组装饰器来实现这一点,所以如果上面的性能相同,我可以将所有三个查询部分完全分开。

这是Oracle 10g。表中有几十万行(实际上它是一个视图)。

感谢您的任何建议。

3 个答案:

答案 0 :(得分:6)

一般而言,Oracle的基于成本的优化器将合并包含视图的查询(或您的案例中的内嵌视图,这基本上是相同的事情),作为优化的查询转换阶段的一部分。

这称为“视图合并”,并将您的第二个查询转换为第一个查询。在某些情况下,无法执行完整视图合并,但即使这样,也可以允许“谓词推送”,因此性能会提高。

http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i37745

另见:

http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i37745 http://www.oracle.com/pls/db102/to_URL?remark=ranked&urlname=http:%2F%2Fdownload.oracle.com%2Fdocs%2Fcd%2FB19306_01%2Fserver.102%2Fb14200%2Fsql_elements006.htm%23SQLRF50908 http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams142.htm#REFRN10141 http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements006.htm#SQLRF50706

长话短说,你不应该有问题。

答案 1 :(得分:3)

我事先不会过分担心。在优化方面,Oracle总体上非常复杂,所以我相信它不会被嵌套查询搞糊涂。你想要做的事情听起来很复杂,所以你应该首先让它运行,然后快速(如果它的性能不够好)。

记住:

  

“过早优化是所有邪恶的根源。” - 唐纳德克努特

答案 2 :(得分:1)

可能 工作正常,即第二个查询可能具有与第一个查询相同的影响性能/资源,在当前的实现中甲骨文

从不如此,我不会依赖这种类型的东西,特别是当它只是简化查询构建逻辑时。实际上,根据具体的业务规则和底层数据模型,您可能会考虑使用装饰器模式(甚至是实现它的替代方法)的几种替代方法。