oracle 聚簇因子對查詢性能的影響


createtablet0
(
sidintnotnull,
snamevarchar2(20)
)
tablespacetest;

--循環導入數據
declare
maxrecordsconstantint:=100000;
iint:=1;
begin
foriin1..maxrecordsloop
insertintot0values(i,'ocpyang'||i);
endloop;
dbms_output.put_line('成功錄入數據!');
commit;
end;
/

createtablet1
as
selectsid,snamefromt0orderbysnamedesc;


createindexindex_t1ont1(sid);

createtablet2
as
selectsid,snamefromt0orderbysidasc;

createindexindex_t2ont2(sidasc);


--分析兩張表及其索引
EXECDBMS_STATS.gather_table_stats(USER,'T1');
EXECDBMS_STATS.gather_table_stats(USER,'T2');
EXECDBMS_STATS.gather_index_stats(USER,'INDEX_T1');
EXECDBMS_STATS.gather_index_stats(USER,'INDEX_T2');


---比較同一個查詢


setautottraceonlystat;

SELECT*FROMt1WHEREsidBETWEEN100AND120;


統計信息
----------------------------------------------------------
5recursivecalls
4dbblockgets
15consistentgets一致讀
0physicalreads
540redosize
1240bytessentviaSQL*Nettoclient
530bytesreceivedviaSQL*Netfromclient
3SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
21rowsprocessed

SELECT*FROMt2WHEREsidBETWEEN100AND120;

統計信息
----------------------------------------------------------
6recursivecalls
4dbblockgets
9consistentgets一致讀
0physicalreads
540redosize
1240bytessentviaSQL*Nettoclient
530bytesreceivedviaSQL*Netfromclient
3SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
21rowsprocessed

setautotraceoff;


由上得知,通過執行統計信息觀察,t1表的查詢一致讀是15,而t2表的一致讀只有9,盡然t1的一致讀盡然是t2的1倍還多,
很奇怪,同樣的表結構,同樣的數據.


----分析原因:

select
b.table_name,
a.index_name,
b.num_rows,
b.blocks,
a.clustering_factorfrom
user_indexesa,user_tablesb
whereb.table_namein('T1','T2')
anda.table_name=b.table_name;


TABLE_NAMEINDEX_NAMENUM_ROWSBLOCKSCLUSTERING_FACTOR
---------------------------------------------------------
T1INDEX_T11000003301048
T2INDEX_T2100000330316

通過查詢聚簇因子發現,兩個表的聚簇因子差別很大,基於sid的索引在sid是順序排列的表中,clustering_factor的值相差很大。

T1表中數據屬於無序狀態,這個時候的CLUSTERING_FACTOR比較接近NUM_ROWS,說明如果掃描整個表,
每次都要根據Index來讀取相應行的RowID,這個時候的IO操作很多,自然檢索時間會比較長。

T2表數據有序,CLUSTERING_FACTOR比較接近BLOCKS,說明相鄰的數據在一個塊中,減少了IO操作數量,
自然檢索時間會大大降低.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章