如何解释查询计划中的巨大成本
How to interpret huge costs in a query plan
在我的查询计划中的某一时刻,成本激增至 98 位数字 (~2e97)。首先,它只是上限 (10^5..2e97),最后是两个边界 (2e97..2e97)。此时,如果您进一步移动到计划的顶部,成本将不再改变,因此该计划变得毫无用处。好像已经饱和了。
我的解释是查询太复杂以至于规划者无法正确评估它并且成本上升直到达到它的极限(大约 2e97)。
这种解释正确吗?您是否有更多关于这种情况如何发生以及可以采取哪些措施来改进 query/plan 的信息?
这里有两个问题。一个是 EXPLAIN
的实际行为,另一个是错误。
第一个问题是,在 Postgres 中,EXPLAIN
成本在最大可能的范围内是真实的,并且忠实于操作所需的实际成本和时间。
在 Redshift 中不是 EXPLAIN
的情况。
在 Redshift 中,成本是任意数字。它们是由开发人员选择的,我认为是为了粗略地控制查询计划程序。
我可以看到这种方法没有优点,缺点也无穷无尽,但它确实存在。 (例如,您无法比较跨查询的成本 - 即使是相同的基本查询,您只是为了找到最有效的解决方案而进行试验)。
因此,例如,在 Redshift 扫描中,table 每行的成本为 1。
排序 table 的成本是 1,000,000,000(十亿),加上每行 1 - 所以扫描 1b 条记录被认为比 排序一行,这太疯狂了。这就是查询规划器有时会出错的原因。
第二个问题是 EXPLAIN
和 DS_DIST_BOTH
显示的成本中存在错误。我相信它使用了一个未初始化的变量,因此其成本大约是宇宙中原子数量的一百万倍。
我确实试图告诉支持人员。我尝试了一段时间然后放弃了。您必须了解 Redshift 支持的局限性——他们不了解 Redshift,而且他们似乎真的无法独立思考很多事情。我离开讨论的观点是有人在某个时候告诉他们计划成本可能会变得非常大,从那时起他们就不可能理解可能会有非常大的数字 它实际上可能是错误的。到目前为止,这并不是我试图让支持人员理解而放弃的唯一错误。
在我的查询计划中的某一时刻,成本激增至 98 位数字 (~2e97)。首先,它只是上限 (10^5..2e97),最后是两个边界 (2e97..2e97)。此时,如果您进一步移动到计划的顶部,成本将不再改变,因此该计划变得毫无用处。好像已经饱和了。
我的解释是查询太复杂以至于规划者无法正确评估它并且成本上升直到达到它的极限(大约 2e97)。
这种解释正确吗?您是否有更多关于这种情况如何发生以及可以采取哪些措施来改进 query/plan 的信息?
这里有两个问题。一个是 EXPLAIN
的实际行为,另一个是错误。
第一个问题是,在 Postgres 中,EXPLAIN
成本在最大可能的范围内是真实的,并且忠实于操作所需的实际成本和时间。
在 Redshift 中不是 EXPLAIN
的情况。
在 Redshift 中,成本是任意数字。它们是由开发人员选择的,我认为是为了粗略地控制查询计划程序。
我可以看到这种方法没有优点,缺点也无穷无尽,但它确实存在。 (例如,您无法比较跨查询的成本 - 即使是相同的基本查询,您只是为了找到最有效的解决方案而进行试验)。
因此,例如,在 Redshift 扫描中,table 每行的成本为 1。
排序 table 的成本是 1,000,000,000(十亿),加上每行 1 - 所以扫描 1b 条记录被认为比 排序一行,这太疯狂了。这就是查询规划器有时会出错的原因。
第二个问题是 EXPLAIN
和 DS_DIST_BOTH
显示的成本中存在错误。我相信它使用了一个未初始化的变量,因此其成本大约是宇宙中原子数量的一百万倍。
我确实试图告诉支持人员。我尝试了一段时间然后放弃了。您必须了解 Redshift 支持的局限性——他们不了解 Redshift,而且他们似乎真的无法独立思考很多事情。我离开讨论的观点是有人在某个时候告诉他们计划成本可能会变得非常大,从那时起他们就不可能理解可能会有非常大的数字 它实际上可能是错误的。到目前为止,这并不是我试图让支持人员理解而放弃的唯一错误。