mysql8并⾏查询_并⾏查询(ParallelQuery)
通过Hint来控制并⾏查询
使⽤Hint语法可以对单个语句进⾏控制,例如系统默认关闭并⾏查询情况下,但需要对某个⾼频的慢SQL查询进⾏加速,此时就可以使⽤Hint对特定SQL进⾏加速。
toeflibt
您可以使⽤如下任意⼀种⽅式开启并⾏查询:SELECT /*+PARALLEL(x)*/ ... FROM ...; -- x >0
SELECT /*+ SET_VAR(max_parallel_degree=n) */ * FROM ... // n > 0
cty
您可以使⽤如下任意⼀种⽅式关闭并⾏查询:SELECT /*+NO_PARALLEL()*/ ... FROM ...;
SELECT /*+ SET_VAR(max_parallel_degree=0) */ * FROM ...
Hint⾼级⽤法
并⾏查询提供了PARALLEL和NO_PARALLEL两种Hint。
通过PARALLEL Hint可以强制查询并⾏执⾏,同时可以指定并⾏度和并⾏扫描的表。
通过NO_PARALLEL Hint可以强制查询串⾏执⾏,或者指定不选择某些表作为并⾏扫描的表。
Hint语法如下所⽰:/*+ PARALLEL [( [query_block] [table_name] [degree] )] */
/*+ NO_PARALLEL [( [query_block] [table_name][, table_name] )] */
教师节内容资料其中参数说明如下所⽰。
参数
说明
query_block
应⽤Hint的query block名称。
table_name
应⽤Hint的表名称。
degree
并⾏度。
英语培训学校迈格森
⽰例:SELECT /*+PARALLEL()*/ * FROM t1, t2;
-- 当表记录数⼩于records_threshold_for_parallelism设置的⾏数 ( 默认10000⾏)时,会强制并⾏,
-- 并⾏度⽤系统默认max_parallel_degree, 如果max_parallel_degree > 0,chine famous money
-- 则打开并⾏,如果max_parallel_degree等于0时,依旧时关闭并⾏。
SELECT /*+PARALLEL(8)*/ * FROM t1, t2;
-- 强制并⾏度8并⾏执⾏,
-- 当表记录数⼩于records_threshold_for_parallelism设置的⾏数 ( 默认10000⾏)时,会强制并⾏,
-- 并⾏度设置max_parallel_degree为8。
SELECT /*+ SET_VAR(max_parallel_degree=8) */ * FROM ...
-- 设置并⾏度max_parallel_degree为8,
-- 当表记录数⼩于records_threshold_for_parallelism设置的⾏数(如20000⾏)时,会⾃动关闭并⾏。
frenchkiss
SELECT /*+PARALLEL(t1)*/ * FROM t1, t2;
-- 选择t1表并⾏, 对t1表执⾏/*+PARALLEL()*/ 语法
SELECT /*+PARALLEL(t1 8)*/ * FROM t1, t2;
-- 强制并⾏度8且选择t1表并⾏执⾏, 对t1表执⾏/*+PARALLEL(8)*/语法
SELECT /*+PARALLEL(@subq1)*/ SUM(t.a) FROM t WHERE t.a =
(SELECT /*+QB_NAME(subq1)*/ SUM(t1.a) FROM t1);
--强制subquery并⾏执⾏, 并⾏度⽤系统默认max_parallel_degree,
-- 如果max_parallel_degree > 0, 则打开并⾏,max_parallel_degree等于0时,依旧时关闭并⾏
SELECT /*+PARALLEL(@subq1 8)*/ SUM(t.a) FROM t WHERE t.a =
(SELECT /*+QB_NAME(subq1)*/ SUM(t1.a) FROM t1);
--强制subquery并⾏执⾏, 并⾏度设置max_parallel_degree为8
SELECT SUM(t.a) FROM t WHERE t.a =
(SELECT /*+PARALLEL()*/ SUM(t1.a) FROM t1);
--强制subquery并⾏执⾏,
-- 并⾏度⽤系统默认max_parallel_degree,
-- 如果max_parallel_degree > 0, 则打开并⾏,max_parallel_degree等于0时,依旧时关闭并⾏
SELECT SUM(t.a) FROM t WHERE t.a =
yagaa
(SELECT /*+PARALLEL(8)*/ SUM(t1.a) FROM t1);
--强制subquery并⾏执⾏, 设置并⾏度max_parallel_degree为8
SELECT /*+NO_PARALLEL()*/ * FROM t1, t2;
-- 禁⽌并⾏执⾏
SELECT /*+NO_PARALLEL(t1)*/ * FROM t1, t2;
-
- 只对t1表禁⽌并⾏, 当系统打开并⾏时, 有可能对t2进⾏并⾏扫描,并⾏执⾏
SELECT /*+NO_PARALLEL(t1, t2)*/ * FROM t1, t2;
-- 同时对t1和t2表禁⽌并⾏
SELECT /*+NO_PARALLEL(@subq1)*/ SUM(t.a) FROM t WHERE t.a =
someday(SELECT /*+QB_NAME(subq1)*/ SUM(t1.a) FROM t1);
溢出英文
--禁⽌subquery 并⾏执⾏
小学生清明节演讲稿SELECT SUM(t.a) FROM t WHERE t.a =
(SELECT /*+NO_PARALLEL()*/ SUM(t1.a) FROM t1);
--禁⽌subquery 并⾏执⾏
说明 对于不⽀持并⾏的查询或者并⾏扫描的表,PARALLEL Hint不⽣效。
并⾏⼦查询的选择⽅式(并⾏⼦查询详细信息请参见/*+ PQ_PUSHDOWN [( [query_block])] */ 对应的⼦查询会选择push down的并⾏⼦查询执⾏策略
/*+ NO_PQ_PUSHDOWN [( [query_block])] */ 对应的⼦查询会选择shared access的并⾏⼦查询执⾏策略⽰例:#⼦查询选择push down并⾏策略
EXPLAIN SELECT /*+ PQ_PUSHDOWN(@qb1) */ * FROM t2 WHERE t2.a =
(SELECT /*+ qb_name(qb1) */ a FROM t1);
#⼦查询选择shared access并⾏策略
EXPLAIN SELECT /*+ NO_PQ_PUSHDOWN(@qb1) */ * FROM t2 WHERE t2.a =
(SELECT /*+ qb_name(qb1) */ a FROM t1);
#不加query block进⾏控制
EXPLAIN SELECT * FROM t2 WHERE t2.a =
(SELECT /*+ NO_PQ_PUSHDOWN() */ a FROM t1);