图中平常的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;
  • 1.
  • 2.
  • 3.
  • 4.

默认值与建议

默认值为 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';
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

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

GaussDB 查看SQL执行计划_查询优化

GaussDB 查看SQL执行计划_执行计划_02

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

GaussDB 查看SQL执行计划_执行计划_03

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

GaussDB 查看SQL执行计划_执行计划_04