任何人都可以告诉我,如果它对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。表中有几十万行(实际上它是一个视图)。
感谢您的任何建议。
答案 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)
我 可能 工作正常,即第二个查询可能具有与第一个查询相同的影响性能/资源,在当前的实现中甲骨文
从不如此,我不会依赖这种类型的东西,特别是当它只是简化查询构建逻辑时。实际上,根据具体的业务规则和底层数据模型,您可能会考虑使用装饰器模式(甚至是实现它的替代方法)的几种替代方法。