假设您有一个PL / SQL函数,它返回一些随机值,您将在SQL语句中将其用作返回数据和Order by子句.
现在,您可以用三种“不同”的方式编写Order by子句:
按索引
Select Foo,MyFunction(Foo) orderField From FooTable Order By 2
通过调用“再次”功能
Select Foo,MyFunction(Foo) orderField From FooTable Order By MyFunction(Foo)
通过使用订单字段别名
Select Foo,MyFunction(Foo) orderField From FooTable Order By orderField
第三种方法是可能的,因为Order By子句是要解析的select的最后一个,然后Oracle已经知道别名.
我的问题是,这三个查询的处理或性能有什么不同吗?特别是,第二个意味着是否会再次评估MyFunction调用?
我试图通过搜索文档来查找,并通过运行Toad的一些查询以及查看解释计划,但直到现在才发现任何重大差异.
我的Oracle版本是11.2.0.3.0,如果这有任何问题.
在这种情况下检查发生了什么的好方法是使用序列(但我有oracle版本12.1).例如:
SQL> create sequence func_seq; Sequence created. SQL> create or replace function foo return number is begin return func_seq.nextval; end; / Function created.
首先,创建一个返回两行的查询(不带ORDER BY子句)并检查sequence的值:
SQL> select foo from dual connect by level <= 2; FOO ---------- 1 2 SQL> select func_seq.currval from dual; CURRVAL ---------- 2
然后使用ORDER BY进行查询:
SQL> select foo from dual connect by level <= 2 order by foo; FOO ---------- 3 4 SQL> select func_seq.currval from dual; CURRVAL ---------- 4
在这两种情况下,功能执行了2次.
但是如果你的函数需要参数,你必须注意它们的值:
SQL> create or replace function foo(p number) return number is begin return func_seq.nextval; end; / Function created.
使用不同的参数进行查询:
SQL> select foo(1) from dual connect by level <= 2 order by foo(2); FOO(1) ---------- 6 8 SQL> select func_seq.currval from dual; CURRVAL ---------- 8
我们可以看到,函数执行了4次.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。