【 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
@Billmay表妹 报bug吧
我这边复现了,然后再v6.5.3也复现了。看来是bug了。
7.1版本 7.2版本 7.3版本我都试了一样
子查询返回值是找最小值min肯定只是一个数字,实际中子查询查的还是很复杂的,看我主楼子查询的执行计划
重写到子查询执行计划就不要了。。。主楼有子查询执行计划,还是比较复杂的
消失的子查询执行计划。。
v7.2.0 复现
scc.matchup_no < all( …) 加上all可以显示子查询的执行计划
bug了。
all或者any都行