博客 / 詳情

返回

[20260213]測試直接路徑讀的閾值(11g).txt

[20260213]測試直接路徑讀的閾值(11g).txt

--//測試直接路徑讀遇到一些問題,先在11g下測試看看。
--//別人測試直接路徑讀遇到一些問題,使用如下鏈接還提供1個測試腳本:http://blog.itpub.net/22034023/viewspace-773483/
--//轉抄如下:

                 11GR1                     11GR2                    備註
塊閥值           _small_table_threshold*5  _small_table_threshold   統計信息裏記錄的表的block數目(11GR2)超過此閥值。
Block cache閥值  50%                       50%                      少於此閥值
髒塊閥值         25%                       25%                      少於此閥值

滿足以上條件時,Oracle會進行直接路徑讀取。

Oracle為直接路徑讀取設置的三個"門檻",非常的合理:

第一個閥值:表大小,太小的表從direct path read中的獲益太小。但是特別需要引起你的警惕,如果表上存在統計信息,那麼ORACLE會
採取表的統計信息中記錄的block與_small_table_threshold的設定值來做比較,而不是表的真實大小(dba_segments中記錄的值)。這
可能導致一些不是你預期的情況發生。如果你的統計信息與表的真實情況差異很大,那麼你應該仔細考慮可能發生什麼樣的結果。如果你
的表沒有統計信息,ORACLE會依據表的真實大小來決定是否進行direct path read。

第二個閥值:髒塊閥值,由於direct path read需要出發一個段的檢查點,因此髒塊太多,刷新髒塊可能會導致IO繁忙

第三個閥值:表在內存裏的cache率,如果cache率很高,那麼還是走傳統路徑更快。direct path read的出現,需要讓ORACLE公司的開發
人員設計一個單獨的結構來存儲每個表有多少數據是髒數據,有多少數據被cache。不過這個結構目前還並未暴露給我們查詢。在flush
buffer cache後,這個結構被清空。(flush shared_pool並不會被清空)


CREATE OR REPLACE FUNCTION GET_ADR_TRSH(P_STEP  IN NUMBER,
                                        P_START IN NUMBER DEFAULT 0,
                                        P_STOP  IN NUMBER DEFAULT NULL)
  RETURN NUMBER IS
  L_PRD    NUMBER;
  L_CNT    NUMBER;
  L_BLOCKS NUMBER := 0;
  L_START  NUMBER := P_START;
BEGIN
  EXECUTE IMMEDIATE 'truncate table t';
  LOOP
    INSERT /*+ append */
    INTO T
      SELECT RPAD('*', 100, '*')
        FROM DUAL
      CONNECT BY LEVEL <= P_STEP + L_START;
    COMMIT;
    L_BLOCKS := L_BLOCKS + P_STEP + L_START;
    L_START  := 0;
    EXECUTE IMMEDIATE 'alter system flush buffer_cache';
    SELECT /*+ full(t) */
     COUNT(*)
      INTO L_CNT
      FROM T;
    SELECT VALUE
      INTO L_PRD
      FROM V$SEGMENT_STATISTICS
     WHERE OWNER = USER
       AND OBJECT_NAME = 'T'
       AND STATISTIC_NAME = 'physical reads direct';
    EXIT WHEN(L_PRD > 0 OR L_BLOCKS > NVL(P_STOP, L_BLOCKS));
  END LOOP;
  RETURN L_BLOCKS - P_STEP;
END;
/

1.環境:
SCOTT@book> @ ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SYS@book> @ hidez _small_table_threshold
SYS@book> @ pr
==============================
NUM                           : 838
N_HEX                         :   346
NAME                          : _small_table_threshold
DESCRIPTION                   : lower threshold level of table size for direct reads
DEFAULT_VALUE                 : TRUE
SESSION_VALUE                 : 1205
SYSTEM_VALUE                  : 1205
ISSES_MODIFIABLE              : TRUE
ISSYS_MODIFIABLE              : DEFERRED
PL/SQL procedure successfully completed.

--//1205

2.測試:
SCOTT@book> create table t (v varchar2(100)) pctused 1 pctfree 99 tablespace users;
Table created.
--//實際上這樣每塊僅僅1條記錄。

--//SCOTT@book> execute sys.dbms_stats.delete_table_stats ('SCOTT', 'T',cascade_columns=> true ,cascade_indexes=> true, cascade_parts=>true ,no_invalidate=> false)
--//PL/SQL procedure successfully completed.

--//建立測試函數GET_ADR_TRSH略。
SYS@book> grant select on sys.V_$SEGMENT_STATISTICS to scott;
Grant succeeded.

$ cat m8.txt
set serveroutput on
DECLARE
  L_TRSH NUMBER;
BEGIN
  L_TRSH := GET_ADR_TRSH(10, &&1, &&2);
  DBMS_OUTPUT.PUT_LINE(L_TRSH);
END;
/

