oracle索引聚簇因子,oracle 聚簇因子对查询性能的影响

本文探讨了两张表T1和T2在相同结构和数据下,查询效率差异显著的原因。关键在于T1的无序数据导致聚簇因子高,增加了IO操作,而T2有序数据降低了IO,索引_T1的一致读远超_T2。通过聚簇因子和索引分析揭示了性能差距背后的原理。
摘要由CSDN通过智能技术生成

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操作数量,

自然检索时间会大大降低.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值