區域性範圍掃描的靈活應用

Tomthe發表於2011-07-05

區域性範圍掃描的概念:摘自《海量資料庫的解決方案》

能夠實現區域性範圍掃描方式的SQL具有一個非常顯著的特徵,就是不論處理的資料量有多大,始終都能夠確保具有較快的執行速度。也許這句具有魅力的話有些不符合常理,但是對於我們而言,這難道不是我們所追求的目標嗎?

在實現了區域性範圍掃描的瞬間,SQL開始從大量的限制中獲得了自由,但是很明顯在變形之前的SQL中有可能會存在著一些不符合區域性範圍掃描準則的要素,之所以實現了區域性範圍掃描,是因為我們對SQL做了適當變形並使其遵循了區域性範圍掃描的準則。

無法使用區域性掃描的情況:

Group 聚合函式,如sum,avg,count,min,max等。

Order by

Sort

Union

Minux

一、用讀取路徑實現對排序的替代操作。

  test01索引建在object_nameobject_id上。

  整體範圍掃描:

  select t.owner,t.object_name,t.object_type

  from test01 t

 where t.object_type like 'TABLE%'

 order by t.object_name

 

區域性範圍掃描

select /*+ index_desc(t IDX_OBJECTNAME)*/t.owner,t.object_name,t.object_type  --表有別名的必須使用別名,否則hint不會生效的。

  from test01 t

 where t.object_type like 'TABLE%'

 

二、maxmin的區域性掃描:

全域性掃描:

select max(object_id) from test01 where object_type = 'TABLE';

   and t.object_name > ' ';--用該條件才能使用hint提示生效。

 

區域性掃描:

select /*+ index_desc(test01 IDX_OBJECTID)*/

 object_id

  from test01

 where object_type = 'TABLE'

   and object_id > 0  --用該條件才能使用hint提示生效。

   and rownum = 1;

三、FILTER型區域性範圍掃描:

select count(*) into cnt from test01 t where t.object_id > 100;

-----------

if cnt > 0

-------------------

如果只是確認存在與否,沒必要對全部資料進行count

 

 

select 1 into cnt from dual

where exists(

  select 'X' from test01 t where t.object_id > 100

)

if cnt > 0

只要滿足條件就立即返回。

 
待續,,,,,,

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20577218/viewspace-701401/,如需轉載,請註明出處,否則將追究法律責任。

相關文章