oracle 索引问题梳理
生活随笔
收集整理的這篇文章主要介紹了
oracle 索引问题梳理
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
索引基礎(chǔ)知識(shí)
索引概念
- 索引是為了加快數(shù)據(jù)的查找而創(chuàng)建的可選數(shù)據(jù)庫對(duì)象
- 索引是建立在表的一列或多列上且進(jìn)行排序的一種結(jié)構(gòu)
- 通過指針快速定位數(shù)據(jù)行的方法,減少CPU和磁盤的I/O
- 索引是由Oracle自動(dòng)使用和維護(hù)的,數(shù)據(jù)更新會(huì)自動(dòng)傳播到所有相關(guān)的索引
- 索引存在雙面性,表面存在過多的索引會(huì)影響到DML語句的性能
索引類型
- 唯一索引
語法:
create unique index idx_name on tab_name (col_name);- 倒序索引
語法:
create index idx_name on tab_name (col_name desc);- 反向健索引
語法:
create index idx_name on tab_name (col_name) reverse;- 函數(shù)索引
語法:
create index idx_name on tab_name (to_char(col_name,’yyyy-mm-dd’));- 位圖索引
語法:
create bitmap index idx_name on tab_name (col_name);獲取sql執(zhí)行計(jì)劃
- 常用方法
索引失效場景
以下場景可能導(dǎo)致使用不上索引
字段不是索引的前導(dǎo)列 字段使用like且%放在前面 字段上存在函數(shù)或者數(shù)值運(yùn)算 查詢謂詞條件使用 is null 或 <> 索引導(dǎo)致執(zhí)行結(jié)果不正確 查詢返回大量數(shù)據(jù) 統(tǒng)計(jì)信息不正確例子
前提:
1.a、b、c都經(jīng)常要被查詢,并且有經(jīng)常a、b、c組合查詢的可能性
2.a列區(qū)分度不大,b和c都有區(qū)分度
思路:
1.分別建單列索引(a)(b)(c),但在大表把所有字段都列為索引顯然不合理,且Oracle限制索引數(shù)32個(gè)
2.(a、b、c)組合索引,a作為先導(dǎo)列區(qū)分度不大,組合索引的第一列非常重要,區(qū)分度越高越靠前。
3.(b、c、a)組合索引,區(qū)分度較小的a只會(huì)徒增索引的開銷
4.(b、c)組合索引,可以覆蓋ab組合查詢,bc組合查詢,但ac組合因?yàn)閏不是組合索引的先導(dǎo)列不能走索引
5.最終(b、c)組合索引+c單列索引是最優(yōu)解
NULL值查詢優(yōu)化
查詢語句
select * from test_tab where status is null;數(shù)據(jù)分布
select count(*),status from test_tab group by status; count(*) status ---------- --------- 1995000 Y 500索引設(shè)計(jì)
create index test_tab_idx1 on test_tab(status) online parallel 4; alter index test_tab_idx1 noparallel;表結(jié)構(gòu)
OBJECT_ID NOT NULL NUMBER OWNER VARCHAR2(20) STATUS VARCHAR2(10) CREATED DATE索引重新設(shè)計(jì)
create index test_tab_idex2 on test_tab(status,object_id) online parallel 4; alter index test_tab_idx2 noparallel;索引熱塊爭用問題
最右單調(diào)增長引起的葉子塊爭用問題
索引的特點(diǎn)是從小到大排好序,因此最右邊的葉子塊存的是最大的值 對(duì)于單調(diào)增長的字段,新插入的一定是最大的值 新插入的最大值必定需要插入最右邊的葉子塊 當(dāng)多個(gè)進(jìn)程并發(fā)插入時(shí),則最右邊的葉子塊成為熱點(diǎn)塊 常見的單向增長字段有序列(sequence)、時(shí)間(sysdate)解決方案
哈希分區(qū)表 哈希分區(qū)索引 反向鍵索引最大值最小值查詢
查詢SQL
select max(object_id) from test_tab where created=to_date('2021-12-12','yyyy-mm-dd');索引設(shè)計(jì)
create index test_tab_idx1 on test_tab(create,object_id) online parallel 4; alter index test_tab_idx1 noparallel;查詢SQL
select max(object_id) as max_id,min(object_id) as min_id from test_tab;object_id 為主鍵索引
優(yōu)化SQL
select (select min(object_id) from test_tab) min_id,(select max(object_id) from test_tab) max_id from dual;優(yōu)化實(shí)例
在日均交易量較平均的情況下,wkdt具有較強(qiáng)區(qū)分度
當(dāng)擴(kuò)大日期范圍,日期的區(qū)分度不能體現(xiàn)
使用常用且比較由區(qū)分度的字段payeracct和payeeacct做組合索引
總結(jié)
以上是生活随笔為你收集整理的oracle 索引问题梳理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle四大索引类型,各种Oracl
- 下一篇: oracle索引index_type,o