diff --git a/src/pl/sys_package/ob_dbms_workload_repository.cpp b/src/pl/sys_package/ob_dbms_workload_repository.cpp index ab00e228a..db91994ee 100644 --- a/src/pl/sys_package/ob_dbms_workload_repository.cpp +++ b/src/pl/sys_package/ob_dbms_workload_repository.cpp @@ -561,7 +561,7 @@ int ObDbmsWorkloadRepository::usec_to_string( const char *NULL_CHAR = ""; const int NULL_CHAR_LENGTH = 0; const char *FILTER_EVENT_STR = - "CASE WHEN wait_class_id = 100 OR TIME_WAITED != 0 THEN 1 ELSE 0 END"; + "1"; const char *ASH_VIEW_SQL = "SELECT * FROM ( SELECT a.sample_id, a.sample_time, a.svr_ip, " " a.svr_port, a.con_id, a.user_id, a.session_id, a.session_type, a.session_state, " @@ -811,25 +811,25 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info( } else { common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; const uint64_t tenant_id = MTL_ID(); - const char *table_top[] = {"-", "-", "-", "-"}; - const int64_t column_widths[] = {40, 20, 10, 9}; - const char *column_headers[] = {"Event", "WAIT_CLASS", "EVENT_CNT", "% Event"}; + const char *table_top[] = {"-", "-", "-"}; + const int64_t column_widths[] = {40, 20, 9}; + const char *column_headers[] = {"Event", "WAIT_CLASS", "% Event"}; HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) { ObMySQLResult *result = nullptr; - if (OB_FAIL(format_row(4 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) { LOG_WARN("failed to format row", K(ret)); } else if (OB_FAIL(format_row( - 4 /*column_size*/, column_headers, column_widths, " ", "|", buff))) { + 3 /*column_size*/, column_headers, column_widths, " ", "|", buff))) { LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row(4 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + } else if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) { LOG_WARN("failed to format row", K(ret)); } else if (OB_FAIL(sql_string.append("SELECT /*+ MONITOR */ EVENT, WAIT_CLASS, COUNT(1)" " EVENT_CNT FROM ("))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { LOG_WARN("failed to append fmt ash view sql", K(ret)); - } else if (OB_FAIL(sql_string.append(") top_event GROUP BY EVENT, WAIT_CLASS"))) { + } else if (OB_FAIL(sql_string.append(") top_event GROUP BY EVENT, WAIT_CLASS ORDER BY EVENT_CNT DESC"))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), @@ -851,7 +851,6 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info( int64_t event_cnt = 0; char event[64] = ""; char wait_class[64] = ""; - char event_cnt_char[64] = ""; char event_radio_char[64] = ""; EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event, 64, tmp_real_str_len); EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( @@ -859,13 +858,12 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info( EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "EVENT_CNT", event_cnt, int64_t); double event_radio = static_cast(event_cnt) / num_events; event_radio = round(10000 * event_radio) / 100; - sprintf(event_cnt_char, "%ld", event_cnt); sprintf(event_radio_char, "%.2f%%", event_radio); if (OB_SUCC(ret)) { - const char *column_content[] = {event, wait_class, event_cnt_char, event_radio_char}; + const char *column_content[] = {event, wait_class, event_radio_char}; if (OB_FAIL(format_row( - 4 /*column_size*/, column_content, column_widths, " ", "|", buff))) { + 3 /*column_size*/, column_content, column_widths, " ", "|", buff))) { LOG_WARN("failed to format row", K(ret)); } } @@ -873,7 +871,7 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info( } // end while if (OB_SUCC(ret)) { - if (OB_FAIL(format_row(4 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) { LOG_WARN("failed to format row", K(ret)); } } @@ -1591,13 +1589,13 @@ int ObDbmsWorkloadRepository::print_ash_top_session_info(const AshReportParams & } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { LOG_WARN("failed to append fmt ash view sql", K(ret)); } else if (OB_FAIL(sql_string.append( - ") top_event GROUP BY SESSION_ID, USER_ID, EVENT HAVING COUNT(1) / "))) { + ") top_event GROUP BY SESSION_ID, USER_ID, EVENT "))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_string.append_fmt( - "%ld > 0.005 ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash ", num_samples))) { + "ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash "))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_string.append( - " LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID"))) { + " LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID ORDER BY SAMPLE_CNT DESC"))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), @@ -1727,11 +1725,10 @@ int ObDbmsWorkloadRepository::print_ash_top_blocking_session_info( "SESSION_ID, USER_ID, EVENT "))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_string.append_fmt( - "HAVING COUNT(1) / %ld > 0.005 ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash ", - num_samples))) { + "ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash "))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_string.append( - " LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID"))) { + " LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID ORDER BY SAMPLE_CNT DESC"))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), @@ -1843,9 +1840,8 @@ int ObDbmsWorkloadRepository::print_ash_top_latches_info( } else if (OB_FAIL(sql_string.append(" ) top_event WHERE wait_class_id = 104 AND" " SUBSTR(event, 1, 6) = 'latch:' "))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append_fmt("GROUP BY EVENT HAVING COUNT(1) / %ld > 0.005 " - "ORDER BY SAMPLE_CNT DESC) LIMIT 100", - num_samples))) { + } else if (OB_FAIL(sql_string.append_fmt("GROUP BY EVENT " + "ORDER BY SAMPLE_CNT DESC) LIMIT 100"))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), diff --git a/src/share/inner_table/sys_package/dbms_workload_repository_body.sql b/src/share/inner_table/sys_package/dbms_workload_repository_body.sql index f74f1f0fe..a8c550baa 100644 --- a/src/share/inner_table/sys_package/dbms_workload_repository_body.sql +++ b/src/share/inner_table/sys_package/dbms_workload_repository_body.sql @@ -145,7 +145,7 @@ IS NUM_SAMPLES Number; NUM_EVENTS Number; -- One event may cross many samples - FILTER_EVENT_STR CONSTANT VARCHAR2(100) := 'CASE WHEN wait_class_id = 100 OR TIME_WAITED != 0 THEN 1 ELSE 0 END'; + FILTER_EVENT_STR CONSTANT VARCHAR2(100) := '1'; BEGIN REPORT_CLEANUP(); @@ -192,7 +192,7 @@ BEGIN APPEND_ROW(' ----------'); APPEND_ROW(' Analysis Begin Time: ' || TO_CHAR(ASH_BEGIN_TIME, 'yyyy-mm-dd HH24:MI:SS')); APPEND_ROW(' Analysis End Time: ' || TO_CHAR(ASH_END_TIME, 'yyyy-mm-dd HH24:MI:SS')); - APPEND_ROW(' Elapsed Time: ' || TO_CHAR(DUR_ELAPSED)); -- TO_CHAR(ROUND(DUR_ELAPSED, DIG_2_FM)) || '(secs)'); + APPEND_ROW(' Elapsed Time: ' || TO_CHAR(DUR_ELAPSED) || '(secs)'); -- TO_CHAR(ROUND(DUR_ELAPSED, DIG_2_FM)) || '(secs)'); APPEND_ROW(' Num of Sample: ' || TO_CHAR(NUM_SAMPLES)); APPEND_ROW(' Num of Events: ' || TO_CHAR(NUM_EVENTS)); APPEND_ROW('Average Active Sessions: ' || TO_CHAR(ROUND(NUM_SAMPLES/DUR_ELAPSED,2), DIG_3_FM)); @@ -215,14 +215,14 @@ BEGIN APPEND_ROW(' '); APPEND_ROW('## Top User Events:'); - column_widths := COLUMN_WIDTH_ARRAY(40, 20, 10, 9); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-'); + column_widths := COLUMN_WIDTH_ARRAY(40, 20, 9); + column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - column_content := COLUMN_CONTENT_ARRAY('Event', 'WAIT_CLASS', 'EVENT_CNT', '% Event'); + column_content := COLUMN_CONTENT_ARRAY('Event', 'WAIT_CLASS', '% Event'); APPEND_ROW(FORMAT_ROW(column_content, column_widths, ' ', '|')); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-'); + column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - DYN_SQL := 'SELECT /*+ MONITOR */ EVENT, WAIT_CLASS, COUNT(1) EVENT_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || 'GROUP BY EVENT, WAIT_CLASS'; + DYN_SQL := 'SELECT /*+ MONITOR */ EVENT, WAIT_CLASS, COUNT(1) EVENT_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || 'GROUP BY EVENT, WAIT_CLASS ORDER BY EVENT_CNT DESC'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -238,12 +238,11 @@ BEGIN APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY( top_event_rec.EVENT, top_event_rec.WAIT_CLASS, - TO_CHAR(top_event_rec.EVENT_CNT), TO_CHAR(ROUND(100 * top_event_rec.EVENT_CNT/NUM_EVENTS,2), DIG_2_FM) || '%' ), column_widths, ' ', '|')); END LOOP; CLOSE top_event_cv; - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-'); + column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); @@ -408,7 +407,7 @@ BEGIN 'FROM (SELECT SQL_ID, PLAN_ID, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, EVENT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event GROUP BY SQL_ID, PLAN_ID, EVENT) ash ' || - 'LEFT JOIN SYS.GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) v1 WHERE ROWNUM < 100'; + 'LEFT JOIN SYS.GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) v1 WHERE ROWNUM < 20'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -422,9 +421,9 @@ BEGIN FETCH top_event_cv INTO top_sql_rec; EXIT WHEN top_event_cv%NOTFOUND; APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY( - top_sql_rec.SQL_ID, - TO_CHAR(top_sql_rec.PLAN_ID), - TO_CHAR(top_sql_rec.EVENT_CNT), + NVL(top_sql_rec.SQL_ID, ' '), + NVL(TO_CHAR(top_sql_rec.PLAN_ID), ' '), + NVL(TO_CHAR(top_sql_rec.EVENT_CNT), ' '), top_sql_rec.EVENT, TO_CHAR(ROUND(100 * top_sql_rec.EVENT_CNT/NUM_EVENTS, 2), DIG_2_FM) || '%', NVL(top_sql_rec.QUERY_SQL, ' ') @@ -453,7 +452,7 @@ BEGIN ' FROM (SELECT SQL_ID, PLAN_ID, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, EVENT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ' ) top_event WHERE wait_class_id != 100 GROUP BY SQL_ID, PLAN_ID, EVENT) ash ' || - 'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE ROWNUM < 100'; + 'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE ROWNUM < 20'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -484,7 +483,7 @@ BEGIN APPEND_ROW('## Complete List of SQL Text'); DYN_SQL := 'SELECT SQL_ID, PLAN_ID, QUERY_SQL FROM (SELECT pc.SQL_ID SQL_ID, pc.PLAN_ID, pc.QUERY_SQL QUERY_SQL ' || 'FROM (SELECT SQL_ID, PLAN_ID, COUNT(1) EVENT_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event GROUP BY SQL_ID, PLAN_ID, EVENT) ash ' || - 'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE QUERY_SQL IS NOT NULL AND ROWNUM < 100'; + 'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE QUERY_SQL IS NOT NULL AND ROWNUM < 20'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -517,8 +516,8 @@ BEGIN APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); DYN_SQL := 'SELECT SESSION_ID, EVENT, EVENT_CNT, SAMPLE_CNT, USERNAME USER_NAME ' || ' FROM (SELECT * FROM (SELECT SESSION_ID, USER_ID, EVENT, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, COUNT(1) SAMPLE_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || - ' GROUP BY SESSION_ID, USER_ID, EVENT HAVING COUNT(1) / :num_samples > 0.005 ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 100) ash ' || - ' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID'; + ' GROUP BY SESSION_ID, USER_ID, EVENT ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 20) ash ' || + ' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID ORDER BY SAMPLE_CNT DESC'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -527,7 +526,7 @@ BEGIN WAIT_CLASS, WAIT_CLASS, NULL_CHAR, NULL_CHAR, NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, NUM_SAMPLES; + NULL_CHAR, NULL_CHAR; LOOP FETCH top_event_cv INTO top_sess_rec; EXIT WHEN top_event_cv%NOTFOUND; @@ -561,8 +560,8 @@ BEGIN APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); DYN_SQL := 'SELECT SESSION_ID, EVENT, EVENT_CNT, SAMPLE_CNT, USERNAME USER_NAME ' || ' FROM (SELECT * FROM (SELECT SESSION_ID, USER_ID, EVENT, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, COUNT(1) SAMPLE_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || - ' WHERE wait_class_id != 100 GROUP BY SESSION_ID, USER_ID, EVENT HAVING COUNT(1) / :num_samples > 0.005 ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 100) ash ' || - ' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID'; + ' WHERE wait_class_id != 100 GROUP BY SESSION_ID, USER_ID, EVENT ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 20) ash ' || + ' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID ORDER BY SAMPLE_CNT DESC'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -571,18 +570,17 @@ BEGIN WAIT_CLASS, WAIT_CLASS, NULL_CHAR, NULL_CHAR, NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, NUM_SAMPLES; + NULL_CHAR, NULL_CHAR; LOOP FETCH top_event_cv INTO top_sess_rec; EXIT WHEN top_event_cv%NOTFOUND; - DBMS_OUTPUT.PUT_LINE(TO_CHAR(top_sess_rec.EVENT_CNT)); APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY( TO_CHAR(top_sess_rec.SESSION_ID), TO_CHAR(ROUND(100 * top_sess_rec.SAMPLE_CNT/NUM_SAMPLES, 2), DIG_2_FM) || '%', top_sess_rec.EVENT, TO_CHAR(top_sess_rec.EVENT_CNT), TO_CHAR(ROUND(100 * top_sess_rec.EVENT_CNT/NUM_EVENTS, 2), DIG_2_FM) || '%', - top_sess_rec.USER_NAME, + NVL(top_sess_rec.USER_NAME, ' '), TO_CHAR(top_sess_rec.EVENT_CNT) || '/' || TO_CHAR(DUR_ELAPSED) || '[' || TO_CHAR(ROUND(100*top_sess_rec.EVENT_CNT/DUR_ELAPSED, 2), DIG_2_FM) || '%]' ), column_widths, ' ', '|')); END LOOP; @@ -602,7 +600,7 @@ BEGIN column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); DYN_SQL := 'SELECT * FROM (SELECT EVENT, COUNT(1) SAMPLE_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || - ' WHERE wait_class_id = 104 AND SUBSTR(event, 0, 6) = ''latch:'' GROUP BY EVENT HAVING COUNT(1) / :num_samples > 0.005 ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 100'; + ' WHERE wait_class_id = 104 AND SUBSTR(event, 0, 6) = ''latch:'' GROUP BY EVENT ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 100'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -611,7 +609,7 @@ BEGIN WAIT_CLASS, WAIT_CLASS, NULL_CHAR, NULL_CHAR, NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, NUM_SAMPLES; + NULL_CHAR, NULL_CHAR; LOOP FETCH top_event_cv INTO top_latch_rec; EXIT WHEN top_event_cv%NOTFOUND;