本篇內(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)變。
一個列中唯一鍵(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%就算是比較高了
就看他的基數(shù)和選擇性 如果基數(shù)大選擇性大 那么使用索引就比較好
要看情況:
從OLTP 系統(tǒng)上來說在選擇性低的列上創(chuàng)建索引肯定不適合的,基數(shù)/選擇性高的列,適合建立B-Tree索引;
在OLAP系統(tǒng)中基數(shù)低的列根據(jù)需求,有可能會建立bitmap索引
創(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ù) 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)列為基數(shù) total_rows列為總行數(shù) selectivity列為選擇性 在做SQL優(yōu)化的時候,不要急忙運行上面SQL,首先應(yīng)該檢查表的segment_size有多大,如果表的segment_size過大(比如超過SGA的buffer_cache),你要考慮運行上面SQL 是否對你當(dāng)前的系統(tǒng)有影響,如果是測試環(huán)境,無所謂,如果是生產(chǎn)環(huán)境,要小心謹(jǐ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'); |
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% 就屬于選擇性差 如果統(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ù)與選擇性分析”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
當(dāng)前名稱:Oracle的基數(shù)與選擇性分析
分享網(wǎng)址:http://m.rwnh.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)