我们的Redshift查询在首次执行时非常慢。后续执行要快得多(例如,45秒 - > 2秒)。在调查此问题后,查询编译似乎是罪魁祸首。这是一个已知问题,甚至在AWS Query Planning And Execution Workflow和Factors Affecting Query Performance页面上引用。亚马逊本身非常tight lipped关于查询缓存如何工作(tl; dr它是一个你不应该担心的魔术黑盒子)。
我们尝试过的一件事就是增加了我们拥有的节点数量,但是我们并没有想到它会解决任何问题,因为查询编译无论如何都是单节点操作。它没有解决任何问题,但它有点转移。
如上所述,这是一个众所周知的问题,但是,无论在网上讨论什么问题,唯一的问题就是“这只是你必须要使用Redshift的东西”或“这里是一个超级kludgy解决方案,只适用于时间,因为我们不知道查询缓存如何工作“。
我们可以做些什么来加快编译过程或以其他方式解决这个问题?到目前为止,已找到的最佳解决方案是“预先运行您可能希望在某一天按计划运行的每个查询”,这不是很好,特别是考虑到我们对查询缓存的工作原理知之甚少
答案 0 :(得分:2)
有三件事需要考虑
SET enable_result_cache_for_session TO OFF;
考虑到您的问题,您可能需要运行一些示例查询来预编译或重新设计您的查询(我猜您正在进行一些动态查询构建,这会大大改变查询的形状)。 根据我的经验,更多节点将增加编译时间。此过程发生在主节点而非数据节点上,并且通过考虑更多数据节点而变得更加复杂。
答案 1 :(得分:1)
查询可能实际上并没有第二次运行 - 相反,Redshift只是为同一个查询返回相同的结果。
可以通过关闭缓存来测试。运行此命令:
SET enable_result_cache_for_session TO OFF;
然后,运行查询两次。每次执行都需要相同的时间。
结果缓存非常适合重复查询。而不是对第一次执行“缓慢”感到失望,请为随后的缓存查询“快速”而感到高兴!