2023-10-26 20:44:10 +03:00
|
|
|
#
|
|
|
|
# MDEV-32351: Significant slowdown for query with many outer joins
|
|
|
|
#
|
|
|
|
CREATE TABLE t1 (b int NOT NULL, PRIMARY KEY (b)) ENGINE=MYISAM;
|
|
|
|
INSERT INTO t1 select seq from seq_1_to_10000;
|
|
|
|
CREATE TABLE t2 (b int NOT NULL, d varchar(255), KEY (b)) ENGINE=MYISAM ;
|
|
|
|
INSERT INTO t2 VALUES (1,1),(2,2),(3,3);
|
|
|
|
CREATE TABLE t3 (c int NOT NULL, PRIMARY KEY (c)) ENGINE=MYISAM ;
|
|
|
|
INSERT INTO t3 select seq from seq_1_to_3000;
|
|
|
|
CREATE TABLE t4 (c int NOT NULL, PRIMARY KEY (c)) ENGINE=MYISAM;
|
|
|
|
INSERT INTO t4 select seq from seq_1_to_3000;
|
|
|
|
ANALYZE TABLE t1,t2,t3,t4;
|
|
|
|
Table Op Msg_type Msg_text
|
|
|
|
test.t1 analyze status Engine-independent statistics collected
|
|
|
|
test.t1 analyze status OK
|
|
|
|
test.t2 analyze status Engine-independent statistics collected
|
|
|
|
test.t2 analyze status OK
|
|
|
|
test.t3 analyze status Engine-independent statistics collected
|
|
|
|
test.t3 analyze status OK
|
|
|
|
test.t4 analyze status Engine-independent statistics collected
|
|
|
|
test.t4 analyze status OK
|
|
|
|
create table t1_t2 as
|
|
|
|
select
|
|
|
|
t1.b as t1_b, t2.b as t2_b, t2.d as t2_d
|
|
|
|
FROM t1
|
|
|
|
LEFT JOIN t2 ON t1.b = t2.b;
|
2023-10-28 12:47:55 +03:00
|
|
|
SET statement debug_dbug='+d,analyze_print_r_unpack_ops' for
|
2023-10-26 20:44:10 +03:00
|
|
|
analyze
|
|
|
|
format=json
|
|
|
|
SELECT COUNT(*)
|
|
|
|
FROM t1_t2
|
|
|
|
LEFT JOIN t3 ON t2_d = t3.c
|
|
|
|
LEFT JOIN t4 ON t3.c=1
|
|
|
|
select '$js' as JSON;
|
|
|
|
JSON
|
|
|
|
{
|
|
|
|
"query_block": {
|
|
|
|
"select_id": 1,
|
|
|
|
"r_loops": 1,
|
|
|
|
"r_total_time_ms": "REPLACED",
|
|
|
|
"const_condition": "1",
|
|
|
|
"table": {
|
|
|
|
"table_name": "t1_t2",
|
|
|
|
"access_type": "ALL",
|
|
|
|
"r_loops": 1,
|
|
|
|
"rows": 10000,
|
|
|
|
"r_rows": 10000,
|
2023-11-08 12:59:00 +01:00
|
|
|
"r_table_time_ms": "REPLACED",
|
|
|
|
"r_other_time_ms": "REPLACED",
|
2023-11-08 15:57:05 +01:00
|
|
|
"r_engine_stats": REPLACED,
|
2023-10-26 20:44:10 +03:00
|
|
|
"filtered": 100,
|
|
|
|
"r_filtered": 100
|
|
|
|
},
|
|
|
|
"table": {
|
|
|
|
"table_name": "t3",
|
|
|
|
"access_type": "eq_ref",
|
|
|
|
"possible_keys": ["PRIMARY"],
|
|
|
|
"key": "PRIMARY",
|
|
|
|
"key_length": "4",
|
|
|
|
"used_key_parts": ["c"],
|
|
|
|
"ref": ["test.t1_t2.t2_d"],
|
|
|
|
"r_loops": 10000,
|
|
|
|
"rows": 1,
|
|
|
|
"r_rows": 0.0003,
|
2023-11-08 12:59:00 +01:00
|
|
|
"r_table_time_ms": "REPLACED",
|
|
|
|
"r_other_time_ms": "REPLACED",
|
2023-11-08 15:57:05 +01:00
|
|
|
"r_engine_stats": REPLACED,
|
2023-10-26 20:44:10 +03:00
|
|
|
"filtered": 100,
|
|
|
|
"r_filtered": 100,
|
|
|
|
"attached_condition": "trigcond(t1_t2.t2_d = t3.c and trigcond(t1_t2.t2_d is not null))",
|
|
|
|
"using_index": true
|
|
|
|
},
|
|
|
|
"block-nl-join": {
|
|
|
|
"table": {
|
|
|
|
"table_name": "t4",
|
|
|
|
"access_type": "index",
|
|
|
|
"key": "PRIMARY",
|
|
|
|
"key_length": "4",
|
|
|
|
"used_key_parts": ["c"],
|
|
|
|
"r_loops": 1,
|
|
|
|
"rows": 3000,
|
|
|
|
"r_rows": 3000,
|
2023-11-08 12:59:00 +01:00
|
|
|
"r_table_time_ms": "REPLACED",
|
|
|
|
"r_other_time_ms": "REPLACED",
|
2023-11-08 15:57:05 +01:00
|
|
|
"r_engine_stats": REPLACED,
|
2023-10-26 20:44:10 +03:00
|
|
|
"filtered": 100,
|
|
|
|
"r_filtered": 100,
|
|
|
|
"using_index": true
|
|
|
|
},
|
|
|
|
"buffer_type": "flat",
|
|
|
|
"buffer_size": "256Kb",
|
|
|
|
"join_type": "BNL",
|
|
|
|
"attached_condition": "trigcond(trigcond(t3.c = 1))",
|
2023-11-08 15:57:05 +01:00
|
|
|
"r_loops": 10000,
|
2023-11-08 12:59:00 +01:00
|
|
|
"r_filtered": 0.04333,
|
2023-10-26 20:44:10 +03:00
|
|
|
"r_unpack_time_ms": "REPLACED",
|
2023-11-08 15:57:05 +01:00
|
|
|
"r_unpack_ops": 3000,
|
|
|
|
"r_other_time_ms": "REPLACED",
|
|
|
|
"r_effective_rows": 3000
|
2023-10-26 20:44:10 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
# This must show 3000, not 30000000:
|
|
|
|
select json_extract('$js', '\$**.r_unpack_ops') as R_UNPACK_OPS;
|
|
|
|
R_UNPACK_OPS
|
|
|
|
[3000]
|
|
|
|
SET debug_dbug=@old_debug;
|
|
|
|
drop table t1,t2,t3,t4;
|
|
|
|
drop table t1_t2;
|