2013-02-28 324 views
0

我想優化下面的SQL,但我的SQL優化知識是相當綠色的,我沒有取得多大進展(我概括了列和其他標識符由於公司策略)在當前狀態下,此SQL根據負載運行1到2分鐘之間的任何時間。 VKTINFO表包含約100萬條記錄,GNTINFO表包含約300萬條記錄。通常情況下,如果這是一個批處理過程,1-2分鐘不會有什麼大不了的,但是我們有代理需要這些信息,並儘可能快地生效 - 更糟糕的是,我們的系統最終超時並返回一個錯誤用戶。但是,不能延長超時窗口。我們還有其他標準可以根據名字,郵政編碼,帳戶類型,帳戶狀態等等,但是當執行如下的廣泛搜索時,查詢變得相當慢。需要幫助優化非常慢的DB2 SQL查詢觸及數百萬條記錄

如果有任何關於如何操縱這個SQL來加速select的建議/技巧,我將不勝感激關於此事的任何想法。如果需要更多信息,我會很樂意儘可能提供符合我們公司政策的信息。

編輯: 這裏要求的是VKTINFO和GNTINFO表的索引。

  • ACCOUNT_NUMBER
  • 到期日期
  • EFFECTIVE_DATE

指標爲gnt_account_info和vkt_account_info:

  • pi_account_num
  • pi_policy_num_gid

指數爲gntnad和vktnad表:

  • nad_account_number
  • nad_name_type

指數爲gntpolrf和vktpolrf表:

  • xrf_account_number
select 
processing_system, 
total_premium, 
quote_by, 
email_address, 
account_number, 
expiration_date, 
account_state, 
xrf_file, 
customer_name 
from 
(
    select 
    'ABCD' as processing_system, 
    total_premium, 
    quote_by, 
    email_address, 
    account_number, 
    expiration_date, 
    account_state, 
    xrf_file, 
    customer_name 
    from vktinfo 
    left outer join vkt_account_info on account_number = pi_account_number 
    left outer join vktpolrf on account_number = xrf_account_number 
    left outer join VKTNAD on account_number = nad_account_number 
    and history_expiration_date=nad_history_expiration_date 
    and nad_name_type='HA' 
    WHERE effective_date >= '2013-02-01' 
    AND effective_date <= '2013-02-28' 
    AND customer_name like '_SMITH%' 
    AND account_state = 'South Carolina' 
    union all 
    select 
    'EFGH' as processing_system, 
    total_premium, 
    quote_by, 
    email_address, 
    account_number, 
    expiration_date, 
    account_state, 
    xrf_file, 
    customer_name 
    from gntinfo 
    left outer join gnt_account_info on account_number = pi_account_number 
    left outer join vktpolrf on account_number = xrf_account_number 
    left outer join GNTNAD on account_number = nad_account_number 
    and history_expiration_date=nad_history_expiration_date 
    and nad_name_type='HA' 
    WHERE effective_date >= '2013-02-01' 
    AND effective_date <= '2013-02-28' 
    AND customer_name like '_SMITH%' 
    AND account_state = 'South Carolina' 
) 
a 
order by customer_name ASC fetch first 1000 rows only WITH UR 
+3

請發佈(添加到問題)你有什麼索引。 – 2013-02-28 21:28:08

+0

這不會解決您的問題,但我建議在您的連接前加上 – 2013-02-28 21:32:53

+3

您可以將執行計劃粘貼到您的問題中嗎?聯合SELECT語句中的WHERE子句是相同的;值得*測試*優化器是否會通過從子查詢中切下兩個WHERE子句並將其中一個子元素粘貼到外部查詢中來做出更好的決策。但首先看執行計劃。 – 2013-02-28 21:42:49

回答

1

我沒有一個堅實的答案給你。但我確實有一些事情可以嘗試。我瞭解您無權獲得執行計劃。

  • 檢查與別人誰一直在那裏了一會兒,詢問您是否應該到能夠運行EXPLAIN。
  • 您可能需要account_state上的索引。經驗法則:索引連接條件或WHERE子句中使用的每一列。有時多列索引執行的效果要好於多個單列索引。
  • 嘗試移動子查詢的WHERE子句中的每個部分,即可以將移動到外部查詢,並測試兩件事。
    • 在外部查詢中的普通WHERE子句中使用這些部分。
    • 重新排列外層查詢,以便從 UNIONed子查詢中選擇,而不是對其進行內連接。
  • 確定是否有任何左外部聯接可以被內部聯接替換。存儲「nad_name_type」的表是內連接的可能候選對象。 (你明白爲什麼嗎?)
  • 測試子查詢在作爲視圖實現時的性能。你可能需要DBA的幫助。 (如果他們不讓你運行EXPLAIN,他們可能不會讓你創建視圖。)
  • 測試子查詢在作爲物化查詢表實現時的性能。您也可能需要DBA幫助。
+0

Mike,謝謝你的建議。我今天上午根據你的要點深入探討了這個問題,並注意到一個特點。我們有兩列引用美國國家 - 您建議我們放置索引的account_state和代表客戶家庭地址狀態的另一列。家庭地址狀態有一個索引,因爲account_state沒有(儘管在我們的SQL中使用)。作爲一個概念證明,我換入索引狀態列搜索反對代替非索引 - 160秒減少到1.5秒。我會考慮讓DBA創建一個索引。 – 2013-03-01 16:50:38