SCOTT@book> @ m8.txt 1000 4000
1170
PL/SQL procedure successfully completed.
--//實際上記錄的1170+10表示插入1180條記錄,如果加上段頭,L1,L2的數量,應該接近1205.

--//這個測試有一個小問題,沒有分析表,表T的分析數據是空的,我反覆測試中就遇到這個問題,差點誤導。
SCOTT@book> @ tab2z ^T$
Show tables matching condition "^T$" (if schema is not specified then current user's tables only are shown)...
OWNER                TABLE_NAME                     TYPE     NUM_ROWS        BLOCKS     EMPTY AVGSPC ROWLEN TAB_LAST_ANALYZED   DEGREE               COMPRESS
-------------------- ------------------------------ ---- ------------ ------------- --------- ------ ------ ------------------- -------------------- --------
SCOTT                T                              TAB                                                                                  1           DISABLED

--//分析表後統計如下:
SCOTT@book> @ tab2z ^T$
Show tables matching condition "^T$" (if schema is not specified then current user's tables only are shown)...
OWNER                TABLE_NAME                     TYPE     NUM_ROWS        BLOCKS     EMPTY AVGSPC ROWLEN TAB_LAST_ANALYZED   DEGREE               COMPRESS
-------------------- ------------------------------ ---- ------------ ------------- --------- ------ ------ ------------------- -------------------- --------
SCOTT                T                              TAB          1180          1208         0      0    101 2026-02-14 09:23:06          1           DISABLED
--//看blocks數量就非常接近了1205。

--//再次執行就存在誤導的情況。
SCOTT@book> @ m8.txt 10 4000
10
PL/SQL procedure successfully completed.

--//因為即使truncate 表T,但是統計信息並不會清除。
SCOTT@book> truncate table t;
Table truncated.

SCOTT@book> @ tab2z ^T$
Show tables matching condition "^T$" (if schema is not specified then current user's tables only are shown)...
OWNER                TABLE_NAME                     TYPE     NUM_ROWS        BLOCKS     EMPTY AVGSPC ROWLEN TAB_LAST_ANALYZED   DEGREE               COMPRESS
-------------------- ------------------------------ ---- ------------ ------------- --------- ------ ------ ------------------- -------------------- --------
SCOTT                T                              TAB          1180          1208         0      0    101 2026-02-14 09:23:06          1           DISABLED
--//換一句話講測試前不能有任何表相關統計信息。
--//再次分析表後的情況。
SCOTT@book> @ tab2z ^T$
Show tables matching condition "^T$" (if schema is not specified then current user's tables only are shown)...

OWNER                TABLE_NAME                     TYPE     NUM_ROWS        BLOCKS     EMPTY AVGSPC ROWLEN TAB_LAST_ANALYZED   DEGREE               COMPRESS
-------------------- ------------------------------ ---- ------------ ------------- --------- ------ ------ ------------------- -------------------- --------
SCOTT                T                              TAB             0             0         0      0      0 2026-02-14 09:31:30          1           DISABLED

SCOTT@book> @ m8.txt 10 4000
4000
PL/SQL procedure successfully completed.
--//已經到最大值,實際上沒有測試到直接路徑讀的情況。
--//僅僅刪除統計信息後再測試才有效。
SCOTT@book> execute sys.dbms_stats.delete_table_stats ('SCOTT', 'T',cascade_columns=> true ,cascade_indexes=> true, cascade_parts=>true ,no_invalidate=> false)
PL/SQL procedure successfully completed.

SCOTT@book> @ tab2z ^T$
Show tables matching condition "^T$" (if schema is not specified then current user's tables only are shown)...

OWNER                TABLE_NAME                     TYPE     NUM_ROWS        BLOCKS     EMPTY AVGSPC ROWLEN TAB_LAST_ANALYZED   DEGREE               COMPRESS
-------------------- ------------------------------ ---- ------------ ------------- --------- ------ ------ ------------------- -------------------- --------
SCOTT                T                              TAB                                                                                  1           DISABLED

--//再次測試:
SCOTT@book> @ m8.txt 998 4000
1168
PL/SQL procedure successfully completed.

SCOTT@book> exec dbms_stats.gather_table_stats('SCOTT', 'T', estimate_percent => NULL, method_opt=>'FOR TABLE FOR ALL COLUMNS SIZE REPEAT', cascade=>true, no_invalidate=>false)
PL/SQL procedure successfully completed.

SCOTT@book> @ tab2z ^T$
Show tables matching condition "^T$" (if schema is not specified then current user's tables only are shown)...
OWNER                TABLE_NAME                     TYPE     NUM_ROWS        BLOCKS     EMPTY AVGSPC ROWLEN TAB_LAST_ANALYZED   DEGREE               COMPRESS
-------------------- ------------------------------ ---- ------------ ------------- --------- ------ ------ ------------------- -------------------- --------
SCOTT                T                              TAB          1178          1206         0      0    101 2026-02-14 09:39:01          1           DISABLED

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.