绝大多数的关系型数据库如Oracle、Postgresql等都提供一些方法用来控制SQL语句的执行。之所以要控制执行,是因为数据库的编译器依赖于表的统计信息去选择合适的执行计划。然而表的统计信息并不是每时每刻都准确的,在这种情况下,编译器可能会错误的选择执行计划,从而导致SQL语句执行效率降低。
举个例子,A表和B表关联,正常情况下应该执行HASH JOIN,但由于统计信息不准确或者其他未知原因,通过执行计划发现他们其实走了NESTED LOOP,从而大大增加了执行时间。
拿ORACLE举例,ORACLE中一般采用在查询语句中添加HINT的方式强制修改执行计划,如下,
select /*+ index(t t_ind) */ count(*) from t;
上面这句话表示强制使用索引扫描执行查询。
又比如Postgresql,一般使用SET命令去强制打开或关闭某个功能,如下,
set enable_nestloop off;
select ...
以上表示在执行查询之间关闭NESTLOOP,这样如果是多表关联的话则绝大部分不会采用NL的方式了。
当然,Trafodion数据库也一样,它也提供了一种可以控制查询执行的方法,在Trafodion中使用CQD语法去控制查询的执行。以下就介绍一下CQD的相关用法。
CONTROL QUERY DEFAULT --改变进程执行计划
- 语法
{CONTROL QUERY DEFAULT | CQD} attribute {'attr-value' | RESET}
- 例子
CONTROL QUERY DEFAULT HBASE_MAX_COLUMN_NAME_LENGTH '200';
CONTROL QUERY DEFAULT HBASE_MAX_COLUMN_NAME_LENGTH RESET;
下面通过具体例子来说明,如何通过CQD让两个表关联从HASH_JOIN变为MERGE_JOIN的,
SQL>explain options 'f'
+>select test1.a, test1.b, test2.c
+>from test1 join test2
+>on test1.a = test2.a;
LC RC OP OPERATOR OPT DESCRIPTION CARD
---- ---- ---- -------------------- -------- -------------------- ---------
3 . 4 root 2.00E+000
2 1 3 hybrid_hash_join u 2.00E+000
. . 2 trafodion_scan TEST2 3.00E+000
. . 1 trafodion_scan TEST1 2.00E+000
--- SQL operation complete.
SQL>cqd hash_joins 'off';
SQL>fc 7
SQL>explain options 'f'
....
SQL>select test1.a, test1.b, test2.c
....
SQL>from test1 join test2
....
SQL>on test1.a = test2.a;
....
LC RC OP OPERATOR OPT DESCRIPTION CARD
---- ---- ---- -------------------- -------- -------------------- ---------
3 . 4 root 2.00E+000
1 2 3 merge_join 2.00E+000
. . 2 trafodion_scan TEST2 3.00E+000
. . 1 trafodion_scan TEST1 2.00E+000
--- SQL operation complete.
SHOWCONTROL --显示设置的CQD
- 语法
SHOWCONTROL {ALL | [QUERY] DEFAULT [attribute-name[, MATCH {FULL | PARTIAL}]]}
- 例子
SQL>showcontrol default;
CONTROL QUERY DEFAULT
HASH_JOINS OFF
GENERATE_EXPLAIN ON
--- SQL operation complete.
SQL>showcontrol all;
No CONTROL QUERY SHAPE settings are in effect.
No CONTROL SESSION settings are in effect.
No CONTROL TABLE settings are in effect.
No CONTROL QUERY DEFAULT settings are in effect.
Current DEFAULTS
AUTO_QUERY_RETRY_WARNINGS OFF
BLOCK_TO_PREVENT_HALLOWEEN ON
CACHE_HISTOGRAMS_REFRESH_INTERVAL 3600
CATALOG TRAFODION
COMPRESSION_TYPE NONE
DEFAULT_DEGREE_OF_PARALLELISM 2
DEF_MAX_HISTORY_ROWS 1024
DISPLAY_DIVISION_BY_COLUMNS OFF
EXE_MEMORY_LIMIT_PER_CPU 0
EXPLAIN_DESCRIPTION_COLUMN_SIZE -1
HASH_JOINS ON
HIST_AUTO_GENERATION_OF_SAMPLE OFF
HIST_MISSING_STATS_WARNING_LEVEL 4
HIST_NO_STATS_REFRESH_INTERVAL 3600
HIST_PREFETCH ON
HIST_REMOVE_TRAILING_BLANKS ON
HIST_ROWCOUNT_REQUIRING_STATS 50000
HIST_USE_SAMPLE_FOR_CARDINALITY_ESTIMATION ON
INSERT_VSBB SYSTEM
ISOLATION_LEVEL READ_COMMITTED
ISOLATION_LEVEL_FOR_UPDATES NONE
JOIN_ORDER_BY_USER OFF
LAST0_MODE OFF
MC_SKEW_SENSITIVITY_THRESHOLD 0.1
MDAM_NO_STATS_POSITIONS_THRESHOLD 10
MDAM_SCAN_METHOD ON
MDAM_UNDER_NJ_PROBES_THRESHOLD 0
MERGE_JOINS ON
MULTI_COMMIT_SIZE 10000
MVGROUP_AUTOMATIC_CREATION ON
MVQR_REWRITE_ENABLED_OPTION OFF
MVQR_REWRITE_LEVEL 0
MVQR_REWRITE_SINGLE_TABLE_QUERIES ON
MV_AGE
MV_ALLOW_SELECT_SYSTEM_ADDED_COLUMNS OFF
NESTED_JOINS ON
NOT_ATOMIC_FAILURE_LIMIT 32000
OPI_ERROR73_RETRIES 10
OPTIMIZATION_LEVEL 3
PARALLEL_NUM_ESPS SYSTEM
POS_ABSOLUTE_MAX_TABLE_SIZE
PUBLISHING_ROLES
QUERY_CACHE 16384
QUERY_LIMIT_SQL_PROCESS_CPU 0
RISK_PREMIUM_NJ 1.0
RISK_PREMIUM_SERIAL 1.0
RISK_PREMIUM_SERIAL_SCALEBACK_MAXCARD_THRESHOLD 10000
ROBUST_QUERY_OPTIMIZATION SYSTEM
SAVE_DROPPED_TABLE_DDL OFF
SCHEMA SEABASE
SKEW_EXPLAIN ON
SKEW_ROWCOUNT_THRESHOLD 1000000
SKEW_SENSITIVITY_THRESHOLD 0.1
STREAM_TIMEOUT -1
SUBQUERY_UNNESTING ON
TABLELOCK SYSTEM
TIMEOUT 6000
TRAF_TRANS_TYPE MVCC
UDR_DEBUG_FLAGS 0
UDR_JVM_DEBUG_PORT 0
UDR_JVM_DEBUG_TIMEOUT 0
UPD_ORDERED ON
USTAT_AUTO_CV_SAMPLE_SLOPE 0.5
USTAT_AUTO_PRIORITY 150
USTAT_MAX_READ_AGE_IN_MIN 5760
USTAT_MIN_ROWCOUNT_FOR_LOW_SAMPLE 1000000
USTAT_MIN_ROWCOUNT_FOR_SAMPLE 10000
USTAT_NECESSARY_SAMPLE_MAX 5000000
USTAT_OBSOLETE_PERCENT_ROWCOUNT 15
WMS_CHILD_QUERY_MONITORING OFF
WMS_QUERY_MONITORING OFF
--- SQL operation complete.