2011-09-26 66 views
1

我正在尝试创建视图,但从此视图中选择语句需要超过15秒。如何使其更快。我对该视图的查询如下。创建视图,SQL查询性能

create view Summary as 

select distinct A.Process_date,A.SN,A.New,A.Processing, 

COUNT(case when B.type='Sold' and A.status='Processing' then 1 end) as Sold, 

COUNT(case when B.type='Repaired' and A.status='Processing' then 1 end) as Repaired, 

COUNT(case when B.type='Returned' and A.status='Processing' then 1 end) as Returned 

from 

(select distinct M.Process_date,M.SN,max(P.enter_date) as enter_date,M.status, 

COUNT(case when M.status='New' then 1 end) as New, 

COUNT(case when M.status='Processing' and P.cn is null then 1 end) as Processing 

from DB1.dbo.Item_details M 

left outer join DB2.dbo.track_data P on M.SN=P.SN 

group by M.Process_date,M.SN,M.status) A 

left outer join DB2.dbo.track_data B on A.SN=B.SN 

where A.enter_date=B.enter_date or A.enter_date is null 

group by A.Process_date,A.New,A.Processing,A.SN 

这view..my选择查询后

select distinct process_date,sum(New),sum(Processing),sum(sold),sum(repaired),sum(returned) from Summary where month(process_date)=03 and year(process_date)=2011 

请建议我什么改变来进行的查询执行得更快。

谢谢 ARB

+1

重复使用'select distinct ...'是第一个迹象表明一切都不好 - 如果你得到重复的行,为什么?以合理的方式消除重复,而不是像“select distinct ...”那样使用创可贴是首先要解决的问题。 –

+1

'Distinct'不是为你做任何事情,'组by'已经使结果不同。可能不会加速任何东西,因为查询优化器会知道,不同的是多余的,但没有额外的关键字视图定义会更清晰。 –

回答

1

这是很难给意见没有看到实际的数据和表的结构。我会重写这些查询记住这些原则:

  1. 如果可能,请使用内部联接而不是外部联接。
  2. 摆脱COUNT函数内的case操作符。构建查询,以便在COUNT中的WHERE部分中使用条件。
  3. 尽量不要在GROUP BY中使用聚合值。目前,您使用聚合值New和分组处理。如果可能的话,使用现有表值的GROUP BY。
  4. 如果查询太复杂,请将其分解为更小的查询并将结果合并到最终查询中。在这种情况下编写存储过程可能会有所帮助。

我希望这会有所帮助。

+0

我已经打听到你放什么在这里,在不同的答案。 – Kangkan

0

如果你正在使用Postgresql,我建议你使用一个像“http://explain.depesz.com/”这样的工具,以便更清楚地看到你的查询的哪一部分很慢。根据你得到的结果,你可以优化你的索引,或者重写你的部分查询。如果您正在使用其他数据库,我确定存在类似的工具。

如果这些想法都没有帮助,最终的解决方案是创建一个“物化查询”。网上有很多关于此的信息。

祝你好运。

1

调谐数据库查询,我将增加额外的什么@Davyd已经上市的几个项目:

  1. 看表和索引这些表。把正确的索引和避免错误的索引加速查询。
  2. Where条件中是否有任何不属于任何索引的部分?有时我们把索引放在一列上,在查询中我们在列上使用了转换或转换。所以基础指数并不有效。您可以考虑在列的转换/转换中设置索引。
  3. 看看正常形式的整合还是过于正常化。 3.

祝你好运。

+0

好点。我认为如果在连接中使用这些字段,他应该已经有了索引。 – Davyd

+0

感谢球员...我没有我的表中的任何索引..我想我应该考虑这样做,现在.. @Davyd:我的印象中,我使用的CASE操作的方式提高查询性能..呵呵下...我会再试一次.. :) – ARB

+0

@ARB:好,你有继续的方式。祝你好运! – Kangkan