選擇和最佳化索引
理解B樹索引(BANLANCE)
1建表
createtablecust(
cust_idnumber,
last_namevarchar2(30),
first_namevarchar2(30));
2確定多個SQL查詢會頻繁在where子句使用last_name列,建立下列索引:
createindexindex_idx1oncust(last_name);
插入資料
insertintocustvalues(7,'ACER','SCOTT');
insertintocustvalues(4,'KAN','JIM');
insertintocustvalues(2,'FAN','BOB');
insertintocustvalues(9,'STAR','KIM');
...
insertintocustvalues(117,'ACER','SID');
3更新表統計資訊,為查詢最佳化工具提供足夠資訊
SQL>execdbms_stats.gather_table_stats(ownname=>'mlq',tabname=>'CUST',cascade=>true);
插入更多的資料,從表及索引中查詢資料,有三種可能的塊景:
A所有資料全在索引資料區塊
發生索引範圍描掃索引快速全掃描
selectlast_namefromcustwherelast_name='ACER';範圍掃描
自動跟蹤:
setautotraceon
selectcount(last_name)fromcust;
發生索引快速掃描,
通過查看執行計畫及統計資訊,可以得到更詳細的結果
B並不是所有資訊都包含在索引中
selectlast_name,first_namefromcustwherelast_name='ACER';
訪問first_name通過rownid
C僅訪問表資料區塊
select*fromcust;
全掃描
B樹索引是oracle預設的索引類型,對於大多數oltp來說足夠了。
它是很高效的,恰當使用,會使查詢快很多,如果索引結構本身含含查詢要擷取的列值,
那麼就不需要訪問表資料區塊。要理解這個原理,寫出高效索引,確定要建立索引的列,
以及判斷對某些查詢來說組合查詢是否更為高效。
估算一個索引所需要的空間
建立一個索引前,可以通過預存程序來估算所需的空間
setsererouton
execdbms_stats.gather_table_stats(user,'CUST');
variableused_bytesnumber
variablealloc_bytesnumber
execdbms-space.create_index_cost('createindexcust_idx2oncust(first_name)',:used_bytes,:alloc_bytes);)
print:used_bytes
print:alloc_bytes
查看輸出結果
本文出自 “mlqiang” 部落格,請務必保留此出處http://162234.blog.51cto.com/152234/1302485