| 被建议的键 | 领头键,顺序无关 | 
| C1, C2, C3 | C1, C2, C3 | 
| C1, C3, C2 | C1 | 
| 被建议的键 | 领头键,顺序无关 | 
| C1, C2, C3 | C1, C2, C3 | 
| C1, C3, C2 | C1 | 
| C1, C3, C2, C4 | C1, C2, C3, C4 | 
| 列名 | 列标题 | 压缩动作 | 
| Table_NAME | 建议索引时所基于的表 | 保留,不作更改 | 
| Table_SCHEMA | 包含表的模式 | 保留,不作更改 | 
| SYSTEM_TABLE_NAME | 建议索引时所基于的系统表的表名 | 保留,不作更改 | 
| PARTITION_NAME | 索引的分区细节 | 保留,不作更改 | 
| KEY_COLUMNS_ADVISED | 被建议索引的列名 | 生成 | 
| LEADING_COLUMN_KEYS | 领头的、顺序无关的键,这些键在 Key_Columns_Advised 字段的开头部分,可以重新排列该字段且仍能满足被建议的索引 | 使用后丢弃 | 
| INDEX_TYPE | 基数(默认)或编码向量索引(EVI) | 保留,不作更改 | 
| LAST_ADVISED | 该行的上一次更新时间 | 使用最新建议时间戳 | 
| TIMES_ADVISED | 索引被建议的次数 | 通过总计生成 | 
| ESTIMATED_CREATION_TIME | 估计创建索引所需的秒数 | 使用最大值 | 
| REASON_ADVISED | 表明索引被建议的原因的原因码 | 丢弃 | 
| LOGICAL_PAGE_SIZE | 建议用于索引的页面大小 | 使用最大值 | 
| MOST_EXPENSIVE_QUERY | 查询的执行时间,单位为秒 | 使用最大值 | 
| AVERAGE_QUERY_ESTIMATE | 查询的平均执行时间,单位为秒 | 通过求平均值生成 | 
| Table_SIZE | 当索引被建议时表中的行数 | 使用最新建议中的值 | 
| NLSS_TABLE_NAME | 用于索引的排序顺序表 | 保留,不作更改 | 
| NLSS_TABLE_SCHEMA | 排序顺序表的库名 | 保留,不作更改 | 
| MTI_USED | 因匹配的永久索引不存在,而使用与被建议定义相匹配的 MTI(被维护的临时索引,自主索引)的次数 | 丢弃 | 
| MTI_CREATED | 这个特定的索引建议被用于创建 MTI 的次数 | 丢弃 | 
| 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. 被建议索引输出(续)  
  在这个例子中,两个被建议索引的键顺序有足够的灵活性,答应将建议压缩成一个索引。图 2 显示了压缩的索引建议。除了为用户提供压缩列键顺序 { JOB, SEX, BIRTHDATE } 外,压缩的建议还包括帮助确定建议的重要性的上下文信息。通过“Times Advised for Query Use”和“Average of Query Estimates”等列可以看出永久索引能为这个环境带来多大的好处。而“Estimated Index Creation Time”列用于判定是否要将创建索引作为预定的活动。  图 2. 压缩的索引建议  
  iSeries Navigator 压缩器界面  在 iSeries Navigator 中,有 Index Advisor 的地方就有压缩索引建议动作。图 3 显示了压缩器的图形化界面,该界面可以通过右键单击一个模式对象打开。也可以从一个表对象中进行访问。  图 3. iSeries Navigator 压缩器界面  
  为了使用压缩器的 iSeries Navigator 界面,需要在客户机上安装最新的 V5R4M0 iSeries access for Windows Service Pack。  可编程压缩器接口  除了 iSeries Navigator 界面以外,还可以用一条 SQL 语句以可编程方式访问索引建议压缩器。DB2 for i5/OS 在 QSYS2 模式中提供了一个新的视图 CondensedIndexAdvice。清单 2 显示了新的 CondensedIndexAdvice 视图返回的数据。由于 CondensedIndexAdvice 视图是用一个用户定义表函数(UDTF)实现的,因此该视图本身是只读的。任何修改该视图的尝试都会出现 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 语句来访问压缩的建议很简单。如前所述,压缩的索引建议分析可以在表级进行,也可以在模式级进行。  清单 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 还可以直接通过用户查询来访问。下面是这个表函数的定义,另外还有一个简单的例子,用于演示如何使用该 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 ;  结束语  不管是使用压缩索引建议还是原始索引建议,都是改善索引策略的一个有效的办法。在根据建议采取行动之前,需要考虑的重要的一点是查看已有的索引和它们的使用情况。由于任何索引都隐含着维护成本,因此任何性能调优活动的共同之处就是限制永久索引的数量。本文的主旨是,查看压缩的索引建议,以发现改善性能的机遇,并且在作出任何更改之前和之后,查看索引的使用情况。	 	 	 	 新闻热点
疑难解答