polardbxengine/mysql-test/suite/xengine_main/r/opt_costmodel.result

523 lines
13 KiB
Plaintext

#
# Bug#20443863 USE OF WORST_SEEKS IN FIND_BEST_REF() CAN LEAD TO
# WRONG QUERY PLAN
#
CREATE TABLE t1 (
i1 INTEGER,
i2 INTEGER,
i3 INTEGER,
KEY(i1,i2)
) ENGINE=XENGINE;
INSERT INTO t1 VALUES (1, 1, 1), (1, 1, 1),(1, 1, 1),(1, 1, 1),
(2, 2, 1), (2, 2, 1),(2, 2, 1),(2, 2, 1),
(3, 3, 1), (3, 3, 1),(3, 3, 1),(3, 3, 1);
EXPLAIN FORMAT=JSON SELECT i3 FROM t1 WHERE i1 = 1 AND i2 = 1;
EXPLAIN
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "0.35"
},
"table": {
"table_name": "t1",
"access_type": "ref",
"possible_keys": [
"i1"
],
"key": "i1",
"used_key_parts": [
"i1",
"i2"
],
"key_length": "10",
"ref": [
"const",
"const"
],
"rows_examined_per_scan": 1,
"rows_produced_per_join": 1,
"filtered": "100.00",
"cost_info": {
"read_cost": "0.25",
"eval_cost": "0.10",
"prefix_cost": "0.35",
"data_read_per_join": "16"
},
"used_columns": [
"i1",
"i2",
"i3"
]
}
}
}
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`i3` AS `i3` from `test`.`t1` where ((`test`.`t1`.`i2` = 1) and (`test`.`t1`.`i1` = 1))
EXPLAIN FORMAT=JSON SELECT i3 FROM t1 WHERE i1 = 1 AND i3 = 1;
EXPLAIN
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "0.35"
},
"table": {
"table_name": "t1",
"access_type": "ref",
"possible_keys": [
"i1"
],
"key": "i1",
"used_key_parts": [
"i1"
],
"key_length": "5",
"ref": [
"const"
],
"rows_examined_per_scan": 1,
"rows_produced_per_join": 0,
"filtered": "10.00",
"cost_info": {
"read_cost": "0.25",
"eval_cost": "0.01",
"prefix_cost": "0.35",
"data_read_per_join": "1"
},
"used_columns": [
"i1",
"i3"
],
"attached_condition": "(`test`.`t1`.`i3` = 1)"
}
}
}
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`i3` AS `i3` from `test`.`t1` where ((`test`.`t1`.`i3` = 1) and (`test`.`t1`.`i1` = 1))
UPDATE mysql.server_cost
SET cost_value=0.1
WHERE cost_name="row_evaluate_cost";
UPDATE mysql.server_cost
SET cost_value=0.05
WHERE cost_name="key_compare_cost";
UPDATE mysql.server_cost
SET cost_value=1.0
WHERE cost_name="memory_temptable_create_cost";
UPDATE mysql.server_cost
SET cost_value=0.1
WHERE cost_name="memory_temptable_row_cost";
UPDATE mysql.server_cost
SET cost_value=20
WHERE cost_name="disk_temptable_create_cost";
UPDATE mysql.server_cost
SET cost_value=0.5
WHERE cost_name="disk_temptable_row_cost";
UPDATE mysql.engine_cost
SET cost_value=0.25
WHERE cost_name="memory_block_read_cost";
UPDATE mysql.engine_cost
SET cost_value=1.0
WHERE cost_name="io_block_read_cost";
UPDATE mysql.server_cost
SET cost_value = 2 * cost_value;
UPDATE mysql.engine_cost
SET cost_value = 2 * cost_value;
SELECT cost_name, cost_value FROM mysql.server_cost;
cost_name cost_value
disk_temptable_create_cost 40
disk_temptable_row_cost 1
key_compare_cost 0.1
memory_temptable_create_cost 2
memory_temptable_row_cost 0.2
row_evaluate_cost 0.2
SELECT cost_name, cost_value FROM mysql.engine_cost;
cost_name cost_value
io_block_read_cost 2
memory_block_read_cost 0.5
FLUSH OPTIMIZER_COSTS;
EXPLAIN FORMAT=JSON SELECT i3 FROM t1 WHERE i1 = 1 AND i2 = 1;
EXPLAIN
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "0.70"
},
"table": {
"table_name": "t1",
"access_type": "ref",
"possible_keys": [
"i1"
],
"key": "i1",
"used_key_parts": [
"i1",
"i2"
],
"key_length": "10",
"ref": [
"const",
"const"
],
"rows_examined_per_scan": 1,
"rows_produced_per_join": 1,
"filtered": "100.00",
"cost_info": {
"read_cost": "0.50",
"eval_cost": "0.20",
"prefix_cost": "0.70",
"data_read_per_join": "16"
},
"used_columns": [
"i1",
"i2",
"i3"
]
}
}
}
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`i3` AS `i3` from `test`.`t1` where ((`test`.`t1`.`i2` = 1) and (`test`.`t1`.`i1` = 1))
EXPLAIN FORMAT=JSON SELECT i3 FROM t1 WHERE i1 = 1 AND i3 = 1;
EXPLAIN
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "0.70"
},
"table": {
"table_name": "t1",
"access_type": "ref",
"possible_keys": [
"i1"
],
"key": "i1",
"used_key_parts": [
"i1"
],
"key_length": "5",
"ref": [
"const"
],
"rows_examined_per_scan": 1,
"rows_produced_per_join": 0,
"filtered": "10.00",
"cost_info": {
"read_cost": "0.50",
"eval_cost": "0.02",
"prefix_cost": "0.70",
"data_read_per_join": "1"
},
"used_columns": [
"i1",
"i3"
],
"attached_condition": "(`test`.`t1`.`i3` = 1)"
}
}
}
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`i3` AS `i3` from `test`.`t1` where ((`test`.`t1`.`i3` = 1) and (`test`.`t1`.`i1` = 1))
UPDATE mysql.server_cost
SET cost_value=DEFAULT;
UPDATE mysql.engine_cost
SET cost_value=DEFAULT;
FLUSH OPTIMIZER_COSTS;
DROP TABLE t1;
#
# Bug#20947871 INDEX SCAN COST IN TEST_IF_CHEAPER_ORDERING() DOES
# NOT USE COST CONSTANTS
#
CREATE TABLE t1 (
pk INTEGER PRIMARY KEY,
a INTEGER,
b INTEGER,
c CHAR(255),
UNIQUE KEY k1 (a)
);
INSERT INTO t1 VALUES (1, 1, NULL, "Abc"), (2, 2, NULL, "Abc"),
(3, 3, NULL, "Abc"), (4, 4, NULL, "Abc");
INSERT INTO t1 SELECT a + 4, a + 4, b, c FROM t1;
INSERT INTO t1 SELECT a + 8, a + 8, b, c FROM t1;
INSERT INTO t1 SELECT a + 16, a + 16, b, c FROM t1;
INSERT INTO t1 SELECT a + 32, a + 32, b, c FROM t1;
INSERT INTO t1 SELECT a + 64, a + 64, b, c FROM t1;
INSERT INTO t1 SELECT a + 128, a + 128, b, c FROM t1;
CREATE TABLE t2 (
d INTEGER PRIMARY KEY,
e INTEGER
);
INSERT INTO t2 SELECT a, b FROM t1;
# Query should be optimized for the LIMIT. Query plan should
# use index without filesort
EXPLAIN FORMAT=JSON SELECT * FROM t1 JOIN t2 ON b=d ORDER BY a LIMIT 4;
EXPLAIN
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "120.90"
},
"ordering_operation": {
"using_filesort": false,
"nested_loop": [
{
"table": {
"table_name": "t1",
"access_type": "index",
"key": "k1",
"used_key_parts": [
"a"
],
"key_length": "5",
"rows_examined_per_scan": 4,
"rows_produced_per_join": 256,
"filtered": "100.00",
"cost_info": {
"read_cost": "5.70",
"eval_cost": "25.60",
"prefix_cost": "31.30",
"data_read_per_join": "260K"
},
"used_columns": [
"pk",
"a",
"b",
"c"
],
"attached_condition": "(`test`.`t1`.`b` is not null)"
}
},
{
"table": {
"table_name": "t2",
"access_type": "eq_ref",
"possible_keys": [
"PRIMARY"
],
"key": "PRIMARY",
"used_key_parts": [
"d"
],
"key_length": "4",
"ref": [
"test.t1.b"
],
"rows_examined_per_scan": 1,
"rows_produced_per_join": 256,
"filtered": "100.00",
"cost_info": {
"read_cost": "64.00",
"eval_cost": "25.60",
"prefix_cost": "120.90",
"data_read_per_join": "4K"
},
"used_columns": [
"d",
"e"
]
}
}
]
}
}
}
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`pk` AS `pk`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t2`.`d` AS `d`,`test`.`t2`.`e` AS `e` from `test`.`t1` join `test`.`t2` where (`test`.`t2`.`d` = `test`.`t1`.`b`) order by `test`.`t1`.`a` limit 4
UPDATE mysql.server_cost
SET cost_value=0.1
WHERE cost_name="row_evaluate_cost";
UPDATE mysql.server_cost
SET cost_value=0.05
WHERE cost_name="key_compare_cost";
UPDATE mysql.server_cost
SET cost_value=1.0
WHERE cost_name="memory_temptable_create_cost";
UPDATE mysql.server_cost
SET cost_value=0.1
WHERE cost_name="memory_temptable_row_cost";
UPDATE mysql.server_cost
SET cost_value=20
WHERE cost_name="disk_temptable_create_cost";
UPDATE mysql.server_cost
SET cost_value=0.5
WHERE cost_name="disk_temptable_row_cost";
UPDATE mysql.engine_cost
SET cost_value=0.25
WHERE cost_name="memory_block_read_cost";
UPDATE mysql.engine_cost
SET cost_value=1.0
WHERE cost_name="io_block_read_cost";
UPDATE mysql.server_cost
SET cost_value = 0.5 * cost_value;
UPDATE mysql.engine_cost
SET cost_value = 0.5 * cost_value;
SELECT cost_name, cost_value FROM mysql.server_cost;
cost_name cost_value
disk_temptable_create_cost 10
disk_temptable_row_cost 0.25
key_compare_cost 0.025
memory_temptable_create_cost 0.5
memory_temptable_row_cost 0.05
row_evaluate_cost 0.05
SELECT cost_name, cost_value FROM mysql.engine_cost;
cost_name cost_value
io_block_read_cost 0.5
memory_block_read_cost 0.125
FLUSH OPTIMIZER_COSTS;
# This should be optimized for the LIMIT. Query plan should
# use index without filesort
EXPLAIN FORMAT=JSON SELECT * FROM t1 JOIN t2 ON b=d ORDER BY a LIMIT 4;
EXPLAIN
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "60.45"
},
"ordering_operation": {
"using_filesort": false,
"nested_loop": [
{
"table": {
"table_name": "t1",
"access_type": "index",
"key": "k1",
"used_key_parts": [
"a"
],
"key_length": "5",
"rows_examined_per_scan": 4,
"rows_produced_per_join": 256,
"filtered": "100.00",
"cost_info": {
"read_cost": "2.85",
"eval_cost": "12.80",
"prefix_cost": "15.65",
"data_read_per_join": "260K"
},
"used_columns": [
"pk",
"a",
"b",
"c"
],
"attached_condition": "(`test`.`t1`.`b` is not null)"
}
},
{
"table": {
"table_name": "t2",
"access_type": "eq_ref",
"possible_keys": [
"PRIMARY"
],
"key": "PRIMARY",
"used_key_parts": [
"d"
],
"key_length": "4",
"ref": [
"test.t1.b"
],
"rows_examined_per_scan": 1,
"rows_produced_per_join": 256,
"filtered": "100.00",
"cost_info": {
"read_cost": "32.00",
"eval_cost": "12.80",
"prefix_cost": "60.45",
"data_read_per_join": "4K"
},
"used_columns": [
"d",
"e"
]
}
}
]
}
}
}
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`pk` AS `pk`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t2`.`d` AS `d`,`test`.`t2`.`e` AS `e` from `test`.`t1` join `test`.`t2` where (`test`.`t2`.`d` = `test`.`t1`.`b`) order by `test`.`t1`.`a` limit 4
UPDATE mysql.server_cost
SET cost_value=DEFAULT;
UPDATE mysql.engine_cost
SET cost_value=DEFAULT;
FLUSH OPTIMIZER_COSTS;
DROP TABLE t1, t2;
#
# Bug#23508576 FILL_INDEXES_FROM_DD() DOES NOT INITIALIZE
# ST_KEY::M_IN_MEMORY_ESTIMATE
#
UPDATE mysql.engine_cost
SET cost_value=0.5
WHERE cost_name="memory_block_read_cost";
UPDATE mysql.engine_cost
SET cost_value=2
WHERE cost_name="io_block_read_cost";
FLUSH OPTIMIZER_COSTS;
SELECT engine_name, device_type, cost_name, cost_value
FROM mysql.engine_cost
WHERE cost_name="memory_block_read_cost"
OR cost_name="io_block_read_cost";
engine_name device_type cost_name cost_value
default 0 io_block_read_cost 2
default 0 memory_block_read_cost 0.5
CREATE TABLE t1 (
i1 INTEGER,
c1 CHAR(200),
INDEX idx (i1)
) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1, "Ullensvang"), (2, "Odda"), (3, "Jondal");
# Pass criteria for the query plan:
# 1. Should be executed as an index-only range scan
# 2. Cost estimate: "read_cost" - "eval_cost" should be approximately
# the cost of reading one page from memory, ie. about 0.5.
EXPLAIN FORMAT=JSON
SELECT i1 FROM t1 WHERE i1 > 1;
EXPLAIN
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "0.92"
},
"table": {
"table_name": "t1",
"access_type": "range",
"possible_keys": [
"idx"
],
"key": "idx",
"used_key_parts": [
"i1"
],
"key_length": "5",
"rows_examined_per_scan": 2,
"rows_produced_per_join": 2,
"filtered": "100.00",
"using_index": true,
"cost_info": {
"read_cost": "0.72",
"eval_cost": "0.20",
"prefix_cost": "0.92",
"data_read_per_join": "1K"
},
"used_columns": [
"i1"
],
"attached_condition": "(`test`.`t1`.`i1` > 1)"
}
}
}
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`i1` AS `i1` from `test`.`t1` where (`test`.`t1`.`i1` > 1)
DROP TABLE t1;
UPDATE mysql.engine_cost
SET cost_value=DEFAULT;
FLUSH OPTIMIZER_COSTS;