您好,登錄后才能下訂單哦!
這篇文章將詳細介紹 method_opt 參數(shù)怎樣影響目標列上的統(tǒng)計信息以及為目標列收集什么類型的統(tǒng)計信息.
Method_opt 可能是存儲過程 dbms_stats.gather_*_stats 中最令人費解的參數(shù). 這個參數(shù)最常見的功能就是控制直方圖的收集方式, 但實際上它的功能遠不及此. 它的實際功能如下所示:
Method_opt 參數(shù)用法分為兩個部分, 如下圖所示:
“For all [indexed | hidden] columns” 這一部分控制著哪些列將會收集列的基本統(tǒng)計信息(目標列上的最小值, 最大值, 列上不同值的數(shù)量, 空值的數(shù)量等等). 系統(tǒng)默認值為 FOR ALL COLUMNS, 它將收集表上所有列(包括隱藏列)的基本的統(tǒng)計信息. 此外, 它的其他可選值如下所示:
如果一個字段(列)并不包括在這部分收集基本統(tǒng)計信息的列的列表中, 收集完成后只會計算這個列的平均長度. 而列的平均長度通常會用于計算行的平均長度.
"Size [size_clause]" 這一部分控制收集直方圖的方式, size 后面可以有以下選項:
如果 method_opt 的默認參數(shù) FOR ALL COLUMNS SIZE AUTO 在你的數(shù)據(jù)環(huán)境不適用, 可能你遇到的情況屬于下面兩種情況:
下面假設我們只想在 sales 表上的 cust_id 列上創(chuàng)建直方圖. 記住, method_opt 參數(shù)不僅可以指定哪些列收集基本的統(tǒng)計信息, 還可以指定哪些列收集直方圖, 因此我們需要考慮把 method_opt 參數(shù)分為兩個部分.
下面圖中的第一部分指定了哪些列將收集基本的統(tǒng)計信息. 在這里我們想要收集表上所有列的基本統(tǒng)計信息, 因此我們使用 For all
columns. 但是關于 size 部分, 我們應該怎樣設置參數(shù)呢? 因為我們只想在一個列上收集直方圖, 所以我們先指定 size 1
來阻止所有列收集直方圖(刪除所有列的直方圖)
下面圖中的第二部分指定了 cust_id 列需要收集直方圖, “For columns” 是 method_opt
語法中額外的部分, 它允許在參數(shù)設置部分為指定的列提供明確的操作. 在這里我們使用 FOR COLUMNS SIZE 254 CUST_ID
來指定 cust_id 列收集直方圖. 因此最終的 Method_opt 參數(shù)設置如下:
下面我們就使用 DBMS_STATS.GATHER_TABLE_STATS 來執(zhí)行收集統(tǒng)計信息, 雖然在系統(tǒng)中 sales 表中有很多列會用在 where 查詢語句中, 但在這里我們只是在 cust_id 列上建立直方圖.
BEGIN
dbms_stats.Gather_table_stats('SH', 'SALES', method_opt
=> 'FOR ALL COLUMNS SIZE 1 FOR COLUMNS SIZE 254 CUST_ID');
END;
/
PL/SQL procedure successfully completed.
SQL> SELECT column_name, num_distinct, histogram
FROM user_tab_col_statistics
WHERE table_name = 'SALES';
對于 method_opt 參數(shù)在很多種情況下需要用到更復雜的設置, 比如你不想收集指定列的任何統(tǒng)計信息. 目前并沒有方法告訴 Oracle 怎么樣不去收集指定列的統(tǒng)計信息, 但是你可以反過來考慮, 你可以通過 for columns 語法明確的列出需要收集統(tǒng)計信息的列. 下面我們演示不收集 sales 表中 prog_id 列的統(tǒng)計信息的方法:
BEGIN
dbms_stats.delete_column_stats('SH', 'SALES', 'PROD_ID');
END;
/
PL/SQL procedure completed successfully.
BEGIN
dbms_stats.Gather_table_stats('SH', 'SALES',
method_opt => 'FOR COLUMNS SIZE 254 CUST_ID TIME_ID CHANNEL_ID PROMO_ID QUANTITY_SOLD AMOUNT_SOLD');
END; /
PL/SQL procedure completed successfully.
-- 即使我們沒有收集 prod_id 列的統(tǒng)計信息, oracle 仍然會準確的計算每行的平均長度.
SQL> SELECT num_rows, avg_row_len
FROM user_tables
WHERE table_name = 'SALES';
SQL> SELECT column_name, num_distinct, histogram
注意: for columns 語句只能用于 gather_table_stats 存儲過程.
最后, 在本文的開頭我提到 method_opt 參數(shù)可以用于收集擴展的統(tǒng)計信息. 擴展的統(tǒng)計信息包含兩類列的統(tǒng)計信息: 列的組合以及列的表達式的統(tǒng)計信息. 在下面的例子中, oracle 將會收集 sales 表上 prod_id 和 cust_id 列的組合的統(tǒng)計信息以及所有基本列的統(tǒng)計信息, 同時, oracle 還將會為列的組合的統(tǒng)計信息自動生成名字.
在收集統(tǒng)計信息的語句中, 我們不建議在 method_opt 中直接指定參數(shù), 而建議使用 dbms_stats.set_table_prefs 存儲過程
總結, GATHER_DICTIONARY_STATS,
GATHER_DATABASE_STATS, 和 GATHER_SCHEMA_STATS 存儲過程只接受 “ FOR ALL
[INDEXED|HIDDEN] columns ” 語法, 不能指定具體的列名.
GATHER_TABLE_STATS procedure 存儲過程可以接受以 “for columns ” 格式的額外參數(shù), 使用這種語法可以控制以下內容:
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。