sql视图性能优化

阿里夫

我有以下定义的观点

create view mydashboard as
SELECT distinct 
       cu.CrimeID, 
       ad.DeptID, 
       ad.CrimeDate, 
       cd.DeptIncidentID, 
       ad.crime,
       u.username 
from alldatescrimes ad
inner join crimeslist cl
on
ad.crime =  cl.crime
inner join users u
on
u.DeptID = ad.DeptID
left join crimelookup cu
on cu.CrimesListID = cl.CrimeListID
left join crimesdetail cd
on
ad.CrimeDate = cast(cd.CrimeDate as date)
and
ad.DeptID = cd.DeptID
and
cu.CrimeID = cd.CrimeID

我的问题是,如果我在视图外放置where子句,则查询运行非常缓慢。请参阅以下示例

select *
from mydashboard 
where

(username  = 'john'
or
DeptIncidentID is null
)
and
CrimeDate = '2014-06-16'

相反,如果我在视图中放入相同的where子句,则查询会非常快速地运行..就像在2-3秒内

我的问题是,如果将where子句放在视图外部,可以采取哪些步骤来使查询快速运行。我在报表中使用此视图,查询运行缓慢

关于阿里夫

随机种子

MySQL有两个选项可以处理在查询中使用的视图:MERGETEMPTABLE

对于MERGE,将引用视图的语句文本和视图定义合并,以使视图定义的各个部分替换该语句的相应部分。

对于TEMPTABLE,视图的结果被检索到临时表中,然后该表用于执行该语句。

由于DISTINCT视图定义中的子句,MySQL无法使用该MERGE算法。它必须退回效率较低的TEMPTABLE算法。

临时表没有索引,因此必须扫描整个表以处理外部WHERE条件。

您可能DISTINCT要从视图定义中删除该子句,并将其放在外部查询中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章