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

时间:2018-11-29 05:18:46

标签: caching amazon-redshift

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

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

问题

  • 在打开结果缓存的情况下执行查询会影响执行时间吗?
  • 关闭会话的结果缓存的同一查询的运行速度确实比打开缓存结果时的运行速度快,为什么?
  • 查询编译缓存保留什么时间范围或运行多少查询?

Benchmarking Snapshot

P.S。我读了很多有关查询编译缓存和结果缓存的文章和帖子,但是没有找到任何具体答案。

感谢和问候。

1 个答案:

答案 0 :(得分:0)

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

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

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

例如给定查询

select * from table where xyz='example1';

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

如果您打开了查询结果缓存,则再次运行完全相同的查询

select * from table where xyz='example1';

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

但是,如果您运行类似的查询,例如     从xyz ='example 2 ';

的表中选择*

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

如果要运行其他查询,例如

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

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

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