使用DB2look重新創建優化器訪問計劃(5)
手工修改統計數據之一。在 db2look.out 文件中搜索下列語句(請注重,模式名、TABSCHEMA 和 INDSCHEMA 可能與您的具體情況不同):
UPDATE SYSSTAT.INDEXESSET NLEAF=1,NLEVELS=1,FIRSTKEYCARD=35,FIRST2KEYCARD=35,FIRST3KEYCARD=-1,FIRST4KEYCARD=-1,FULLKEYCARD=35,CLUSTERFACTOR=-1.000000,CLUSTERRATIO=100,SEQUENTIAL_PAGES=0,DENSITY=0,AVERAGE_SEQUENCE_GAP=0.000000,AVERAGE_SEQUENCE_FETCH_GAP=0.000000,AVERAGE_SEQUENCE_PAGES=0.000000,AVERAGE_SEQUENCE_FETCH_PAGES=0.000000,AVERAGE_RANDOM_PAGES=1.000000,AVERAGE_RANDOM_FETCH_PAGES=0.000000,NUMRIDS=35,NUMRIDS_DELETED=0,NUM_EMPTY_LEAFS=0WHERE INDNAME = ’NAME_IND’AND INDSCHEMA = ’SKAPOOR ’AND TABNAME = ’STAFF’AND TABSCHEMA = ’SKAPOOR ’;現在,將 FIRSTKEYCARD、FIRST2KEYCARD、FULLKEYCARD 和 NUMRIDS 從 35 修改為 37。現在保存db2look.out 文件并運行這 3 個文件:db2 -tvf config.out > config_output.outdb2 -tvf storage.out > storage_output.outdb2 terminatedb2stopdb2startdb2 -tvf db2look.out > db2look_output.out
檢查前兩個文件 config_output.out 和 storage_output.out 的內容,以確保它們運行成功。現在,檢查
db2look_output.out 文件的內容。您將看到下列更新語句失敗了:UPDATE SYSSTAT.INDEXES SET NLEAF=1, NLEVELS=1,FIRSTKEYCARD=37, FIRST2KEYCARD=37, FIRST3KEYCARD=-1, FIRST4KEYCARD=-1,FULLKEYCARD=37, CLUSTERFACTOR=-1.000000, CLUSTERRATIO=100, SEQUENTIAL_PAGES=0,DENSITY=0, AVERAGE_SEQUENCE_GAP=0.000000, AVERAGE_SEQUENCE_FETCH_GAP=0.000000,AVERAGE_SEQUENCE_PAGES=0.000000, AVERAGE_SEQUENCE_FETCH_PAGES=0.000000,AVERAGE_RANDOM_PAGES=1.000000, AVERAGE_RANDOM_FETCH_PAGES=0.000000, NUMRIDS=37,NUMRIDS_DELETED=0, NUM_EMPTY_LEAFS=0 WHERE INDNAME =’NAME_IND’ AND INDSCHEMA = ’SKAPOOR ’AND TABNAME = ’STAFF’ AND TABSCHEMA = ’SKAPOOR ’DB21034E The command was processed asan SQL statement because it was not avalid Command Line Processor command.During SQL processing it returned:SQL1227N The catalog statistic "37"for column "FULLKEYCARD" is out of rangefor its target column, has an invalidformat, or is inconsistent in relationto some other statistic. Reason Code = "8".SQLSTATE=23521正如您可以看到的,上面用于索引 NAME_IND 的 UPDATE 語句失敗了,因為 FULLKEYCARD 大于表的基數(CARD)。正如通過
db2look.out 文件中的下列更新語句可以看到的,CARD 是 35:UPDATE SYSSTAT.TABLESSET CARD=35,NPAGES=1,FPAGES=1,OVERFLOW=0,ACTIVE_BLOCKS=0WHERE TABNAME = ’STAFF’ AND TABSCHEMA = ’SKAPOOR ’;
現在,再次以解釋模式運行相同的查詢:db2 "select name from staff where id=10 order by name"
并生成訪問計劃。您將看到它是不同的:Access Plan:-----------Total Cost: 12.972Query Degree: 1RowsRETURN( 1)CostI/O|1TBSCAN( 2)12.9721|1SORT( 3)12.97081|1TBSCAN( 4)12.96821|35TABLE: SKAPOORSTAFF
該示例顯示,假如在表上發生 WRITE 活動時運行 RUNSTATS,統計數據就可能與本示例中的不一致。因此,用于更新統計數據的 UPDATE
語句可能失敗并產生 SQL1227N 錯誤消息。所有的 UPDATE 語句都運行成功十分重要,假如存在不一致性,就應該進行修理并重新運行。本例中,解決方案是將KEYCARDS 和 NUMRIDS 從 37 重新修改為 35。
相關文章:
