Use index_desc

June 28th, 2009 | Categories: Boring | Tags:

常见的例子,表中记录按照creation_date作purge,且该字段上有个索引。

如果不加index_desc hint,purge job执行时间长了可能会越来越慢。如下consistent read明显要比current read多很多。是因为Index range scan从index tree的最左面开始扫描,扫描了很多空块。

SQL> DELETE FROM  vltb_data_0   where creation_date < (SYSDATE - 3)  and rownum < 1000;
999 rows deleted.

———————————————————-
| Id  | Operation          | Name                        |
———————————————————-
|   0 | DELETE STATEMENT   |                             |
|   1 |  DELETE            | RULE_OBJECT_ATTR_DATA_0     |
|*  2 |   COUNT STOPKEY    |                             |
|*  3 |    INDEX RANGE SCAN| RULE_OBJECT_ATTR_DATA_0_IX3 |
———————————————————-
Predicate Information (identified by operation id):
—————————————————
2 - filter(ROWNUM<1000)
3 - access(”CREATION_DATE”<SYSDATE@!-3)

Statistics
———————————————————-
1  recursive calls
21167  db block gets
427848  consistent gets

0  physical reads
1341824  redo size
1  sorts (memory)
0  sorts (disk)
999  rows processed

通过添加index_desc, Index range descending scan从index tree的中间或者右边进入扫描,更快定位到存在纪录的block.

SQL> DELETE /*+ index_desc(rule_object_attr_data_0) */ FROM  vltb_data_0   where creation_date < (SYSDATE - 3)  and rownum < 1000;
999 rows deleted.

Statistics
———————————————————-
1  recursive calls
21177  db block gets
59  consistent gets
288  physical reads
1368592  redo size
814  bytes sent via SQL*Net to client
833  bytes received via SQL*Net from client
3  SQL*Net roundtrips to/from client
1  sorts (memory)
0  sorts (disk)
999  rows processed

从而避免了无用功。这样的例子时常在工作中遇到。

—————-人工分割线————————

最近上海一个刚盖的差不多快结盘的13层房子倒了一个,整体倒的。是有一个小的房地产开发公司开发的。全国人民都知道了。

估计会对房地产市场特别是中小房地产开发公司开发的楼盘带来严重信任危机。那些早些年盖的二手房或许将火爆。

很壮观。



Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
  1. tp
    October 22nd, 2009 at 22:02
    Quote | #1

    这种情况应该是数据分布不均匀或者是有特殊数据存在造成的,index rang scan时定位第一块应该很快,但是第一块和后续连接的块之间有很多空块造成的,而不是定位第一块的问题。