This is an automated email from the ASF dual-hosted git repository. maxyang pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit 3a2626d5c22c2075ae9d22dbbba9fbddc77997c9 Author: Soumyadeep Chakraborty <[email protected]> AuthorDate: Sat May 25 13:55:19 2024 -0700 Introduce gp_appendonly_compaction_segfile_limit This commit introduces the gp_appendonly_compaction_segfile_limit GUC, which ensures the availability of N segfiles for insert operations, before going forward with a compaction decision. During VACUUM, we decide to drop a segfile in AWAITING_DROP iff there is no older snapshot in the system that can see the segfile. This can lead to exhaustion of segfiles for insert purposes post VACUUM (since segfiles AWAITING_DROP aren't eligible for inserts). Currently, once a segfile is chosen as a compaction "target", it is destined to go into AWAITING_DROP. So, we install the GUC guard when we are deciding on the next segfile to compact. If we see that the number of eligible segments for insert is below the threshold, we are done with compaction - for all remaining segfiles. uao/max_concurrency2.source has been modified to demonstrate the safeguard. Co-authored-by: Ashwin Agrawal <[email protected]> Reviewed-by: Huansong Fu <[email protected]> --- src/backend/access/appendonly/appendonlywriter.c | 73 ++++- src/backend/utils/misc/guc_gp.c | 12 + src/include/utils/guc.h | 1 + src/include/utils/sync_guc_name.h | 1 + .../isolation2/input/uao/max_concurrency2.source | 28 +- .../isolation2/output/uao/max_concurrency2.source | 300 ++++++++++++++++++++- 6 files changed, 405 insertions(+), 10 deletions(-) diff --git a/src/backend/access/appendonly/appendonlywriter.c b/src/backend/access/appendonly/appendonlywriter.c index 7fceaed238..fdcc39de2e 100644 --- a/src/backend/access/appendonly/appendonlywriter.c +++ b/src/backend/access/appendonly/appendonlywriter.c @@ -50,6 +50,7 @@ * local functions */ static int choose_segno_internal(Relation rel, List *avoid_segnos, choose_segno_mode mode); +static int num_non_existing_segfiles(Relation rel, bool *existing_segnos, List *avoid_segnos); static int choose_new_segfile(Relation rel, bool *used, List *avoid_segnos); static void get_aoseg_fields(Relation rel, Relation pg_aoseg_rel, HeapTuple tuple, int32 *segno, int64 *tupcount, int16 *state, int16 *formatversion); @@ -386,15 +387,16 @@ choose_segno_internal(Relation rel, List *avoid_segnos, choose_segno_mode mode) int i; int32 chosen_segno = -1; candidate_segment candidates[MAX_AOREL_CONCURRENCY]; - bool used[MAX_AOREL_CONCURRENCY]; + bool existing_segnos[MAX_AOREL_CONCURRENCY]; /* already have aoseg row */ int ncandidates = 0; + int nemptysegs = 0; SysScanDesc aoscan; HeapTuple tuple; Snapshot snapshot; Oid segrelid; bool tried_creating_new_segfile = false; - memset(used, 0, sizeof(used)); + memset(existing_segnos, 0, sizeof(existing_segnos)); if (ShouldUseReservedSegno(rel, mode)) { @@ -457,7 +459,7 @@ choose_segno_internal(Relation rel, List *avoid_segnos, choose_segno_mode mode) get_aoseg_fields(rel, pg_aoseg_rel, tuple, &segno, &tupcount, &state, &formatversion); - used[segno] = true; + existing_segnos[segno] = true; /* never write to AWAITING_DROP segments */ if (state != AOSEG_STATE_DEFAULT) @@ -500,11 +502,11 @@ choose_segno_internal(Relation rel, List *avoid_segnos, choose_segno_mode mode) break; } } - else + else if (tupcount == 0) { /* If the ao segment is empty, do not choose it for compaction */ - if (tupcount == 0) - continue; + nemptysegs++; + continue; } candidates[ncandidates].segno = segno; @@ -520,6 +522,35 @@ choose_segno_internal(Relation rel, List *avoid_segnos, choose_segno_mode mode) if (chosen_segno == -1) { + /* + * If we are choosing the next segfile to compact, check to see if we + * still have enough segfiles that can be inserted into. + * + * The grand total of non-existing segfiles, empty segfiles and segfiles + * that are worthy of compaction (ncandidates) represent the total + * number of available segfiles that can serve inserts. This total must + * at least be gp_appendonly_compaction_segfile_limit. + * + * Otherwise, we might put too many segments into AOSEG_STATE_AWAITING_DROP. + * Segfiles also remain in that state if VACUUM runs while there is an + * older snapshot in the system. + */ + if (mode == CHOOSE_MODE_COMPACTION_TARGET) + { + int non_existing_segfile_count; + + non_existing_segfile_count = + num_non_existing_segfiles(rel, existing_segnos, avoid_segnos); + if (non_existing_segfile_count + ncandidates + nemptysegs < gp_appendonly_compaction_segfile_limit) + { + ereportif(Debug_appendonly_print_segfile_choice, LOG, + (errmsg("number of available segfiles for inserts is below gp_appendonly_compaction_segfile_limit"), + errdetail("compaction candidate count = %d, non-existing segfile count = %d, empty segfile count = %d, limit = %d", + ncandidates, non_existing_segfile_count, nemptysegs, gp_appendonly_compaction_segfile_limit))); + goto cleanup; + } + } + /* * Sort the candidates by tuple count, to prefer segment with fewest existing * tuples. (In particular, in COMPACTION_WRITE mode, this puts all empty @@ -547,7 +578,7 @@ choose_segno_internal(Relation rel, List *avoid_segnos, choose_segno_mode mode) !tried_creating_new_segfile && candidates[i].tupcount > 0) { - chosen_segno = choose_new_segfile(rel, used, avoid_segnos); + chosen_segno = choose_new_segfile(rel, existing_segnos, avoid_segnos); tried_creating_new_segfile = true; if (chosen_segno != -1) break; @@ -586,9 +617,10 @@ choose_segno_internal(Relation rel, List *avoid_segnos, choose_segno_mode mode) mode != CHOOSE_MODE_COMPACTION_TARGET && !tried_creating_new_segfile) { - chosen_segno = choose_new_segfile(rel, used, avoid_segnos); + chosen_segno = choose_new_segfile(rel, existing_segnos, avoid_segnos); } +cleanup: UnlockDatabaseObject(rel->rd_node.dbNode, (Oid)rel->rd_node.relNode, 0, ExclusiveLock); if (Debug_appendonly_print_segfile_choice && chosen_segno != -1) @@ -601,6 +633,31 @@ choose_segno_internal(Relation rel, List *avoid_segnos, choose_segno_mode mode) return chosen_segno; } +/* + * Discounting the 'existing_segnos' and 'avoid_segnos', count the number of + * segnos for this append-optimized relation. These segnos won't have an + * aoseg/aocsseg row. + */ +static int +num_non_existing_segfiles(Relation rel, bool *existing_segnos, List *avoid_segnos) +{ + int non_existing = 0; + + Assert(RelationStorageIsAO(rel)); + + for (int segno = 0; segno < MAX_AOREL_CONCURRENCY; segno++) + { + /* Only choose seg 0 in utility mode. See above. */ + if (Gp_role != GP_ROLE_UTILITY && segno == 0) + continue; + + if (!existing_segnos[segno] && !list_member_int(avoid_segnos, segno)) + non_existing++; + } + + return non_existing; +} + static int choose_new_segfile(Relation rel, bool *used, List *avoid_segnos) { diff --git a/src/backend/utils/misc/guc_gp.c b/src/backend/utils/misc/guc_gp.c index eecfd01c70..09c48950c1 100644 --- a/src/backend/utils/misc/guc_gp.c +++ b/src/backend/utils/misc/guc_gp.c @@ -155,6 +155,7 @@ bool enable_parallel_dedup_semi_reverse_join = true; int gp_appendonly_insert_files = 0; int gp_appendonly_insert_files_tuples_range = 0; int gp_random_insert_segments = 0; +int gp_appendonly_compaction_segfile_limit = 0; bool gp_heap_require_relhasoids_match = true; bool gp_local_distributed_cache_stats = false; bool debug_xlog_record_read = false; @@ -3401,6 +3402,17 @@ struct config_int ConfigureNamesInt_gp[] = NULL, NULL, NULL }, + { + {"gp_appendonly_compaction_segfile_limit", PGC_USERSET, DEVELOPER_OPTIONS, + gettext_noop("Sets the minimum number of segfiles that must always be available for inserts"), + gettext_noop("If the number of available segfiles for insert falls below this limit, " + "compaction will be avoided, to avoid too many segments going into AWAITING_DROP.") + }, + &gp_appendonly_compaction_segfile_limit, + 10, 0, 127, + NULL, NULL, NULL + }, + { {"gp_appendonly_insert_files_tuples_range", PGC_USERSET, DEVELOPER_OPTIONS, gettext_noop("Range number of tuples files to switch between segment files for appendonly" diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index f9045dc8a2..31ba99791f 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -316,6 +316,7 @@ extern bool gp_enable_multiphase_limit; * 10% of the tuples are hidden. */ extern int gp_appendonly_compaction_threshold; +extern int gp_appendonly_compaction_segfile_limit; extern bool gp_heap_require_relhasoids_match; extern bool debug_xlog_record_read; extern bool Debug_cancel_print; diff --git a/src/include/utils/sync_guc_name.h b/src/include/utils/sync_guc_name.h index 57ac3d8937..30d84ddd60 100644 --- a/src/include/utils/sync_guc_name.h +++ b/src/include/utils/sync_guc_name.h @@ -53,6 +53,7 @@ "gin_pending_list_limit", "gp_allow_date_field_width_5digits", "gp_appendonly_compaction", + "gp_appendonly_compaction_segfile_limit", "gp_appendonly_compaction_threshold", "gp_appendonly_verify_block_checksums", "gp_appendonly_verify_write_block", diff --git a/src/test/isolation2/input/uao/max_concurrency2.source b/src/test/isolation2/input/uao/max_concurrency2.source index 976048d914..5b5c8161e6 100644 --- a/src/test/isolation2/input/uao/max_concurrency2.source +++ b/src/test/isolation2/input/uao/max_concurrency2.source @@ -1,5 +1,7 @@ -- @Description Insert into a ao relation with 128 concurrent transactions. --- The 128th transaction is expected to fail. +-- The 128th transaction is expected to fail. After that, test VACUUM in the +-- presence of an old snapshot and ensure that it respects +-- gp_appendonly_compaction_segfile_limit. -- -- -- start_matchsubs @@ -399,4 +401,28 @@ ALTER RESOURCE GROUP admin_group SET CONCURRENCY 130; SELECT * FROM ao; SELECT * FROM gp_ao_or_aocs_seg('ao') ORDER BY segno; +-- Test VACUUM in the presence of an old snapshot. +SHOW gp_appendonly_compaction_segfile_limit; + +DELETE FROM ao; + +-- Create an "old" snapshot. +1: BEGIN; +1: SELECT * FROM ao; + +-- Since there is an old snapshot that is active, even though VACUUM will find +-- that all segments are eligible to be compacted, it will compact them sans +-- gp_appendonly_compaction_segfile_limit number of segments. The compacted segments +-- will be in AWAITING_DROP due to the "old" snapshot though. +VACUUM ao; +SELECT * FROM gp_ao_or_aocs_seg('ao') ORDER BY state, segno; + +-- Terminate the "old" snapshot. +1: END; + +-- Now VACUUM will be able to compact the segments it wasn't able to and drop +-- the ones that were AWAITING_DROP. +VACUUM ao; +SELECT * FROM gp_ao_or_aocs_seg('ao') ORDER BY state, segno; + ALTER RESOURCE GROUP admin_group SET CONCURRENCY 20; diff --git a/src/test/isolation2/output/uao/max_concurrency2.source b/src/test/isolation2/output/uao/max_concurrency2.source index a83f9de1bd..294e2feccf 100644 --- a/src/test/isolation2/output/uao/max_concurrency2.source +++ b/src/test/isolation2/output/uao/max_concurrency2.source @@ -1,5 +1,7 @@ -- @Description Insert into a ao relation with 128 concurrent transactions. --- The 128th transaction is expected to fail. +-- The 128th transaction is expected to fail. After that, test VACUUM in the +-- presence of an old snapshot and ensure that it respects +-- gp_appendonly_compaction_segfile_limit. -- -- -- start_matchsubs @@ -1047,5 +1049,301 @@ SELECT * FROM gp_ao_or_aocs_seg('ao') ORDER BY segno; 1 | 127 | 1 | 1 | 3 | 1 (127 rows) +-- Test VACUUM in the presence of an old snapshot. +SHOW gp_appendonly_compaction_segfile_limit; + gp_appendonly_compaction_segfile_limit +---------------------------------------- + 10 +(1 row) + +DELETE FROM ao; +DELETE 127 + +-- Create an "old" snapshot. +1: BEGIN; +BEGIN +1: SELECT * FROM ao; + a | b +---+--- +(0 rows) + +-- Since there is an old snapshot that is active, even though VACUUM will find +-- that all segments are eligible to be compacted, it will compact them sans +-- gp_appendonly_compaction_segfile_limit number of segments. The compacted segments +-- will be in AWAITING_DROP due to the "old" snapshot though. +VACUUM ao; +VACUUM +SELECT * FROM gp_ao_or_aocs_seg('ao') ORDER BY state, segno; + segment_id | segno | tupcount | modcount | formatversion | state +------------+-------+----------+----------+---------------+------- + 1 | 2 | 1 | 1 | 3 | 1 + 1 | 119 | 1 | 1 | 3 | 1 + 1 | 120 | 1 | 1 | 3 | 1 + 1 | 121 | 1 | 1 | 3 | 1 + 1 | 122 | 1 | 1 | 3 | 1 + 1 | 123 | 1 | 1 | 3 | 1 + 1 | 124 | 1 | 1 | 3 | 1 + 1 | 125 | 1 | 1 | 3 | 1 + 1 | 126 | 1 | 1 | 3 | 1 + 1 | 127 | 1 | 1 | 3 | 1 + 1 | 1 | 1 | 2 | 3 | 2 + 1 | 3 | 1 | 1 | 3 | 2 + 1 | 4 | 1 | 1 | 3 | 2 + 1 | 5 | 1 | 1 | 3 | 2 + 1 | 6 | 1 | 1 | 3 | 2 + 1 | 7 | 1 | 1 | 3 | 2 + 1 | 8 | 1 | 1 | 3 | 2 + 1 | 9 | 1 | 1 | 3 | 2 + 1 | 10 | 1 | 1 | 3 | 2 + 1 | 11 | 1 | 1 | 3 | 2 + 1 | 12 | 1 | 1 | 3 | 2 + 1 | 13 | 1 | 1 | 3 | 2 + 1 | 14 | 1 | 1 | 3 | 2 + 1 | 15 | 1 | 1 | 3 | 2 + 1 | 16 | 1 | 1 | 3 | 2 + 1 | 17 | 1 | 1 | 3 | 2 + 1 | 18 | 1 | 1 | 3 | 2 + 1 | 19 | 1 | 1 | 3 | 2 + 1 | 20 | 1 | 1 | 3 | 2 + 1 | 21 | 1 | 1 | 3 | 2 + 1 | 22 | 1 | 1 | 3 | 2 + 1 | 23 | 1 | 1 | 3 | 2 + 1 | 24 | 1 | 1 | 3 | 2 + 1 | 25 | 1 | 1 | 3 | 2 + 1 | 26 | 1 | 1 | 3 | 2 + 1 | 27 | 1 | 1 | 3 | 2 + 1 | 28 | 1 | 1 | 3 | 2 + 1 | 29 | 1 | 1 | 3 | 2 + 1 | 30 | 1 | 1 | 3 | 2 + 1 | 31 | 1 | 1 | 3 | 2 + 1 | 32 | 1 | 1 | 3 | 2 + 1 | 33 | 1 | 1 | 3 | 2 + 1 | 34 | 1 | 1 | 3 | 2 + 1 | 35 | 1 | 1 | 3 | 2 + 1 | 36 | 1 | 1 | 3 | 2 + 1 | 37 | 1 | 1 | 3 | 2 + 1 | 38 | 1 | 1 | 3 | 2 + 1 | 39 | 1 | 1 | 3 | 2 + 1 | 40 | 1 | 1 | 3 | 2 + 1 | 41 | 1 | 1 | 3 | 2 + 1 | 42 | 1 | 1 | 3 | 2 + 1 | 43 | 1 | 1 | 3 | 2 + 1 | 44 | 1 | 1 | 3 | 2 + 1 | 45 | 1 | 1 | 3 | 2 + 1 | 46 | 1 | 1 | 3 | 2 + 1 | 47 | 1 | 1 | 3 | 2 + 1 | 48 | 1 | 1 | 3 | 2 + 1 | 49 | 1 | 1 | 3 | 2 + 1 | 50 | 1 | 1 | 3 | 2 + 1 | 51 | 1 | 1 | 3 | 2 + 1 | 52 | 1 | 1 | 3 | 2 + 1 | 53 | 1 | 1 | 3 | 2 + 1 | 54 | 1 | 1 | 3 | 2 + 1 | 55 | 1 | 1 | 3 | 2 + 1 | 56 | 1 | 1 | 3 | 2 + 1 | 57 | 1 | 1 | 3 | 2 + 1 | 58 | 1 | 1 | 3 | 2 + 1 | 59 | 1 | 1 | 3 | 2 + 1 | 60 | 1 | 1 | 3 | 2 + 1 | 61 | 1 | 1 | 3 | 2 + 1 | 62 | 1 | 1 | 3 | 2 + 1 | 63 | 1 | 1 | 3 | 2 + 1 | 64 | 1 | 1 | 3 | 2 + 1 | 65 | 1 | 1 | 3 | 2 + 1 | 66 | 1 | 1 | 3 | 2 + 1 | 67 | 1 | 1 | 3 | 2 + 1 | 68 | 1 | 1 | 3 | 2 + 1 | 69 | 1 | 1 | 3 | 2 + 1 | 70 | 1 | 1 | 3 | 2 + 1 | 71 | 1 | 1 | 3 | 2 + 1 | 72 | 1 | 1 | 3 | 2 + 1 | 73 | 1 | 1 | 3 | 2 + 1 | 74 | 1 | 1 | 3 | 2 + 1 | 75 | 1 | 1 | 3 | 2 + 1 | 76 | 1 | 1 | 3 | 2 + 1 | 77 | 1 | 1 | 3 | 2 + 1 | 78 | 1 | 1 | 3 | 2 + 1 | 79 | 1 | 1 | 3 | 2 + 1 | 80 | 1 | 1 | 3 | 2 + 1 | 81 | 1 | 1 | 3 | 2 + 1 | 82 | 1 | 1 | 3 | 2 + 1 | 83 | 1 | 1 | 3 | 2 + 1 | 84 | 1 | 1 | 3 | 2 + 1 | 85 | 1 | 1 | 3 | 2 + 1 | 86 | 1 | 1 | 3 | 2 + 1 | 87 | 1 | 1 | 3 | 2 + 1 | 88 | 1 | 1 | 3 | 2 + 1 | 89 | 1 | 1 | 3 | 2 + 1 | 90 | 1 | 1 | 3 | 2 + 1 | 91 | 1 | 1 | 3 | 2 + 1 | 92 | 1 | 1 | 3 | 2 + 1 | 93 | 1 | 1 | 3 | 2 + 1 | 94 | 1 | 1 | 3 | 2 + 1 | 95 | 1 | 1 | 3 | 2 + 1 | 96 | 1 | 1 | 3 | 2 + 1 | 97 | 1 | 1 | 3 | 2 + 1 | 98 | 1 | 1 | 3 | 2 + 1 | 99 | 1 | 1 | 3 | 2 + 1 | 100 | 1 | 1 | 3 | 2 + 1 | 101 | 1 | 1 | 3 | 2 + 1 | 102 | 1 | 1 | 3 | 2 + 1 | 103 | 1 | 1 | 3 | 2 + 1 | 104 | 1 | 1 | 3 | 2 + 1 | 105 | 1 | 1 | 3 | 2 + 1 | 106 | 1 | 1 | 3 | 2 + 1 | 107 | 1 | 1 | 3 | 2 + 1 | 108 | 1 | 1 | 3 | 2 + 1 | 109 | 1 | 1 | 3 | 2 + 1 | 110 | 1 | 1 | 3 | 2 + 1 | 111 | 1 | 1 | 3 | 2 + 1 | 112 | 1 | 1 | 3 | 2 + 1 | 113 | 1 | 1 | 3 | 2 + 1 | 114 | 1 | 1 | 3 | 2 + 1 | 115 | 1 | 1 | 3 | 2 + 1 | 116 | 1 | 1 | 3 | 2 + 1 | 117 | 1 | 1 | 3 | 2 + 1 | 118 | 1 | 1 | 3 | 2 +(127 rows) + +-- Terminate the "old" snapshot. +1: END; +END + +-- Now VACUUM will be able to compact the segments it wasn't able to and drop +-- the ones that were AWAITING_DROP. +VACUUM ao; +VACUUM +SELECT * FROM gp_ao_or_aocs_seg('ao') ORDER BY state, segno; + segment_id | segno | tupcount | modcount | formatversion | state +------------+-------+----------+----------+---------------+------- + 1 | 1 | 0 | 2 | 3 | 1 + 1 | 2 | 0 | 1 | 3 | 1 + 1 | 3 | 0 | 1 | 3 | 1 + 1 | 4 | 0 | 1 | 3 | 1 + 1 | 5 | 0 | 1 | 3 | 1 + 1 | 6 | 0 | 1 | 3 | 1 + 1 | 7 | 0 | 1 | 3 | 1 + 1 | 8 | 0 | 1 | 3 | 1 + 1 | 9 | 0 | 1 | 3 | 1 + 1 | 10 | 0 | 1 | 3 | 1 + 1 | 11 | 0 | 1 | 3 | 1 + 1 | 12 | 0 | 1 | 3 | 1 + 1 | 13 | 0 | 1 | 3 | 1 + 1 | 14 | 0 | 1 | 3 | 1 + 1 | 15 | 0 | 1 | 3 | 1 + 1 | 16 | 0 | 1 | 3 | 1 + 1 | 17 | 0 | 1 | 3 | 1 + 1 | 18 | 0 | 1 | 3 | 1 + 1 | 19 | 0 | 1 | 3 | 1 + 1 | 20 | 0 | 1 | 3 | 1 + 1 | 21 | 0 | 1 | 3 | 1 + 1 | 22 | 0 | 1 | 3 | 1 + 1 | 23 | 0 | 1 | 3 | 1 + 1 | 24 | 0 | 1 | 3 | 1 + 1 | 25 | 0 | 1 | 3 | 1 + 1 | 26 | 0 | 1 | 3 | 1 + 1 | 27 | 0 | 1 | 3 | 1 + 1 | 28 | 0 | 1 | 3 | 1 + 1 | 29 | 0 | 1 | 3 | 1 + 1 | 30 | 0 | 1 | 3 | 1 + 1 | 31 | 0 | 1 | 3 | 1 + 1 | 32 | 0 | 1 | 3 | 1 + 1 | 33 | 0 | 1 | 3 | 1 + 1 | 34 | 0 | 1 | 3 | 1 + 1 | 35 | 0 | 1 | 3 | 1 + 1 | 36 | 0 | 1 | 3 | 1 + 1 | 37 | 0 | 1 | 3 | 1 + 1 | 38 | 0 | 1 | 3 | 1 + 1 | 39 | 0 | 1 | 3 | 1 + 1 | 40 | 0 | 1 | 3 | 1 + 1 | 41 | 0 | 1 | 3 | 1 + 1 | 42 | 0 | 1 | 3 | 1 + 1 | 43 | 0 | 1 | 3 | 1 + 1 | 44 | 0 | 1 | 3 | 1 + 1 | 45 | 0 | 1 | 3 | 1 + 1 | 46 | 0 | 1 | 3 | 1 + 1 | 47 | 0 | 1 | 3 | 1 + 1 | 48 | 0 | 1 | 3 | 1 + 1 | 49 | 0 | 1 | 3 | 1 + 1 | 50 | 0 | 1 | 3 | 1 + 1 | 51 | 0 | 1 | 3 | 1 + 1 | 52 | 0 | 1 | 3 | 1 + 1 | 53 | 0 | 1 | 3 | 1 + 1 | 54 | 0 | 1 | 3 | 1 + 1 | 55 | 0 | 1 | 3 | 1 + 1 | 56 | 0 | 1 | 3 | 1 + 1 | 57 | 0 | 1 | 3 | 1 + 1 | 58 | 0 | 1 | 3 | 1 + 1 | 59 | 0 | 1 | 3 | 1 + 1 | 60 | 0 | 1 | 3 | 1 + 1 | 61 | 0 | 1 | 3 | 1 + 1 | 62 | 0 | 1 | 3 | 1 + 1 | 63 | 0 | 1 | 3 | 1 + 1 | 64 | 0 | 1 | 3 | 1 + 1 | 65 | 0 | 1 | 3 | 1 + 1 | 66 | 0 | 1 | 3 | 1 + 1 | 67 | 0 | 1 | 3 | 1 + 1 | 68 | 0 | 1 | 3 | 1 + 1 | 69 | 0 | 1 | 3 | 1 + 1 | 70 | 0 | 1 | 3 | 1 + 1 | 71 | 0 | 1 | 3 | 1 + 1 | 72 | 0 | 1 | 3 | 1 + 1 | 73 | 0 | 1 | 3 | 1 + 1 | 74 | 0 | 1 | 3 | 1 + 1 | 75 | 0 | 1 | 3 | 1 + 1 | 76 | 0 | 1 | 3 | 1 + 1 | 77 | 0 | 1 | 3 | 1 + 1 | 78 | 0 | 1 | 3 | 1 + 1 | 79 | 0 | 1 | 3 | 1 + 1 | 80 | 0 | 1 | 3 | 1 + 1 | 81 | 0 | 1 | 3 | 1 + 1 | 82 | 0 | 1 | 3 | 1 + 1 | 83 | 0 | 1 | 3 | 1 + 1 | 84 | 0 | 1 | 3 | 1 + 1 | 85 | 0 | 1 | 3 | 1 + 1 | 86 | 0 | 1 | 3 | 1 + 1 | 87 | 0 | 1 | 3 | 1 + 1 | 88 | 0 | 1 | 3 | 1 + 1 | 89 | 0 | 1 | 3 | 1 + 1 | 90 | 0 | 1 | 3 | 1 + 1 | 91 | 0 | 1 | 3 | 1 + 1 | 92 | 0 | 1 | 3 | 1 + 1 | 93 | 0 | 1 | 3 | 1 + 1 | 94 | 0 | 1 | 3 | 1 + 1 | 95 | 0 | 1 | 3 | 1 + 1 | 96 | 0 | 1 | 3 | 1 + 1 | 97 | 0 | 1 | 3 | 1 + 1 | 98 | 0 | 1 | 3 | 1 + 1 | 99 | 0 | 1 | 3 | 1 + 1 | 100 | 0 | 1 | 3 | 1 + 1 | 101 | 0 | 1 | 3 | 1 + 1 | 102 | 0 | 1 | 3 | 1 + 1 | 103 | 0 | 1 | 3 | 1 + 1 | 104 | 0 | 1 | 3 | 1 + 1 | 105 | 0 | 1 | 3 | 1 + 1 | 106 | 0 | 1 | 3 | 1 + 1 | 107 | 0 | 1 | 3 | 1 + 1 | 108 | 0 | 1 | 3 | 1 + 1 | 109 | 0 | 1 | 3 | 1 + 1 | 110 | 0 | 1 | 3 | 1 + 1 | 111 | 0 | 1 | 3 | 1 + 1 | 112 | 0 | 1 | 3 | 1 + 1 | 113 | 0 | 1 | 3 | 1 + 1 | 114 | 0 | 1 | 3 | 1 + 1 | 115 | 0 | 1 | 3 | 1 + 1 | 116 | 0 | 1 | 3 | 1 + 1 | 117 | 0 | 1 | 3 | 1 + 1 | 118 | 0 | 1 | 3 | 1 + 1 | 119 | 0 | 1 | 3 | 1 + 1 | 120 | 0 | 1 | 3 | 1 + 1 | 121 | 0 | 1 | 3 | 1 + 1 | 122 | 0 | 1 | 3 | 1 + 1 | 123 | 0 | 1 | 3 | 1 + 1 | 124 | 0 | 1 | 3 | 1 + 1 | 125 | 0 | 1 | 3 | 1 + 1 | 126 | 0 | 1 | 3 | 1 + 1 | 127 | 0 | 1 | 3 | 1 +(127 rows) + ALTER RESOURCE GROUP admin_group SET CONCURRENCY 20; ALTER --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
