DB2 優化器估算基數時,預設假設謂詞之間獨立。當多個區域等值謂詞(Local Equality Predicates)或等值聯結謂詞存在統計相關性時,獨立假設會導致基數嚴重低估,進而選擇次優存取計劃(如錯誤選擇索引掃描而非表掃描、錯誤聯結順序)。欄位群組統計資訊記錄多欄位組合的不同值群組數,讓優化器能精準偵測相關性。
| 類型 | 來源 | 適用條件 | 統計項目 |
|---|---|---|---|
| 索引 Keycard 統計 | 索引自動維護 | 索引鍵值完整符合謂詞欄位(順序相符) | FIRST2KEYCARD、FIRST3KEYCARD、FIRST4KEYCARD、FULLKEYCARD |
| 欄位群組統計 | RUNSTATS 手動收集 | 任意欄位組合,無需索引 | COLGROUPCARD(群組基數) |
欄位:SHOW_ID, CHANNEL_ID, STATION_ID, CITY_ID, DAY, TIME
查詢謂詞:
P1: SHOW_ID = ?
P2: CHANNEL_ID = ?
P3: STATION_ID = ?
P4: TIME = ?
IX1 (SHOW_ID, CHANNEL_ID, STATION_ID, TIME) → 使用 FIRST4KEYCARD / FULLKEYCARDIX2 (SHOW_ID, CHANNEL_ID, STATION_ID, TIME, CITY_ID) → 使用 FIRST4KEYCARDIX4 (CITY_ID, SHOW_ID, ...) → Keycard 皆含 CITY_ID,但查詢無此謂詞。RUNSTATS ON TABLE schema.SHOW_LISTINGS
ON COLUMNS ((SHOW_ID, CHANNEL_ID, STATION_ID, TIME))
WITH DISTRIBUTION;
優化器將以相同方式使用此群組基數偵測四個謂詞的相關性。
對謂詞 T1.C = T2.C:
COLCARD(T1.C) > COLCARD(T2.C) 且 HIGH2KEY(T1.C) >= HIGH2KEY(T2.C) 且 LOW2KEY(T1.C) <= LOW2KEY(T2.C) → T1 為父表。RUNSTATS ON TABLE schema.table
ON COLUMNS ((col1, col2, col3), (col4, col5), col6)
[AND INDEXES ALL] [WITH DISTRIBUTION] [ALLOW READ/WRITE ACCESS];
| 需求 | 指令範例 |
|---|---|
| 單一欄位群組 | ON COLUMNS ((A, B, C)) |
| 多個欄位群組 + 單欄 | ON COLUMNS ((A, B), (A, B, C), D) |
| 所有單欄 + 指定群組 | ON ALL COLUMNS AND ON COLUMNS ((A, B, C)) |
| 搭配索引統計 | ON ALL COLUMNS AND ON COLUMNS ((A, B)) AND INDEXES ALL |
AUTO_RUNSTATS=ON 會覆蓋手工群組統計,需使用統計資訊設定檔保留。db2look -d sample -e -a -m -t ORG -o org.ddl
輸出包含 UPDATE SYSSTAT.COLGROUPS SET colgroupcard = ... 陳述式。
-- 欄位群組統計
WITH TMP(ID, NUM) AS (
SELECT COLGROUPID, MAX(ORDINAL) FROM SYSCAT.COLGROUPCOLS GROUP BY COLGROUPID
),
TMP2(ID, NAME, NUM, TNAME, TSCHEMA) AS (
SELECT ID, CAST(RTRIM(COLNAME) AS CHAR(128)), NUM, TABNAME, TABSCHEMA
FROM TMP Y, SYSCAT.COLGROUPCOLS X
WHERE X.COLGROUPID = Y.ID AND Y.NUM = X.ORDINAL
UNION ALL
SELECT Y.ID, CAST(RTRIM(X.COLNAME) || ',' || Y.NAME AS CHAR(128)), Y.NUM-1, TNAME, TSCHEMA
FROM TMP2 Y, SYSCAT.COLGROUPCOLS X
WHERE Y.ID = X.COLGROUPID AND X.ORDINAL = Y.NUM-1 AND Y.NUM > 1
AND TNAME = TABNAME AND TSCHEMA = TABSCHEMA
)
SELECT SUBSTR(TSCHEMA,1,10) TABSCHEMA, SUBSTR(TNAME,1,10) TABNAME,
NAME COLS, COLGROUPCARD
FROM TMP2, SYSSTAT.COLGROUPS
WHERE ID = COLGROUPID AND NUM = 1
ORDER BY TABSCHEMA, TABNAME;
SELECT SUBSTR(COLNAMES,1,30) COLS, FIRST2KEYCARD, FIRST3KEYCARD, FIRST4KEYCARD, FULLKEYCARD
FROM SYSSTAT.INDEXES
WHERE TABSCHEMA='<綱要>' AND TABNAME='<表名>';
AUTO_STATS_PROF(自動統計資訊分析),DB2 依工作負載推薦雙欄位群組統計。IXEMP_1 ON EMPLOYEE(JOB, WORKDEPT, SEX),收集索引統計,觀察基數估算是否修正。db2look -m 或目錄查詢驗證統計是否正確寫入。