创建视图,SQL查询性能

时间:2011-09-26 05:28:51

标签: sql performance

我正在尝试创建视图,但是此视图中的select语句花费的时间超过15秒。如何让它更快。我对该视图的查询如下。

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

在此视图之后..我选择查询

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

3 个答案:

答案 0 :(得分:1)

如果没有看到实际数据和表格结构,很难提供建议。我会重写查询,记住这些原则:

  1. 如果可能,请使用内部联接而不是外部联接。
  2. 在COUNT函数中删除case运算符。构建一个查询,以便在WHERE部分中使用不在COUNT中的条件。
  3. 尽量不要在GROUP BY中使用聚合值。目前,您使用聚合值New和Processing进行分组。如果可能,请按现有表值使用GROUP BY。
  4. 如果查询过于复杂,请将其分解为较小的查询,并将结果合并到最终查询中。在这种情况下,编写商店程序可能会有所帮助。
  5. 我希望这会有所帮助。

答案 1 :(得分:1)

为了调整数据库查询,除了@Davyd已经列出的内容之外,我还要添加一些项目:

  1. 查看表格并对这些表格建立索引。放置正确的索引并避免错误的索引会加快查询速度。
  2. where where条件中是否有任何不属于任何索引的内容?有时我们将索引放在列上,在查询中我们在列上使用强制转换或转换。因此,基础指数无效。您可以考虑在列的转换/转换上设置索引。
  3. 查看正常形式的符合性或过度归一化。 3。
  4. 祝你好运。

答案 2 :(得分:0)

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

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

祝你好运。