首次运行的查询非常慢

时间:2018-03-29 16:26:44

标签: amazon-web-services amazon-redshift database-performance

我们的Redshift查询在首次执行时非常慢。后续执行要快得多(例如,45秒 - > 2秒)。在调查此问题后,查询编译似乎是罪魁祸首。这是一个已知问题,甚至在AWS Query Planning And Execution WorkflowFactors Affecting Query Performance页面上引用。亚马逊本身非常tight lipped关于查询缓存如何工作(tl; dr它是一个你不应该担心的魔术黑盒子)。

我们尝试过的一件事就是增加了我们拥有的节点数量,但是我们并没有想到它会解决任何问题,因为查询编译无论如何都是单节点操作。它没有解决任何问题,但它有点转移。

如上所述,这是一个众所周知的问题,但是,无论在网上讨论什么问题,唯一的问题就是“这只是你必须要使用Redshift的东西”或“这里是一个超级kludgy解决方案,只适用于时间,因为我们不知道查询缓存如何工作“。

我们可以做些什么来加快编译过程或以其他方式解决这个问题?到目前为止,已找到的最佳解决方案是“预先运行您可能希望在某一天按计划运行的每个查询”,这不是很好,特别是考虑到我们对查询缓存的工作原理知之甚少

2 个答案:

答案 0 :(得分:2)

有三件事需要考虑

  1. 任何查询的第一次运行都会导致查询被"编译"通过 红移。这可能需要2-20秒,具体取决于它有多大。 后续执行相同的查询使用相同的编译代码, 即使where子句参数发生了变化,也没有重新编译。
  2. 数据的测量标记为" hot"何时运行查询 反对它,并缓存在红移内存中。你不能(可靠地)手动 除非重新启动集群,否则请以任何方式清除它。
  3. Redshift将"结果缓存",具体取决于您的redshift参数 (默认情况下启用)redshift将快速返回相同的结果 对于完全相同的查询,如果基础数据没有改变。如果 您的查询包括current_timestamp或类似,然后这将 如果从缓存停止。可以使用SET enable_result_cache_for_session TO OFF;
  4. 关闭此功能

    考虑到您的问题,您可能需要运行一些示例查询来预编译或重新设计您的查询(我猜您正在进行一些动态查询构建,这会大大改变查询的形状)。 根据我的经验,更多节点将增加编译时间。此过程发生在主节点而非数据节点上,并且通过考虑更多数据节点而变得更加复杂。

答案 1 :(得分:1)

查询可能实际上并没有第二次运行 - 相反,Redshift只是为同一个查询返回相同的结果。

可以通过关闭缓存来测试。运行此命令:

SET enable_result_cache_for_session TO OFF;

然后,运行查询两次。每次执行都需要相同的时间。

结果缓存非常适合重复查询。而不是对第一次执行“缓慢”感到失望,请为随后的缓存查询“快速”而感到高兴!