Oracle支持SELECT语句只扫描表的一部分记录。
这篇简单介绍INDEX扫描的SAMPLE语句。
接着上一篇的例子,在表上建立两个索引:
SQL> CREATE INDEX IND_T_OWNER ON T (OWNER);
索引已创建。
SQL> CREATE INDEX IND_T_ID ON T (OBJECT_ID);
索引已创建。
对于全表扫描使用SAMPLE语句,从执行计划中可以直接看出来:
SQL> SELECT OWNER, OBJECT_ID FROM T SAMPLE (0.01);
OWNER OBJECT_ID
------------------------------ ----------
SYS 4479
PUBLIC 13929
PUBLIC 30919
执行计划
----------------------------------------------------------
Plan hash value: 2767392432
----------------------------------------------------------------------------
|> ----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 115 | 157 (2)| 00:00:02 |
| 1 | TABLE ACCESS SAMPLE| T | 5 | 115 | 157 (2)| 00:00:02 |
----------------------------------------------------------------------------
统计信息
----------------------------------------------------------
1 recursive calls
0 db block gets
73 consistent gets
0 physical reads
0 redo> 527 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
3 rows processed
而对于索引扫描,同样可以利用SAMPLE,不过直接从执行计划中看不出来:
SQL> SELECT OWNER, OBJECT_ID FROM T SAMPLE (1) WHERE WNER = USER;
OWNER OBJECT_ID
------------------------------ ----------
YANGTK 61217
YANGTK 83222
YANGTK 90979
执行计划
----------------------------------------------------------
Plan hash value: 3630032853
-------------------------------------------------------------------------------------------
|> -------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 22 | 506 | 6 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 22 | 506 | 6 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IND_T_OWNER | 22 | | 5 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation> ---------------------------------------------------
2 - access("OWNER"=USER@!)
filter(ORA_HASH(ROWID,0,4124907050,'SYS_SAMPLE',0) 524 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
3 rows processed
但是在执行计划后面显示的过滤信息可以看到SAMPLE的身影:
filter(ORA_HASH(ROWID,0,4124907050,'SYS_SAMPLE',0) SELECT OWNER, OBJECT_ID FROM T SAMPLE (1) WHERE WNER = USER;
OWNER OBJECT_ID
------------------------------ ----------
YANGTK 117836
执行计划
----------------------------------------------------------
Plan hash value: 3630032853
-------------------------------------------------------------------------------------------
|> -------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 22 | 506 | 6 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 22 | 506 | 6 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IND_T_OWNER | 22 | | 5 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation> ---------------------------------------------------
2 - access("OWNER"=USER@!)
filter(ORA_HASH(ROWID,0,1958539417,'SYS_SAMPLE',0) 473 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
对于不指定SEED语句的SAMPLE,每次ORA_HASH函数的种子都是变化的,因此返回的结果每次都不相同。
当指定了SEED后,则种子是固定的,每次返回的结果是确定的:
SQL> SELECT OWNER, OBJECT_ID FROM T SAMPLE (1) SEED (2) WHERE WNER = USER;
OWNER OBJECT_ID
------------------------------ ----------
YANGTK 83220
执行计划
----------------------------------------------------------
Plan hash value: 3630032853
-------------------------------------------------------------------------------------------
|> -------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 22 | 506 | 6 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 22 | 506 | 6 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IND_T_OWNER | 22 | | 5 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation> ---------------------------------------------------
2 - access("OWNER"=USER@!)
filter(ORA_HASH(ROWID,1,3654570532,'SYS_SAMPLE',0) 473 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> SELECT OWNER, OBJECT_ID FROM T SAMPLE (1) SEED (2) WHERE WNER = USER;
OWNER OBJECT_ID
------------------------------ ----------
YANGTK 83220
执行计划
----------------------------------------------------------
Plan hash value: 3630032853
-------------------------------------------------------------------------------------------
|> -------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 22 | 506 | 6 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 22 | 506 | 6 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IND_T_OWNER | 22 | | 5 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation> ---------------------------------------------------
2 - access("OWNER"=USER@!)
filter(ORA_HASH(ROWID,1,3654570532,'SYS_SAMPLE',0) 473 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
用户给出的SEED和Oracle调用ORA_HASH时指定的种子值并不一致,Oracle应该在调用ORA_HASH之前进行了处理。
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com