Oracle的基數(shù)與選擇性分析

本篇內(nèi)容主要講解“Oracle的基數(shù)與選擇性分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Oracle的基數(shù)與選擇性分析”吧!

專注于為中小企業(yè)提供網(wǎng)站設(shè)計制作、做網(wǎng)站服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)惠來免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

基數(shù)

    一個列中唯一鍵(Distinct_keys)的個數(shù),如有一個100W行的表,性別列的基數(shù)為2 (select distinct gender from test),主鍵列的基數(shù)為100W(select distinct mid from test);

選擇性

    基數(shù)/總行數(shù)所占的百分比,性別 2/100w * 100% 主鍵 100%  選擇性越高 越有利于使用索引 20~30%就算是比較高了

1、如何判斷是一個索引創(chuàng)建的是好還是壞呢? 

     就看他的基數(shù)和選擇性 如果基數(shù)大選擇性大 那么使用索引就比較好

2、性別這個列使不使用索引?

要看情況:

從OLTP 系統(tǒng)上來說在選擇性低的列上創(chuàng)建索引肯定不適合的,基數(shù)/選擇性高的列,適合建立B-Tree索引;

    在OLAP系統(tǒng)中基數(shù)低的列根據(jù)需求,有可能會建立bitmap索引

3、如何查看列的選擇性和基數(shù)呢?

創(chuàng)建一個test測試表,

create table test as select * from dba_objects;  

create index idx_owner on test(owner);    

create index idx_object_name on test(object_name);

查看owner列和object_name列的基數(shù)

Oracle的基數(shù)與選擇性分析select count(distinct owner),count(distinct object_name) from test;

查看列的基數(shù)和選擇性,可以使用如下腳本

select count(distinct column_name),count(*) total_rows,count(distinct column_name) / count(*) * 100 selectivity from table_name;  

我們查看test表的owner的基數(shù)和選擇性

select ,count(*) total_rows,count(distinct owner) / count(*) * 100 selectivity from test;

count(distinct owner)Oracle的基數(shù)與選擇性分析列為基數(shù)

total_rows列為總行數(shù)

selectivity列為選擇性

在做SQL優(yōu)化的時候,不要急忙運行上面SQL,首先應(yīng)該檢查表的segment_size有多大,如果表的segment_size過大(比如超過SGA的buffer_cache),你要考慮運行上面SQL

是否對你當前的系統(tǒng)有影響,如果是測試環(huán)境,無所謂,如果是生產(chǎn)環(huán)境,要小心謹慎。

--其實建議使用統(tǒng)計信息表(dba_tab_col_statistics 、dba_tables )里的信息來查看選擇性和基數(shù),這里注意我們首先要收集統(tǒng)計信息,否則返回的列是空值。

select a.column_name,

b.num_rows,

a.num_distinct Cardinality,

round(a.num_distinct / b.num_rows * 100, 2) selectivity,

a.histogram,

a.num_buckets

from dba_tab_col_statistics a, dba_tables b

where a.owner = b.owner

and a.table_name = b.table_name

and a.owner =  upper('&owner')

and a.table_name =  upper('&table_name')

and a.column_name = upper('&column_name');

Oracle的基數(shù)與選擇性分析

4、找出系統(tǒng)某個用戶中不合理(選擇性很低)的索引腳本

select a.OWNER,

a.INDEX_NAME,

a.TABLE_NAME,

a.DISTINCT_KEYS Cardinality,

a.NUM_ROWS,

round(a.DISTINCT_KEYS / NUM_ROWS * 100, 2) selectivity

from dba_ind_statistics a

where A.OWNER = upper('&owner');

selectivity <5 一般選擇性小于5% 就屬于選擇性差Oracle的基數(shù)與選擇性分析





如果統(tǒng)計信息有可能不是最新的最好使用下面的語句

select table_name,index_name,round(distinct_keys/num_rows * 100, 2) selectivity from user_indexes;

但是選擇性低的列也不一定不需要建索引要根據(jù)業(yè)務(wù)來比如有7W行記錄 SCOTT的有23行如果經(jīng)常根據(jù)SCOTT查要建立索引Oracle的基數(shù)與選擇性分析

到此,相信大家對“Oracle的基數(shù)與選擇性分析”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

當前名稱:Oracle的基數(shù)與選擇性分析
分享網(wǎng)址:http://muchs.cn/article38/jejhpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、關(guān)鍵詞優(yōu)化、域名注冊ChatGPT、移動網(wǎng)站建設(shè)、用戶體驗

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)