Redshift:查询结果缓存与查询编译缓存

Posted

技术标签:

【中文标题】Redshift:查询结果缓存与查询编译缓存【英文标题】:Redshift: Query Result Cache vs Query Compilation Cache 【发布时间】:2018-11-29 05:18:46 【问题描述】:

这个问题与Redshift中的结果缓存和查询编译缓存有关。

我正在对执行时间的查询进行基准测试。我昨天运行了相同的查询集来测试查询编译缓存,它们以毫秒为单位运行。今天我再次尝试测试执行时间,但启用会话缓存并检查执行时间以供后续运行。今天的执行时间比昨天多很多。

问题

在打开结果缓存的情况下执行查询是否会影响执行时间? 同样的查询在会话关闭结果缓存的情况下运行速度比打开缓存结果时快,这是为什么呢? 查询编译缓存保留什么时间范围或多少次查询运行?

Benchmarking Snapshot

附注我阅读了一堆关于查询编译缓存和结果缓存的文章和帖子,但没有找到任何具体的答案。

感谢和问候。

【问题讨论】:

【参考方案1】:

您需要考虑查询编译时间和结果缓存,它们是完全不同的东西。

sql“模板”的第一次运行速度较慢,因为 redshift 必须对其进行优化(编译)。我认为清除此编译的唯一方法是重新启动 redshift。

结果缓存是完全不同的,如果你重新运行完全相同的sql,那么结果缓存会在打开时返回结果。

例如对于给定的查询

select * from table where xyz='example1';

第一次运行将编译查询,因此需要更长的时间。这个过程取决于sql的复杂程度,非常复杂的sql可能需要30秒才能编译。

如果您打开了查询结果缓存,则第二次运行精确相同的查询

select * from table where xyz='example1';

可能需要 100 毫秒或更短的时间(如果结果很大,则不包括网络时间)

但是,如果您运行类似的查询,例如 select * from table where xyz='example2';

这不能使用结果缓存,但可以使用第一个查询的编译版本,因此它会高效运行。

如果您要运行不同的查询,例如

select * from table where xyz='example1' order by 1 desc;

然后将不使用缓存,需要进行编译。

因此,为了进行适当的基准测试,请关闭结果缓存但放弃任何给定查询模式的第一次运行。

【讨论】:

所以它们完全没有关系对吧?我在启用和不启用结果缓存的情况下运行了相同的查询,结果看起来不同,所以我想知道这是怎么发生的。 从结果缓存中回答的查询极快返回。使用此查询来检查查询是否使用了缓存结果:SELECT * FROM svl_qlog WHERE query = 1234567;。如果填充了source_query 列,则表示结果来自缓存。 嗨,乔,感谢您的回答。我的问题是,当结果缓存打开与关闭时,redshift 是否需要时间来编译查询。 编译缓存和结果缓存是不同的东西。如果查询命中结果缓存,那么编译当然不会发生。如果查询未命中结果缓存,则可能需要对其进行编译,具体取决于它是否在编译缓存中。如果查询在结果缓存中,那么它可能也在编译缓存中,因此类似的查询可能会使用编译缓存(但当然不能使用结果缓存,除非它与之前的查询完全相同并且基础数据没有改变)

以上是关于Redshift:查询结果缓存与查询编译缓存的主要内容,如果未能解决你的问题,请参考以下文章

查询缓存amazon redshift

MySQL/MariaDB---查询缓存与存储引擎

MySQL查询缓存详解

AWS Redshift ETL的几个性能最佳实践

12.查询缓存

mybaits的一级缓存与二级缓存