好好生活
  平平淡淡每一天

编辑

GaussDB 查看SQL执行计划

图中平常的explain计划结果中如果没有明显的Index Scan或Index Only Scan看不出来是否走索引,分布式数据库需要set enable_fast_query=off设置会话级别的参数修改再执行explain查看计划可以看出(设置为on,表示执行计划在cn和dn上各自生成,off表示在分布式框架中执行计划在cn上生成然后发送到dn上执行)。判断是否走索引:如果执行计划结果包含Index Scan或Index Only Scan,表示命中索引;如果显示Seq Scan(全表扫描,包含on table),则未命中索引。

查询优化器开关

enable_fast_query_shipping 是 GaussDB 数据库的一个参数,用于控制查询优化器是否使用分布式框架生成执行计划。该参数的取值直接影响查询执行策略和性能优化方式。

参数功能

on‌:执行计划在协调节点(CN)和数据节点(DN)各自生成,适用于可完全下推至 DN 执行的查询,能更高效利用分布式集群性能。
但是调试时看不到具体的执行计划。 ‌

off‌:执行计划由 CN 生成后下发至 DN 执行,适用于需要 CN 进一步处理结果的复杂查询(如含聚合、排序等操作)。
但是调试时可以具体的执行计划。 ‌ ‌

设置方式

通过 SQL 命令动态调整参数值,以下为会话级别的参数设置方式

-- 关闭
SET enable_fast_query_shipping = off;
-- 开启
SET enable_fast_query_shipping = on;

默认值与建议

默认值为 ‌on‌,适用于简单查询或可完全下推的场景。若查询包含聚合(agg)、窗口函数(window function)、排序(sort)、限制(limit/offset)等操作,可能无法下推,需调整为 ‌off‌。 ‌

注意事项

关闭该参数可能导致查询效率下降,尤其是涉及多节点数据交互的复杂查询。建议根据具体查询类型和性能测试结果调整。 ‌

通过Explain查看SQL是否命中索引

如果执行计划结果显示 Index ScanIndex Only Scan,表示命中索引;
如果执行计划结果显示 Seq Scan(全表扫描,包含on table) ,则未命中索引。

-- 关闭后可以看到详细的执行计划
SET enable_fast_query_shipping = off;
-- 查看sql执行计划
explain (analyze,buffers,verbose)
-- explain (format json)
-- explain analyze
select column1,column2 from table1 where column1='majiali' and column2='mjtabu';

命中索引场景:筛选条件为索引字段,查询字段为索引字段
筛选字段的顺序不影响是否命中索引,这一点和mysql的最左原则不同

image
image

未命中索引场景:筛选条件为索引字段,查询字段为全表字段
image

未命中索引场景:筛选条件为非索引字段,查询字段为索引字段
image

posted @ 2025-07-18 09:59  踏步  阅读(58)  评论(0)    收藏  举报