From e78e3c4eff9a2e1a74b89ad9642e3be9ba07e8da Mon Sep 17 00:00:00 2001 From: li_jianqiu <295949552@qq.com> Date: Mon, 7 Mar 2022 16:10:59 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90BUGFIX=E3=80=91=E8=A7=A3=E5=86=B3WDR?= =?UTF-8?q?=20snapshot=E7=94=9F=E6=88=90=E8=BF=87=E7=A8=8B=E4=B8=ADIO?= =?UTF-8?q?=E9=AB=98=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cbb/instruments/wdr/generate_report.cpp | 2 +- .../cbb/instruments/wdr/snapshot.cpp | 98 +++++++------------ 2 files changed, 38 insertions(+), 62 deletions(-) diff --git a/src/gausskernel/cbb/instruments/wdr/generate_report.cpp b/src/gausskernel/cbb/instruments/wdr/generate_report.cpp index 6a0f230c4..6240db93b 100644 --- a/src/gausskernel/cbb/instruments/wdr/generate_report.cpp +++ b/src/gausskernel/cbb/instruments/wdr/generate_report.cpp @@ -2116,7 +2116,7 @@ static void GlobalTableIndex(report_params* params) "WHERE i.snapshot_id = %ld) AS snap_1" " ON (snap_2.snap_relid = snap_1.snap_relid AND snap_2.snap_indexrelid = snap_1.snap_indexrelid AND " " snap_2.db_name = snap_1.db_name AND snap_2.snap_schemaname = snap_1.snap_schemaname) " - " order by snap_2.db_name, snap_2.snap_schemaname limit 200;", + " order by \"Index Tuple Read\" limit 200;", params->end_snap_id, params->end_snap_id, params->begin_snap_id, diff --git a/src/gausskernel/cbb/instruments/wdr/snapshot.cpp b/src/gausskernel/cbb/instruments/wdr/snapshot.cpp index 5d5ce3aaf..4b5fc61d5 100644 --- a/src/gausskernel/cbb/instruments/wdr/snapshot.cpp +++ b/src/gausskernel/cbb/instruments/wdr/snapshot.cpp @@ -87,7 +87,7 @@ void init_curr_snapid(void); void CreateTable(const char** views, int numViews, bool ismultidbtable); void InitTables(void); void CreateSnapStatTables(void); -void CreateIndexes(void); +void CreateIndexes(const char* views); void CreateSequence(void); void UpdateSnapEndTime(uint64 curr_snapid); void GetQueryStr(StringInfoData& query, const char* viewname, uint64 curr_snapid, const char* dbname); @@ -903,6 +903,20 @@ void SnapshotNameSpace::CreateSnapStatTables(void) CreateStatTable(createSnapshot, tablename2); } +static void DropIndexes(const char* indexName) +{ + StringInfoData query; + initStringInfo(&query); + appendStringInfo(&query, "drop index IF EXISTS snapshot.%s", indexName); + if (!SnapshotNameSpace::ExecuteQuery(query.data, SPI_OK_UTILITY)) { + pfree_ext(query.data); + ereport(ERROR, (errmodule(MOD_WDR_SNAPSHOT), errcode(ERRCODE_DATA_EXCEPTION), + errmsg("create index failed"), errdetail("drop index snapshot.%s execute error", indexName), + errcause("System error."), erraction("Check whether the query can be executed"))); + } + pfree_ext(query.data); +} + void SnapshotNameSpace::InitTables() { SnapshotNameSpace::CreateSnapStatTables(); @@ -915,7 +929,10 @@ void SnapshotNameSpace::InitTables() SnapshotNameSpace::CreateTable(lastDbRelatedViews, numViews, false); numViews = COUNT_ARRAY_SIZE(lastStatViews); SnapshotNameSpace::CreateTable(lastStatViews, numViews, true); - SnapshotNameSpace::CreateIndexes(); + DropIndexes("snap_summary_statio_indexes_name"); + DropIndexes("snap_summary_statio_tables_name"); + DropIndexes("snap_summary_stat_indexes_name"); + DropIndexes("snap_class_info_name"); } void SnapshotNameSpace::CreateTable(const char** views, int numViews, bool isSharedViews) @@ -949,6 +966,8 @@ void SnapshotNameSpace::CreateTable(const char** views, int numViews, bool isSha } pfree(snapColAttrType); } + /* create index on snapshot table */ + SnapshotNameSpace::CreateIndexes(views[i]); } pfree_ext(query.data); } @@ -1114,74 +1133,31 @@ void SnapshotNameSpace::InsertDatabaseData(const char* dbname, uint64 curr_snapi pfree_ext(sql.data); } -static bool IsNeedCreateIndex(const char* indexName) -{ - Datum colval; - bool isNull = false; - StringInfoData query; - - initStringInfo(&query); - /* check the index which is existing or not */ - appendStringInfo(&query, "select count(*) from pg_class where relname = '%s' and relkind = 'i'", indexName); - colval = GetDatumValue(query.data, 0, 0, &isNull); - if (DatumGetInt32(colval)) { - return false; - } - pfree_ext(query.data); - return true; -} /* In order to accelerate query for awr report, the index of some tables need to create The index is created immediately after whose table has existed at the start phase */ -void SnapshotNameSpace::CreateIndexes(void) +void SnapshotNameSpace::CreateIndexes(const char* views) { + bool isnull = false; StringInfoData query; initStringInfo(&query); - - /* snap_summary_statio_all_indexes */ - if (IsNeedCreateIndex("snap_summary_statio_indexes_name")) { - appendStringInfo(&query, - "create index snap_summary_statio_indexes_name on" - " snapshot.snap_summary_statio_all_indexes(db_name, snap_schemaname, snap_relname, snap_indexrelname);"); - - if (!SnapshotNameSpace::ExecuteQuery(query.data, SPI_OK_UTILITY)) { - ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION), errmsg("create index failed"))); - } - } - - /* snap_summary_statio_all_tables */ - if (IsNeedCreateIndex("snap_summary_statio_tables_name")) { + appendStringInfo(&query, + "select count(*) from pg_indexes where schemaname = 'snapshot' and " + "tablename = 'snap_%s' and indexname = 'snap_%s_idx'", + views, views); + Datum indexNum = GetDatumValue(query.data, 0, 0, &isnull); + if (!DatumGetInt32(indexNum)) { resetStringInfo(&query); - appendStringInfo(&query, - "create index snap_summary_statio_tables_name on" - " snapshot.snap_summary_statio_all_tables(db_name, snap_schemaname, snap_relname);"); - + appendStringInfo(&query, "create index snapshot.snap_%s_idx on snapshot.snap_%s(snapshot_id)", + views, views); if (!SnapshotNameSpace::ExecuteQuery(query.data, SPI_OK_UTILITY)) { - ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION), errmsg("create index failed"))); - } - } - - /* snap_summary_stat_all_indexes */ - if (IsNeedCreateIndex("snap_summary_stat_indexes_name")) { - resetStringInfo(&query); - appendStringInfo(&query, - "create index snap_summary_stat_indexes_name on" - " snapshot.snap_summary_stat_all_indexes(db_name, snap_schemaname, snap_relname, snap_indexrelname);"); - - if (!SnapshotNameSpace::ExecuteQuery(query.data, SPI_OK_UTILITY)) { - ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION), errmsg("create index failed"))); - } - } - - /* snap_class_vital_info */ - if (IsNeedCreateIndex("snap_class_info_name")) { - resetStringInfo(&query); - appendStringInfo(&query, - "create index snap_class_info_name on" - " snapshot.snap_class_vital_info(db_name, snap_schemaname, snap_relname);"); - if (!SnapshotNameSpace::ExecuteQuery(query.data, SPI_OK_UTILITY)) { - ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION), errmsg("create index failed"))); + pfree_ext(query.data); + ereport(ERROR, (errmodule(MOD_WDR_SNAPSHOT), errcode(ERRCODE_DATA_EXCEPTION), + errmsg("create WDR snapshot index failed"), + errdetail("create index snapshot.snap_%s_idx execute error", views), + errcause("System error."), + erraction("Check whether the query can be executed"))); } } pfree_ext(query.data);