- 最后登录
- 2017-5-10
- 在线时间
- 44 小时
- 威望
- 69
- 金钱
- 243
- 注册时间
- 2012-6-26
- 阅读权限
- 50
- 帖子
- 158
- 精华
- 2
- 积分
- 69
- UID
- 530
|
1#
发表于 2013-9-11 18:31:42
|
查看: 2748 |
回复: 1
描述:
在SQL-99中,查询语句增加了WITH子句,可以使相同的子查询在一个sql中只执行一次,另外也可以把复杂的查询简化、增加可读性。
另外,我们知道利用ORACLE的GTT(GLOBAL TEMPORARY)全局临时表、MATERIALIZE VIEW物化视图来提高查询的效率。
其实我们可以通过WITH与未公开的提示(HINT)MATERIALIZE联合使用,在子查询结果记录数不是太多的情况下,取代GTT和物化视图。
materialize这个hint是oracle没有公开的提示,它指示ORACLE CBO在with子句内物化临时表。这在oracle10g之后是没有必要的,但是实际使用with时,如果发现没有被物化,可以用此hint来强制oracle作此处理,使此子查询(临时表)只被处理一次。
结论:
在一定的情况下,我们可以用with与hint materialize结合的方式取代全局临时表和物化视图来提高查询效率,使用情况如下。
1. 当次查询的结果记录数不是太多的情况下,如果结果记录集比较庞大,还是推荐使用GTT,因为那里面可以指定索引等。
2. 查询值和查询过滤条件中如果含有重复执行的表达式,可以用此方式减少一次计算。
3. 相同子查询被多次使用。
参考page:
http://www.remote-dba.net/oracle ... with_sql_clause.htm
http://www.dba-oracle.com/t_materialize_sql_hint.htm
本人对此表示怀疑 因为从执行计划上看 WITH的视图 都是系统临时表,而且多行SQL都利用了. 又如何得知11G没有物化呢?
WITH本身就是共享子查询的结果, 怎可能会被展开和谓词推进呢?
以下本人小小实验 感觉加了提示反而有点慢. 好像该提示是官方非公开的 还望刘大指点迷津 |
|