使用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_pruning为on。 下面这个SET命令的例子启用该参数。
SET gp_log_dynamic_partition_pruning = on;