| 被建議的鍵 | 領(lǐng)頭鍵,順序無關(guān) |
| C1, C2, C3 | C1, C2, C3 |
| C1, C3, C2 | C1 |
| 被建議的鍵 | 領(lǐng)頭鍵,順序無關(guān) |
| C1, C2, C3 | C1, C2, C3 |
| C1, C3, C2 | C1 |
| C1, C3, C2, C4 | C1, C2, C3, C4 |
| 列名 | 列標(biāo)題 | 壓縮動作 |
| Table_NAME | 建議索引時所基于的表 | 保留,不作更改 |
| Table_SCHEMA | 包含表的模式 | 保留,不作更改 |
| SYSTEM_TABLE_NAME | 建議索引時所基于的系統(tǒng)表的表名 | 保留,不作更改 |
| PARTITION_NAME | 索引的分區(qū)細(xì)節(jié) | 保留,不作更改 |
| KEY_COLUMNS_ADVISED | 被建議索引的列名 | 生成 |
| LEADING_COLUMN_KEYS | 領(lǐng)頭的、順序無關(guān)的鍵,這些鍵在 Key_Columns_Advised 字段的開頭部分,可以重新排列該字段且仍能滿足被建議的索引 | 使用后丟棄 |
| INDEX_TYPE | 基數(shù)(默認(rèn))或編碼向量索引(EVI) | 保留,不作更改 |
| LAST_ADVISED | 該行的上一次更新時間 | 使用最新建議時間戳 |
| TIMES_ADVISED | 索引被建議的次數(shù) | 通過總計生成 |
| ESTIMATED_CREATION_TIME | 估計創(chuàng)建索引所需的秒數(shù) | 使用最大值 |
| REASON_ADVISED | 表明索引被建議的原因的原因碼 | 丟棄 |
| LOGICAL_PAGE_SIZE | 建議用于索引的頁面大小 | 使用最大值 |
| MOST_EXPENSIVE_QUERY | 查詢的執(zhí)行時間,單位為秒 | 使用最大值 |
| AVERAGE_QUERY_ESTIMATE | 查詢的平均執(zhí)行時間,單位為秒 | 通過求平均值生成 |
| Table_SIZE | 當(dāng)索引被建議時表中的行數(shù) | 使用最新建議中的值 |
| NLSS_TABLE_NAME | 用于索引的排序順序表 | 保留,不作更改 |
| NLSS_TABLE_SCHEMA | 排序順序表的庫名 | 保留,不作更改 |
| MTI_USED | 因匹配的永久索引不存在,而使用與被建議定義相匹配的 MTI(被維護(hù)的臨時索引,自主索引)的次數(shù) | 丟棄 |
| MTI_CREATED | 這個特定的索引建議被用于創(chuàng)建 MTI 的次數(shù) | 丟棄 |
| LAST_MTI_USED | 上一次因匹配的永久索引不存在而使用 MTI 的時間 | 丟棄 |
-- Create sample database in CONDENSE schema
CALL QSYS.CREATE_SQL_SAMPLE('CONDENSE');
SET SCHEMA Condense;
SELECT e.firstnme, d.deptnmae FROM department d, employee e
WHERE e.job = 'DESIGNER' AND YEAR(e.birthdate) > 1950 AND e.sex = 'M';
SELECT e.firstnme, d.deptnmae FROM department d, employee e
WHERE YEAR(e.birthdate) = 1953 AND e.job = 'DESIGNER' AND e.sex IN ('M');
SELECT e.firstnme, d.deptnmae FROM department d, employee e
ORDER BY e.job, e.sex, e.birthdate; 圖 1b 只包含 圖 1a 中放不下的索引建議屬性。注重,‘Keys Advised’列下的鍵的順序有所不同。 圖 1a. 被建議索引輸出
圖 1b. 被建議索引輸出(續(xù))
在這個例子中,兩個被建議索引的鍵順序有足夠的靈活性,答應(yīng)將建議壓縮成一個索引。圖 2 顯示了壓縮的索引建議。除了為用戶提供壓縮列鍵順序 { JOB, SEX, BIRTHDATE } 外,壓縮的建議還包括幫助確定建議的重要性的上下文信息。通過“Times Advised for Query Use”和“Average of Query Estimates”等列可以看出永久索引能為這個環(huán)境帶來多大的好處。而“Estimated Index Creation Time”列用于判定是否要將創(chuàng)建索引作為預(yù)定的活動。 圖 2. 壓縮的索引建議
iSeries Navigator 壓縮器界面 在 iSeries Navigator 中,有 Index Advisor 的地方就有壓縮索引建議動作。圖 3 顯示了壓縮器的圖形化界面,該界面可以通過右鍵單擊一個模式對象打開。也可以從一個表對象中進(jìn)行訪問。 圖 3. iSeries Navigator 壓縮器界面
為了使用壓縮器的 iSeries Navigator 界面,需要在客戶機(jī)上安裝最新的 V5R4M0 iSeries access for Windows Service Pack。 可編程壓縮器接口 除了 iSeries Navigator 界面以外,還可以用一條 SQL 語句以可編程方式訪問索引建議壓縮器。DB2 for i5/OS 在 QSYS2 模式中提供了一個新的視圖 CondensedIndexAdvice。清單 2 顯示了新的 CondensedIndexAdvice 視圖返回的數(shù)據(jù)。由于 CondensedIndexAdvice 視圖是用一個用戶定義表函數(shù)(UDTF)實現(xiàn)的,因此該視圖本身是只讀的。任何修改該視圖的嘗試都會出現(xiàn) SQL0150 錯誤。 清單 2. CondensedIndexAdvice 視圖定義QSYS2.CONDENSEDINDEXADVICE (
TABLE_NAME FOR COLUMN TABNAME VARCHAR(258) CCSID 37 NOT NULL ,
TABLE_SCHEMA FOR COLUMN TABSCHEMA CHAR(10) CCSID 37 NOT NULL ,
SYSTEM_TABLE_NAME FOR COLUMN SYS_TNAME CHAR(10) CCSID 37 NOT NULL ,
PARTITION_NAME FOR COLUMN TABPART VARCHAR(128) CCSID 37 DEFAULT NULL ,
KEY_COLUMNS_ADVISED FOR COLUMN KEYSADV VARCHAR(16000) CCSID 37 DEFAULT NULL ,
INDEX_TYPE CHAR(14) CCSID 37 DEFAULT NULL ,
LAST_ADVISED FOR COLUMN LASTADV TIMESTAMP DEFAULT NULL ,
TIMES_ADVISED FOR COLUMN TIMESADV BIGINT DEFAULT NULL ,
ESTIMATED_CREATION_TIME FOR COLUMN ESTTIME INTEGER DEFAULT NULL ,
LOGICAL_PAGE_SIZE FOR COLUMN "PAGESIZE" INTEGER DEFAULT NULL ,
MOST_EXPENSIVE_QUERY FOR COLUMN QUERYCOST INTEGER DEFAULT NULL ,
AVERAGE_QUERY_ESTIMATE FOR COLUMN QUERYEST INTEGER DEFAULT NULL ,
TABLE_SIZE BIGINT DEFAULT NULL ,
NLSS_TABLE_NAME FOR COLUMN NLSSNAME CHAR(10) CCSID 37 DEFAULT NULL ,
NLSS_TABLE_SCHEMA FOR COLUMN NLSSSCHEMA CHAR(10) CCSID 37 DEFAULT NULL ) 通過下面的 SELECT 語句可以看到,編寫 SQL 語句來訪問壓縮的建議很簡單。如前所述,壓縮的索引建議分析可以在表級進(jìn)行,也可以在模式級進(jìn)行。 清單 3. CondensedIndexAdvice 查詢示例-- Condensed index advice for an entire schema, named CONDENSE
SELECT * FROM QSYS2.CONDENSEDINDEXADVICE WHERE table_schema = 'CONDENSE' ;
-- Condensed index advice for a specific table, named EMPLOYEE in CONDENSE schema
SELECT * FROM QSYS2.CONDENSEDINDEXADVICE
WHERE table_name = 'EMPLOYEE' AND table_schema = 'CONDENSE';
-- Condensed index advice for a range of schemas, where the average
-- query estimate driving the index advice is greater than 10 seconds
SELECT * FROM QSYS2.CONDENSEDINDEXADVICE
WHERE table_schema LIKE 'Q%' AND average_query_estimate > 10 ; 新的 CondensedIndexAdvice 視圖使用的 Condense_Advice UDTF 還可以直接通過用戶查詢來訪問。下面是這個表函數(shù)的定義,另外還有一個簡單的例子,用于演示如何使用該 UDTF。 清單 4. Condense_Advice UDTFCREATE FUNCTION QSYS2.Condense_Advice(TABLE_SCHEMA VARCHAR(128),
TABLE_NAME VARCHAR(128) )
RETURNS TABLE(TABLE_PARTITION VARCHAR(128), KEY_COLUMNS_ADVISED VARCHAR(16000),
INDEX_TYPE CHAR(14), LAST_ADVISED TIMESTAMP, TIMES_ADVISED BIGINT,
ESTIMATED_CREATION_TIME INTEGER, LOGICAL_PAGE_SIZE INTEGER,
MOST_EXPENSIVE_QUERY INTEGER, AVERAGE_QUERY_ESTIMATE INTEGER,
TABLE_SIZE BIGINT, NLSS_TABLE_NAME CHAR(10),NLSS_TABLE_SCHEMA CHAR(10))
LANGUAGE C
NOT DETERMINISTIC
READS SQL DATA
CALLED ON NULL INPUT
SCRATCHPAD 325064
DISALLOW PARALLEL
FINAL CALL
CARDINALITY 1
EXTERNAL NAME 'QSYS/QDBSSUDF2(CONDENSE_ADVICE)'
PARAMETER STYLE DB2SQL;
-- Query the condenser UDTF directly, PRoviding selection criteria and ordering
-- the results of the 15 most important condensed entries
SELECT * FROM TABLE(QSYS2.CONDENSE_ADVICE('CRPDTA','B123456')) AS a
WHERE a.table_size >(1024*1024) AND MONTH(last_advised)= MONTH(CURRENT TIMESTAMP)
ORDER BY average_query_estimate DESC
FETCH FIRST 15 ROWS ONLY ; 結(jié)束語 不管是使用壓縮索引建議還是原始索引建議,都是改善索引策略的一個有效的辦法。在根據(jù)建議采取行動之前,需要考慮的重要的一點是查看已有的索引和它們的使用情況。由于任何索引都隱含著維護(hù)成本,因此任何性能調(diào)優(yōu)活動的共同之處就是限制永久索引的數(shù)量。本文的主旨是,查看壓縮的索引建議,以發(fā)現(xiàn)改善性能的機(jī)遇,并且在作出任何更改之前和之后,查看索引的使用情況。 新聞熱點
疑難解答
圖片精選