diff options
author | Dmitry Shulga <dmitry.shulga@mariadb.com> | 2022-12-09 21:10:25 +0700 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2023-01-02 00:04:03 +0100 |
commit | 37a316c01d778a62a056d5d20110ef18bb55975e (patch) | |
tree | 2d788a20cd48420bbe917b9f7eb620fe7ab3aebd /mysql-test/main | |
parent | a9b31b0814b02e65930209b1a90a8293b2ca6619 (diff) | |
download | mariadb-git-37a316c01d778a62a056d5d20110ef18bb55975e.tar.gz |
MDEV-29988: Major performance regression with 10.6.11
The idea is to put Item_direct_ref_to_item as a transparent and
permanent wrapper before a string which require conversion.
So that Item_direct_ref_to_item would be the only place where
the pointer to the string item is stored, this pointer can be changed
and restored during PS execution as needed. And if any permanent
(subquery) optimization would need a pointer to the item,
it'll use a pointer to the Item_direct_ref_to_item - which is
a permanent item and won't go away.
Diffstat (limited to 'mysql-test/main')
-rw-r--r-- | mysql-test/main/ps.result | 15 | ||||
-rw-r--r-- | mysql-test/main/ps.test | 35 |
2 files changed, 50 insertions, 0 deletions
diff --git a/mysql-test/main/ps.result b/mysql-test/main/ps.result index 26c41526389..16700fd83d3 100644 --- a/mysql-test/main/ps.result +++ b/mysql-test/main/ps.result @@ -5700,3 +5700,18 @@ EXECUTE stmt USING 'd'; EXECUTE stmt USING 'd'; 300 DROP TABLE t1, t2, t3; +set @@max_session_mem_used=default; +create table t (a varchar(10)) character set utf8; +insert into t values (''); +prepare stmt from "select 1 from t where a = ?"; +set @@max_session_mem_used=(select memory_used*2 from information_schema.processlist where id=connection_id()); +deallocate prepare stmt; +drop table t; +set @@max_session_mem_used=default; +create table t (a varchar(10)) character set utf8; +insert into t values (''); +prepare stmt from "select 1 from t where a = 'a'"; +set @@max_session_mem_used=(select memory_used*2 from information_schema.processlist where id=connection_id()); +deallocate prepare stmt; +drop table t; +set @@max_session_mem_used=default; diff --git a/mysql-test/main/ps.test b/mysql-test/main/ps.test index 2ccfac3c119..87cae7211a4 100644 --- a/mysql-test/main/ps.test +++ b/mysql-test/main/ps.test @@ -5116,3 +5116,38 @@ EXECUTE stmt USING 'b'; EXECUTE stmt USING 'd'; EXECUTE stmt USING 'd'; DROP TABLE t1, t2, t3; + +set @@max_session_mem_used=default; +create table t (a varchar(10)) character set utf8; +insert into t values (''); +prepare stmt from "select 1 from t where a = ?"; +set @@max_session_mem_used=(select memory_used*2 from information_schema.processlist where id=connection_id()); +let $run= 1000; +disable_result_log; +disable_query_log; +while ($run) { + execute stmt using repeat('x',10000); + dec $run; +} +enable_result_log; +enable_query_log; +deallocate prepare stmt; +drop table t; +set @@max_session_mem_used=default; + +create table t (a varchar(10)) character set utf8; +insert into t values (''); +prepare stmt from "select 1 from t where a = 'a'"; +set @@max_session_mem_used=(select memory_used*2 from information_schema.processlist where id=connection_id()); +let $run= 1000; +disable_result_log; +disable_query_log; +while ($run) { + execute stmt; + dec $run; +} +enable_result_log; +enable_query_log; +deallocate prepare stmt; +drop table t; +set @@max_session_mem_used=default; |