【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】7.1
一个复杂语句执行计划为什么只有这么一点
复杂语句的子查询部分执行计划倒是很多
explain analyze 也是这样显示吗?
换了一个其他7.1版本测试库,效果也一样的
能提供表结构,我们复现一下么?
其实感觉上执行计划是对的,虽然写那么多,都是一个表的数据。不过少了g表的执行计划,不知道g表是个什么表。
这个语句涉及2个表game_draw 和 SCHEDULE表
CREATE TABLE game_draw
(
draw_id
int(11) NOT NULL AUTO_INCREMENT ,
game_id
int(11) NOT NULL ,
draw_year
int(11) NOT NULL ,
draw_no
varchar(5) NOT NULL ,
sale_begin_time
datetime NOT NULL ,
sale_end_time
datetime NOT NULL ,
draw_status
tinyint(4) NOT NULL ,
draw_type
tinyint(4) NOT NULL DEFAULT ‘0’ ,
create_time
datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
update_time
datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
draw_result
varchar(4000) DEFAULT NULL ,
prize_calculation
tinyint(4) NOT NULL DEFAULT ‘0’,
suspend_status
tinyint(4) NOT NULL DEFAULT ‘0’,
draw_time
datetime DEFAULT NULL ,
paid_begin_time
datetime DEFAULT NULL ,
paid_end_time
datetime DEFAULT NULL ,
game_type
int(11) NOT NULL ,
PRIMARY KEY (draw_id
) /*T![clustered_index] CLUSTERED */
);
CREATE TABLE schedule
(
schedule_id
int(11) NOT NULL AUTO_INCREMENT ,
draw_id
int(11) NOT NULL ,
matchup_id
int(11) NOT NULL,
matchup_no
smallint(6) NOT NULL ,
handicap
decimal(10,1) DEFAULT NULL,
sale_status
tinyint(4) NOT NULL ,
suspend_status
int(11) NOT NULL DEFAULT ‘0’ ,
draw_flag
tinyint(4) unsigned zerofill NOT NULL DEFAULT ‘0’ ,
paid_end_time
datetime DEFAULT NULL ,
create_time
datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
update_time
datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
draw_matchup_order_no
smallint(6) NOT NULL,
draw_time
datetime DEFAULT NULL ,
result
int(11) DEFAULT NULL ,
sp_flag
tinyint(4) DEFAULT NULL ,
matchup_unique_no
int(9) NOT NULL ,
sale_end_time
datetime NOT NULL,
is_deleted
tinyint(4) NOT NULL DEFAULT ‘0’ ,
game_id
int(11) NOT NULL ,
game_type
int(11) NOT NULL ,
PRIMARY KEY (schedule_id
) /*T![clustered_index] CLUSTERED */
) ;
sql:
explain ANALYZE
SELECT
*
FROM
SCHEDULE
scc
WHERE
scc.matchup_no <(
SELECT
MIN( matchup_no )
FROM
SCHEDULE
sc
WHERE
sc.draw_id IN ( SELECT draw_id FROM game_draw g WHERE g.draw_no = ‘23002’)
AND sc.sale_status = 1
AND sc.game_type = 1200
)
AND scc.draw_id = 337525
我这边复现了,然后再v6.5.3也复现了。看来是bug了。
7.1版本 7.2版本 7.3版本我都试了一样
子查询返回值是找最小值min肯定只是一个数字,实际中子查询查的还是很复杂的,看我主楼子查询的执行计划
重写到子查询执行计划就不要了。。。主楼有子查询执行计划,还是比较复杂的
消失的子查询执行计划。。
v7.2.0 复现
scc.matchup_no < all( …) 加上all可以显示子查询的执行计划
bug了。
all或者any都行