使用GPORCA时的考虑

使用GPORCA时的考虑

用GPORCA最优化执行查询需要考虑的查询条件。
确保满足下列条件:
  • 表不含有多列分区键。
  • 多级分区表是一个统一多级分区表。请见关于统一多级分区表.
  • 在针对只存在于Master的表(例如系统表pg_attribute)运行时,服务器配置参数optimizer_enable_master_only_queries被设置为on。有关该参数的信息,请见Greenplum数据库参考指南
    Note: 启用这一参数会降低catalog短查询的性能。为了避免这一问题,只对会话或者查询设置这一参数。
  • 已经在分区表的根分区上收集了统计信息。

如果分区表包含超过20,000个分区,考虑重新设计该表的模式。

这些服务器配置参数影响GPORCA查询处理。

  • optimizer_cte_inlining_bound 控制对公共表表达式(CTE)查询(含有WHERE子句的查询)执行的内联量。
  • optimizer_force_multistage_agg 强制GPORCA为标量区分限制聚集选择一种3阶段聚集计划。
  • optimizer_force_three_stage_scalar_dqa 强制GPORCA在生成了带有多阶段聚集的计划时选择它。
  • optimizer_join_order为连接排序设置查询优化级别,通过指定要评估哪些类型的连接排序选项。
  • optimizer_join_order_threshold指定GPORCA使用基于动态编程的连接排序算法的最大连接子数。
  • optimizer_nestloop_factor控制查询优化时应用到嵌套循环连接的代价因子。
  • optimizer_parallel_union控制对于含有UNION或者UNION ALL子句的查询发生的并行量。当该值为on时,GPORCA可以生成一个查询计划,其中UNION或者UNION ALL操作的子操作在Segment实例上并行执行。
  • optimizer_sort_factor 控制GPORCA在查询优化时应用于排序操作的代价因子。当出现数据倾斜时可以为查询调整代价因子。
  • gp_enable_relsize_collection控制GPORCA(和传统查询优化器)处理一个没有统计信息的表的方式。默认情况下,如果统计信息不可用,GPORCA使用默认值估计行数。当该值为on,GPORCA使用表的估计大小(如果没有统计数据)。

    对于分区表的根分区,此参数将被忽略。如果根分区没有统计信息,GPORCA总是使用默认值。你可以使用ANALZYE ROOTPARTITION收集根分区的统计信息。 请见ANALYZE

这些服务器配置参数控制信息的显示和记录。

  • optimizer_print_missing_stats控制有关对查询缺失统计信息的列的信息显示(默认是true)
  • optimizer_print_optimization_stats控制GPORCA查询优化度量对于查询的记录(默认为off)

有关这些参数的信息请见Greenplum数据库参考指南

GPORCA生成minidump来描述一个给定查询的优化上下文。 该文件中的信息不太容易被用于调试或者排错。minidump文件位于Master的数据目录中并且使用下面的命名格式:

Minidump_date_time.mdp

有关minidump文件的信息,请见Greenplum数据库参考指南中的服务器配置参数 optimizer_minidump

EXPLAIN ANALYZE 命令使用GPORCA时,EXPLAIN计划只显示被消除的分区数。被扫描的分区不被显示。 要在Segment日志中显示被扫描分区的名字,可设置服务器配置参数gp_log_dynamic_partition_pruningon。 下面这个SET命令的例子启用该参数。

SET gp_log_dynamic_partition_pruning = on;