oracle數據庫菜鳥教程「oracle 性能優化工具」

sql 的優化大多數情況下是索引的優化,那麼,什麼情況下該創建索引,什麼情況下不創建索引呢,回答這個問題之前,先來了解一下基數和選擇性吧。

基數

在 Oracle 數據庫中,某一列的唯一鍵的數量叫做基數。

舉個例子,比如一張表中有個 sex 字段,它的值只有 「男」 和 「女」 兩種情況,那我們就說這一列的基數是2。

我們可以通過如下語句來查詢一個字段的基數。

select count(distinct deptno) as num from emp
Oracle優化:什麼情況下該創建索引,什麼情況下不創建索引

當一個字段的基數越大的時候,該列的數據分佈可能就越均衡。字段的基數越小時,該列的數據分佈可能就越不均衡。

舉個例子,在一個有10000行數據的表中,sex 字段基數為2,他的數據分佈可能為9999行是男的,1行是女的,這是分佈不均衡的現象。而在身份證字段中,它的基數是10000,每一行都是一個不同的身份證號碼,這是分佈均衡的現象。

我們可以通過 group by 語句來查看數據的分佈情況。

select deptno,count(1) from emp group by deptno
Oracle優化:什麼情況下該創建索引,什麼情況下不創建索引

這個時候如果我們要查詢表中性別為男的數據,那麼返回的數據就佔了表中數據的 99.99%,其實就相當於是全表掃描,這種情況就不應該走索引了。但是如果查詢表中性別為女的數據,那麼返回的數據就佔了表中數據的 0.01%,這個時候時候應該走索引。

一般來說,當返回表中 5% 以內的數據的時候,就應該走索引。超過 5% 的數據就要使用全表掃描。但是這個說法太絕對了,就像上面查詢 sex 字段時,查詢男性時候超過了 5%,查詢女性時候小於 5%,那這個字段需不需要創建索引呢?

這個時候,就需要引入選擇性的概念了。

選擇性

基數與表的總行數的比值就是選擇性。

我們可以通過以下 sql 語句來查詢列的選擇性。

select count(distinct deptno)/count(1) as selectivity from emp
Oracle優化:什麼情況下該創建索引,什麼情況下不創建索引

當一個字段的選擇性大於 20%,說明該列數據分佈就是比較均衡的了。這個時候如果在 where 子句中使用了該字段,那麼就應該創建索引。

PS:文中使用了數據量較少的表來舉例子,是因為數據清晰直觀,方便大家理解。而在實際情況中,只有大表才會產生性能問題。如果一個表裡只有十幾二十條數據,也就無所謂優化了。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/208893.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-08 15:22
下一篇 2024-12-08 15:22

相關推薦

發表回復

登錄後才能評論