tidb执行计划不全的问题

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】7.1
一个复杂语句执行计划为什么只有这么一点

复杂语句的子查询部分执行计划倒是很多

explain analyze 也是这样显示吗?

对的,也是缺

换了一个其他7.1版本测试库,效果也一样的

能提供表结构,我们复现一下么?

其实感觉上执行计划是对的,虽然写那么多,都是一个表的数据。不过少了g表的执行计划,不知道g表是个什么表。

1 个赞

这个语句涉及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

在其他 7.1版本库创建这两个表,无数据查询执行计划也是这样的

@Billmay表妹 报bug吧

1 个赞

我这边复现了,然后再v6.5.3也复现了。看来是bug了。

1 个赞

7.1版本 7.2版本 7.3版本我都试了一样

有点像优化了,直接把红框部分的结果算出来了,我造的数据最小值就是1。

1 个赞

会不会是隐藏buff 自动重写了执行计划 所以不告诉你 :smile:

我把值改了,这里也跟着改了

1 个赞

子查询返回值是找最小值min肯定只是一个数字,实际中子查询查的还是很复杂的,看我主楼子查询的执行计划

重写到子查询执行计划就不要了。。。主楼有子查询执行计划,还是比较复杂的

消失的子查询执行计划。。

v7.2.0 复现

scc.matchup_no < all( …) 加上all可以显示子查询的执行计划

bug了。

all或者any都行