!1246 修复bypass+sort场景下,没有记录sort信息到unique sql的问题

Merge pull request !1246 from TotaJ/sort_stat
This commit is contained in:
opengauss-bot
2021-09-02 02:00:07 +00:00
committed by Gitee
6 changed files with 131 additions and 3 deletions

View File

@ -4262,7 +4262,8 @@ int64 tuplesort_get_peak_memory(Tuplesortstate* state)
*/
void UpdateUniqueSQLSortStats(Tuplesortstate* state, TimestampTz* start_time)
{
if (!is_unique_sql_enabled()) {
/* isUniqueSQLContextInvalid happens when the query is explain xxx */
if (!is_unique_sql_enabled() || isUniqueSQLContextInvalid()) {
return;
}
unique_sql_sorthash_instr* instr = u_sess->unique_sql_cxt.unique_sql_sort_instr;

View File

@ -442,7 +442,8 @@ static void UpdateUniqueSQLSortHashInfo(UniqueSQL* unique_sql)
*/
void UpdateUniqueSQLHashStats(HashJoinTable hashtable, TimestampTz* start_time)
{
if (!is_unique_sql_enabled()) {
/* isUniqueSQLContextInvalid happens when the query is explain xxx */
if (!is_unique_sql_enabled() || isUniqueSQLContextInvalid()) {
return;
}

View File

@ -3029,7 +3029,7 @@ bool SortFusion::execute(long max_rows, char *completionTag)
{
max_rows = FETCH_ALL;
bool success = false;
TimestampTz startTime = 0;
TupleTableSlot *reslot = m_local.m_reslot;
Datum *values = m_local.m_values;
bool *isnull = m_local.m_isnull;
@ -3037,6 +3037,7 @@ bool SortFusion::execute(long max_rows, char *completionTag)
isnull[i] = true;
}
UpdateUniqueSQLSortStats(NULL, &startTime);
/* prepare */
m_local.m_scan->refreshParameter(m_local.m_outParams == NULL ? m_local.m_params : m_local.m_outParams);
@ -3075,6 +3076,9 @@ bool SortFusion::execute(long max_rows, char *completionTag)
/* sort all data */
tuplesort_performsort(tuplesortstate);
/* analyze the tuplesortstate information for update unique sql sort info */
UpdateUniqueSQLSortStats(tuplesortstate, &startTime);
/* send sorted data to client */
slot = MakeSingleTupleTableSlot(m_c_local.m_scanDesc);
while (tuplesort_gettupleslot(tuplesortstate, true, slot, NULL)) {

View File

@ -0,0 +1,97 @@
drop table if exists unique_sql_test1;
NOTICE: table "unique_sql_test1" does not exist, skipping
drop table if exists unique_sql_test2;
NOTICE: table "unique_sql_test2" does not exist, skipping
create table unique_sql_test1(a int, b int);
create table unique_sql_test2(a int, b int);
insert into unique_sql_test1 select GENERATE_SERIES(0, 15000),GENERATE_SERIES(0, 15000);
insert into unique_sql_test2 select GENERATE_SERIES(0, 15000),GENERATE_SERIES(0, 15000);
select reset_unique_sql('global','ALL',0);
reset_unique_sql
------------------
t
(1 row)
--explain sql won't record unique sql info
explain performance select * from unique_sql_test1 where b in (select b from unique_sql_test2) and a = 66 order by b;
--?.*
--?.*
--? Sort.*
Output: unique_sql_test1.a, unique_sql_test1.b
Sort Key: unique_sql_test1.b
--? Sort Method: quicksort Memory: .*
--? (Buffers: .*)
--?.*
--? -> Hash Join (.*)
Output: unique_sql_test1.a, unique_sql_test1.b
Hash Cond: (unique_sql_test1.b = unique_sql_test2.b)
--? (Buffers: .*)
--? (CPU: .*)
--? -> Seq Scan on public.unique_sql_test1 (cost=.*)
Output: unique_sql_test1.a, unique_sql_test1.b
Filter: (unique_sql_test1.a = 66)
--? Rows Removed by Filter: .*
--? (Buffers: .*)
--? (CPU: .*)
--? -> Hash (cost=.*)
Output: unique_sql_test2.b
--? Buckets: .*
--? (Buffers: .*)
--? (CPU: .*)
--? -> HashAggregate (cost=.*)
Output: unique_sql_test2.b
Group By Key: unique_sql_test2.b
--? (Buffers: .*)
--? (CPU: ex .*)
--? -> Seq Scan on public.unique_sql_test2 (cost=.*)
Output: unique_sql_test2.b
--? (Buffers: .*)
--? (CPU: .*)
--? Total runtime: .*
(32 rows)
select * from unique_sql_test1 where b in (select b from unique_sql_test2) and a = 66 order by b;
a | b
----+----
66 | 66
(1 row)
select sort_count,hash_count from get_instr_unique_sql() where query like '%select * from unique_sql_test1 where b in (select b from unique_sql_test2%';
sort_count | hash_count
------------+------------
1 | 1
(1 row)
--test sort with sqlbypass
create index i_unique_sql_test1 on unique_sql_test1(a);
create index i_unique_sql_test2 on unique_sql_test2(a);
set enable_beta_opfusion = on;
set enable_bitmapscan = off;
select reset_unique_sql('global','ALL',0);
reset_unique_sql
------------------
t
(1 row)
explain (costs off) select * from unique_sql_test1 where a = 66 order by b;
QUERY PLAN
---------------------------------------------------------------
[Bypass]
Sort
Sort Key: b
-> Index Scan using i_unique_sql_test1 on unique_sql_test1
Index Cond: (a = 66)
(5 rows)
select * from unique_sql_test1 where a = 66 order by b;
a | b
----+----
66 | 66
(1 row)
select sort_count,hash_count from get_instr_unique_sql() where query like '%select * from unique_sql_test1 where%';
sort_count | hash_count
------------+------------
1 | 0
(1 row)

View File

@ -10,6 +10,7 @@ test: single_node_ddl
test: single_node_sqlbypass
test: median
test: array_funcs first_last_agg
test: get_instr_unique_sql
# run tablespace by itself, and first, because it forces a checkpoint;
# we'd prefer not to have checkpoints later in the tests because that

View File

@ -0,0 +1,24 @@
drop table if exists unique_sql_test1;
drop table if exists unique_sql_test2;
create table unique_sql_test1(a int, b int);
create table unique_sql_test2(a int, b int);
insert into unique_sql_test1 select GENERATE_SERIES(0, 15000),GENERATE_SERIES(0, 15000);
insert into unique_sql_test2 select GENERATE_SERIES(0, 15000),GENERATE_SERIES(0, 15000);
select reset_unique_sql('global','ALL',0);
--explain sql won't record unique sql info
explain performance select * from unique_sql_test1 where b in (select b from unique_sql_test2) and a = 66 order by b;
select * from unique_sql_test1 where b in (select b from unique_sql_test2) and a = 66 order by b;
select sort_count,hash_count from get_instr_unique_sql() where query like '%select * from unique_sql_test1 where b in (select b from unique_sql_test2%';
--test sort with sqlbypass
create index i_unique_sql_test1 on unique_sql_test1(a);
create index i_unique_sql_test2 on unique_sql_test2(a);
set enable_beta_opfusion = on;
set enable_bitmapscan = off;
select reset_unique_sql('global','ALL',0);
explain (costs off) select * from unique_sql_test1 where a = 66 order by b;
select * from unique_sql_test1 where a = 66 order by b;
select sort_count,hash_count from get_instr_unique_sql() where query like '%select * from unique_sql_test1 where%';