oracle的索引使用

2021-06-21 07:06:51 字數 2767 閱讀 5413

最近工作要處理一批統計sql,過程中遇到一些問題,在此分享一下

oracle中最常用的索引就兩種:b樹索引和點陣圖索引,這裡就來簡單說下這兩種索引的使用。

b- 樹索引在

oracle

中是乙個通用的索引,在建立索引時它就是預設的索引型別。最多可以包括

32列。

位圖索引

oracle

為每個唯一鍵建立乙個位圖,然後把與鍵值所關聯的

rowid

儲存為位圖。最多可以包括

30列。

一般情況下,大多數使用者都只建立

type

為normal的b-

樹索引,所以對於較低基數的列我們都是不建立索引的,因為

b-樹索引對查詢速度提公升不一定會有改善,甚至會增加

insert

、update

、delete

命令所消耗的時間。

位圖索引在載入表(插入操作)時通常要比

b-樹索引做得好。通常,位圖索引要比乙個低基數(很少不同值)上的

b-樹索引要快

3~4倍,但如果新增的值佔插入行的

70%以上時,

b-樹索引通常會更快一些。當每條記錄都增加乙個新值時,

b-樹索引要比位圖索引快3倍。

建議不要在一些聯機事務處理(

oltp

)應用程式中使用位圖索引。

b-樹索引的索引值中包含

rowid

,這樣oracle

就可以在行級別上鎖定索引。位圖索引被儲存為壓縮的索引值,其中包含了乙個範圍內的

rowid

,因此oracle

必須針對乙個給定值鎖定所有範圍內的

rowid

。這種鎖定可能自阿某些

dml語句中造成死鎖。

select

語句不會受到這種鎖定問題的影響。

位圖索引有很多限制:

1、基於規則的優化器不會考慮位圖索引

2、當執行atler table

語句,並修改包含有位圖索引的列時,會使位圖索引實效

3、位圖索引在索引塊中儲存了索引鍵的值;然而,他們並不能使用者任何型別的完整性檢查

4、位圖索引不能被申明為唯一索引

以上是援引的一些簡單概念,下面是我實際工作中總結出來的:

我要做乙個查詢,涉及兩個表t_sym_dict,t_sym_operlog,表結構分別如下:

其中t_sym_operlog的索引如下:

上面基數比較小的三列建立了點陣圖索引

t_sym_dict的索引如下:

查詢語句如下:

select (select c.dict_name

from t_sym_dict c

where c.dict_typeid = 'sym_cityinfo'

and c.dict_id = t.memo) 分公司, 

t.staff_id 工號

from t_sym_operlog t

where t.operlog_subtype = '103'

and t.obj_type = 'custlinkinfo'

and t.memo = '200'

--  and t.extsys_code = ''

--  and t.staff_id = ''

and t.oper_date >= to_date('20110501000000', 'yyyymmddhh24miss')

and t.oper_date <= to_date('20110530000000', 'yyyymmddhh24miss')

-- order by t.memo, t.oper_date

然後就出現了如下奇怪的現象(索引的建立沒有問題)

1、索引使用正常

2、下面的看不到oper_date索引的使用

3、下面的看不到t_sym_operlog表的索引使用

嘗試的解決的辦法:

對資料表做採集,就是analysis

begin

dbms_stats.gather_table_stats(ownname => 'csid',tabname => 't_sym_operlog_back');

end;

猜測的導致原因:

分析:oracle優化器cbo存在的典型問題:

有時,表明明建有索引,但查詢過程顯然沒有用到相關的索引,導致查詢過程耗時漫長,占用資源巨大,問題到底出在哪兒呢?按照以下順序查詢,基本上能發現原因所在。

結果問題還是未解決

Oracle索引的使用

最近做資料整合,把其他伺服器上的資料抽取到統一資料庫中,為提高速度,考慮採用索引。1.索引分類 a 唯一索引,作用是資料約束,保證資料唯一,還有就是資料索引,提高查詢效率 b 一般索引,只有資料索引的作用,2.唯一索引的建立 create unique index 索引名 on 表名 欄位名 ok,...

oracle 索引使用

管理索引 單例索引 單例索引是基於單個列所建立的索引。create index 索引名 on 表名 列名 復合索引 復合索引是基於兩列或是多列建立的索引。create index emp idx1 on emp ename,job creat index emp idx1 on emp job,en...

小議Oracle索引的使用

索引是由oracle維護的可選結構,為資料提供快速的訪問。準確地判斷在什麼地方需要使用索引是困難的,使用索引有利於調節檢索速度。當建立乙個索引時,必須指定用於跟蹤的表名以及乙個或多個表列。一旦建立了索引,在使用者表中建立 更改和刪除數 據庫時,oracle就自動地維護索引。建立索引時,下列準則將幫助...