日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 索引问题梳理

發(fā)布時(shí)間:2023/12/31 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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語句的性能

索引類型

  • 唯一索引
保證在定義索引的列中沒有重復(fù)值 Oracle自動(dòng)在表的主鍵列上創(chuàng)建唯一索引 唯一索引對(duì)應(yīng)的字段上可以插入null值

語法:

create unique index idx_name on tab_name (col_name);
  • 倒序索引
鍵值在索引上是倒敘存放的(由大到小)

語法:

create index idx_name on tab_name (col_name desc);
  • 反向健索引
反轉(zhuǎn)索引列鍵值的每個(gè)字節(jié),比如:1234 1235 反轉(zhuǎn)后:4321 5321 通常建立在值是連續(xù)增長的列上,防止索引在最右側(cè)的葉子塊爭用

語法:

create index idx_name on tab_name (col_name) reverse;
  • 函數(shù)索引
基于一個(gè)或多個(gè)列上的函數(shù)或者表達(dá)式創(chuàng)建的索引 通常會(huì)有額外的一些開銷,比如空間、性能,但總體可控。

語法:

create index idx_name on tab_name (to_char(col_name,’yyyy-mm-dd’));
  • 位圖索引
一個(gè)鍵值存儲(chǔ)指向多行數(shù)據(jù)的指針,可以存儲(chǔ)null值 適合創(chuàng)建在低基數(shù)(cardinality)列上,但不適合頻繁修改的列、多個(gè)會(huì)話并發(fā)修改的表

語法:

create bitmap index idx_name on tab_name (col_name);

獲取sql執(zhí)行計(jì)劃

  • 常用方法
PL/SQL Developer工具F5鍵 explain plan for set autotrace on set autotrace traceonly 索引范圍掃描:INDEX RANGE SCAN 索引唯一掃描:INDEX UNIQUE SCAN 索引跳躍掃描:INDEX SKIP SCAN 索引全掃描: INDEX FULL SCAN

索引失效場景

以下場景可能導(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。