2017-03-18 101 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