查看时间比查询时间长

Posted

技术标签:

【中文标题】查看时间比查询时间长【英文标题】:View takes longer than query 【发布时间】:2013-07-08 16:04:51 【问题描述】:

我有一个需要 20 秒才能运行的视图,其中运行与它自己的查询完全相同的 SQL 只需不到一秒。有谁知道这是什么原因,或者我可以做些什么来加快查看速度?

这是一个非常简单的视图,大约有 7 个 LEFT JOINS 和一些“每组最大 n 个”嵌套查询。例如

select t.id, t.rev, t.contents
from MyTable t
inner join(
    select id, max(rev) rev
    from MyTable
    group by id
) in on t.id = in.id and t.rev = in.rev

【问题讨论】:

【参考方案1】:

您可以通过使用窗口函数替换聚合和连接来加速:

select t.id, t.rev, t.contents
from (select t.id, t.rev, t.contents, MAX(rev) over (partition by id) as maxrev
      from MyTable t
     ) t
where t.rev = t.maxrev;

视图和查询之间性能差异的原因可能是由于编译。视图在第一次运行时被编译(和优化)。从那时起,数据可能已经改变,或者您使用它的方式可能已经改变。如果数据发生变化,您可以重新编译视图以获得更好的执行计划。

【讨论】:

以上是关于查看时间比查询时间长的主要内容,如果未能解决你的问题,请参考以下文章

我想减少 MYSQL 查询执行时间。我的查询需要很长时间?

impala 取消注册查询到很长时间

如何找到长时间运行的查询?

SQL 调优,长时间运行的查询 + rownum

MySQL 查询:长时间处于“init”状态

查询需要很长时间