我遇到过这样的场景:PostgreSQL 数据库上的相同查询在 QA 和 Prod 环境之间表现出不同的索引选择和连接策略。我试图了解这种行为背后的可能原因。
详细信息如下:
质量保证环境:
- 与 Prod 相比数据集更小
- 查询使用嵌套循环连接
- 查询使用
idx_user_id_id_customer_id
索引 - 项目清单
产品环境:
- 与 QA 相比,数据集更大
- 查询使用合并连接
- 查询使用
idx_customer_id
索引 - 索引大小
idx_user_id_customer_id
为118GB,idx_customer_id
索引大小为85GB
两个环境具有相同的索引集。主要区别在于数据的大小和查询优化器选择的执行计划。
产品解释日志: https: //explain.depesz.com/s/28la
QA 解释日志: https: //explain.depesz.com/s/zM6e
1. 两种环境之间索引选择和连接策略差异的可能原因是什么?
2. 是否有任何特定因素影响优化器的决策过程?
以下是我的想法,如有错误,请指正并补充更多信息:
- 它使用嵌套循环连接而不是合并连接,因为在 QA 中,一侧相同记录的行数可能较少。
- 的索引大小
idx_user_id_customer_id
很大,这就是它忽略它的原因。或者可能是选择性user_id
较低,customer_id
这就是它选择的原因customer_id
这就是差异,不同的数据,主要是行数的差异。
是的,数据的大小。根据所操作的数据的大小,查询计划中的不同数据操作是否更有效。对于要连接的较小数据集,嵌套循环通常更有效。合并连接更适合较大的数据集。
保持多个环境足够一致以始终为所有查询获得相同的查询计划是很困难的,但要做到这一点,您必须在所有相关表中跨环境维护一组非常相似的数据。