2017-03-18 100 views
0

我用下面的查詢:查詢時間優化

select 
    MAX(CASE WHEN hrm.vwPayPersCostCenter.ElmntRef = 21 THEN CAST(hrm.vwPayPersCostCenter.val AS INT) END) AS NEWS, 
MAX(CASE WHEN hrm.vwPayPersCostCenter.ElmntRef = 4 THEN CAST(hrm.vwPayPersCostCenter.val AS INT) END) AS NEWS2, 
MAX(CASE WHEN hrm.vwPayPersCostCenter.ElmntRef = 120 THEN CAST(hrm.vwPayPersCostCenter.val AS INT) END) AS NEWS3 
    FROM hrm.vwPayPersCostCenter 

但它的執行時間很長(3分鐘)

+1

添加數據庫標記 – Mihai

+0

@GurV對不起 這是一個錯誤。 –

+0

你有'val'的索引嗎? –

回答

2

把條件where子句中加快查詢:

select MAX(case when ElmntRef = 21 then CAST(val as int) end) as NEWS, 
    MAX(case when ElmntRef = 4 then CAST(val as int) end) as NEWS2, 
    MAX(case when ElmntRef = 120 then CAST(val as int) end) as NEWS3 
from hrm.vwPayPersCostCenter 
where ElmntRef in (4, 21, 120); 

where如果有使用索引,且只使用ElmntRef 4,第21,120 instea執行這些行中的聚合可以加快行發現過程所有行的數據都是在原始情況下發生的。

,如果你對ElmntRef和Val

create index idx_PayPersCostCenter on hrm.vwPayPersCostCenter(ElmntRef, val); 
+0

thanx.I編輯我的問題 –

+0

@Mahdi - 更新了答案。 – GurV

+0

:我使用何時何地? –

2

兩件事指數以提高性能的查詢將有更好的表現。

  1. 使用WHERE用於過濾
  2. 使用一組通過對ElmntRef然後子句採取MAX hrm.vwPayPersCostCenter.val。真的,如果你在max之外進行轉換爲int,那麼會更好,但我不確定這是什麼類型的數據。

以外的查詢請確保你有一個索引ElmntRefINCLUDE s列hrm.vwPayPersCostCenter.val。因爲您正在投射類型,所以它可能並不重要,如果它是索引的實際部分或只是包含的列,但又取決於該列的當前數據類型。

CREATE NONCLUSTERED INDEX [IX_PayPersCostCenter_ElmntRef] 
    ON hrm.vwPayPersCostCenter(ElmntRef ASC) INCLUDE(val) 

這將產生3行而不是3個額外的列,如果您將結果與您當前的輸出進行比較,基本上會調整結果。

SELECT hrm.vwPayPersCostCenter.ElmntRef, 
    MAX(CAST(hrm.vwPayPersCostCenter.val AS INT)) AS News 
FROM hrm.vwPayPersCostCenter 
WHERE hrm.vwPayPersCostCenter.ElmntRef IN (21, 4, 120) 
GROUP BY hrm.vwPayPersCostCenter.ElmntRef