當執行SELECT語句時,如果在內存裏找不到相應的數據,就會從磁盤讀取進而緩存至LRU末端(冷端),這個過程就叫物理讀。當相應數據已在內存,就會邏輯讀。
物理讀是磁盤讀,邏輯讀是內存讀;內存讀的速度遠比磁盤讀來得快。
參數db_file_multiblock_read_count=N,會決定在全表掃描或索引全掃描時單次IO最大讀取N個數據塊。
下在結合實驗來講解物理讀:
創建測試表:
create table t3 as select * from dba_segments tablespace users;
對測試表進行統計信息收集:
begin
dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'T3',cascade => true);
end;
查看T3表的相關信息:
select * from dba_tables where table_name='T3'
數據分佈在100個數據塊
修改參數
SQL> alter session set db_file_multiblock_read_count=1;
對T3表全掃描
可以看到,T3全掃描過程讀取了101個數據塊,同時引起103內存讀(包括當前讀和一致讀)
截取這個步驟的AWR信息
db_file_multiblock_read_count=1的情況下,查詢T3全表數據期間發生100.3個數據塊的物理讀,IO次數爲100.3次。
USERS表空間的user01.dbf數據文件發生了101次讀操作
增大db_file_multiblock_read_count之後
SQL> alter session set db_file_multiblock_read_count=128;
Session altered.
SQL> alter system flush buffer_cache;
查詢表T3
物理讀依舊101,邏輯讀也相應改變
USERS表空間users01.dbf數據文件讀次數降爲15次
同樣的數量的數據塊物理讀,如果單次讀取的數據塊越多,那麼IO次數就越少,系統性能則越好。
-------------------------------------------------------------------------------------------------
本文來自於我的技術博客 http://blog.csdn.net/robo23
轉載請標註源文鏈接,否則追究法律責任!