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操作數量,
自然檢索時間會大大降低.