2013-05-22 28 views
0

我有一個查詢,如下,使用指數超過SUM函數在DB2

SELECT SUM(SOLD_QTY_CNT) AS QUANTITY, DENOM_AM, SUM(LIN_AM) AS LINE_AMT, 
    LIN_AM AS O_LINE_AMT, ORD_DTL_ID 
    FROM MyTable GROUP BY ORD_DTL_ID, LIN_AM, DENOM_AM 
    WITH UR; 

我的查詢是優化/更好的方式來重寫此查詢。 由於它有一個SUM函數,所以希望爲涉及的所有列創建索引不會有幫助。

當我把aove的訪問計劃稱爲close to 70k..由於使用的表是非常大的表。

所以請推薦一些方法來優化查詢。

TIA。

+0

你嘗試了DB2設計顧問 - 這可能表明,有利於您查詢的索引,如果它不存在。 – mustaccio

+1

個人而言,我懷疑{'ORD_DTL_ID','LIN_AM','DENOM_AM'}(可能包括'SOLD_QTY_CNT'作爲附加列)上的索引將會有所幫助 - 儘管如果你能夠獲得更好的結果,對'LINE_AMT'進行求和'(通過執行'COUNT(*)* LIN_AM')作弊將取決於優化器的工作方式。 –

+0

時鐘 - 選擇查詢具有函數「SUM」,因此將索引工作? –

回答

1

嘗試運行db2advis工具

db2advis -d <database-name> -s "<your above query, try entering in one line>" 

那麼這表明你在創建不需要的人的指標和清除。按照其中的建議,應該做到這一點。

+0

嗨,感謝您的時間和精力put.i試着運行這個,但我得到了一個錯誤 db2 => db2advis -d PWEBS00D -s SELECT SUM(SOLD_QTY_CNT)AS QUANTITY,DENOM_AM,SUM(LIN_AM)AS LINE_AMT,LIN_AM AS O_LINE_AMT,ORD_DTL_ID FROM WEBSS.P0066_SELECTION GROUP BY ORD_DTL_ID,LIN_AM,DENOM_AM DB21034E該命令是作爲SQL語句處理的,因爲它不是 有效的命令行處理器命令。在SQL處理期間,它返回: SQL0104N意外的標記 「db2advis -d PWEBS00D -s SELECT SUM」 被發現 以下 「BEGIN-OF-STATEMENT」。預期的令牌可能包括: 「」。 SQLSTATE = 42601 –

+0

db2 => db2advis -d PWEBS00D -s「SELECT SUM(SOLD_QTY_CNT)AS QUANTITY,DENOM_AM,SUM(LIN_AM)AS LINE_AMT,LIN_AM AS O_LINE_AMT,ORD_DTL_ID FROM WEBSS.P0066_SELECTION GROUP BY ORD_DTL_ID,LIN_AM,DENOM_AM」 DB21034E該命令是作爲SQL語句處理的,因爲它不是 有效的命令行處理器命令。在SQL處理過程中,它返回: SQL0104N在 「BEGIN-OF-STATEMENT」後找到意外令牌「db2advis」。預期的令牌可能包括:「DECLARE」。 SQLSTATE = 42601 –

+0

請推薦一些方法?它是另一種工具嗎?我需要安裝任何東西嗎? –

1

如果您的服務器是DB2 for i,那麼可以考慮使用Encoded Vector Index。但是,通過查詢中的名稱進行猜測,對於此方法,組合鍵的基數可能相當高。