[MySQL] Performance Schema 모니터링 테이블 - Statement Event 테이블

■ Statement Event 테이블

Perofmance Schema 계측기에서 명령문 실행을 보여줍니다. 명령문 이벤트는 이벤트 계층 구조의 높은 레벨에서 발생합니다. 이벤트 계층 구조 내에서 대기(Wait) 이벤트, 트랜잭션(Transaction) 이벤트, 명령문(Statement)와 같은 레벨의 이벤트입니다.

 

설정방법

다음과 같은 계측기들이 있습니다. 원하는 계측기에 ENABLED 컬럼을 YES, 타이머 정보까지 원한다면 TIMED컬럼을 YES 변경합니다.

mysql> SELECT *
       FROM performance_schema.setup_instruments
       WHERE NAME LIKE 'statement/%';
+---------------------------------------------+---------+-------+
| NAME                                        | ENABLED | TIMED |
+---------------------------------------------+---------+-------+
| statement/sql/select                        | YES     | YES   |
| statement/sql/create_table                  | YES     | YES   |
| statement/sql/create_index                  | YES     | YES   |
...
| statement/sp/stmt                           | YES     | YES   |
| statement/sp/set                            | YES     | YES   |
| statement/sp/set_trigger_field              | YES     | YES   |
| statement/scheduler/event                   | YES     | YES   |
| statement/com/Sleep                         | YES     | YES   |
| statement/com/Quit                          | YES     | YES   |
| statement/com/Init DB                       | YES     | YES   |
...
| statement/abstract/Query                    | YES     | YES   |
| statement/abstract/new_packet               | YES     | YES   |
| statement/abstract/relay_log                | YES     | YES   |
+---------------------------------------------+---------+-------+

 

컨슈머 테이블에서 해당 statement 이벤트를 YES 변경합니다.

mysql> SELECT *
       FROM performance_schema.setup_consumers
       WHERE NAME LIKE '%statements%';
+--------------------------------+---------+
| NAME                           | ENABLED |
+--------------------------------+---------+
| events_statements_current      | YES     |
| events_statements_history      | YES     |
| events_statements_history_long | NO      |
| statements_digest              | YES     |
+--------------------------------+---------+

 

statement 타이머에 대해 TIMER_NAME 원하는 시간단위로 변경합니다.

mysql> SELECT *
       FROM performance_schema.setup_timers
       WHERE NAME = 'statement';
+-----------+------------+
| NAME      | TIMER_NAME |
+-----------+------------+
| statement | NANOSECOND |
+-----------+------------+

 

• Statement 모니터링.

명령문 모니터링은 서버가 스레드에서 활동이 요청된 것을 확인한 순간부터 모든 활동이 중단된 순간까지 시작됩니다. 일반적으로 이것은 서버가 클라이언트로부터 첫번째 패킷을 받은 시간부터 서버가 응답을 보낸 시간까지를 의미합니다. 저장된 프로그램내의 명령문은 다른 명령문과 마찬가지로 모니터링됩니다.

 

성능 스키마가 요청(서버 명령 또는 SQL ) 계측할 최종 계측기 이름에 도달할때까지보다 일반적인(또는 추상)단계에서 구체적인 단계로 진행되는 계측기 이름을 사용합니다. 명령문 모니터링은 서버가 스레드에서 활동이 요청된 것을 확인한 순간부터 모든 활동이 중단된 순간까지 시작됩니다. 일반적으로 이것은 서버가 클라이언트로부터 첫번째 패킷을 받은 시간부터 서버가 응답을 보낸 시간까지를 의미합니다. 저장된 프로그램 내의 명령문은 다른 명령문과 마찬가지로 모니터링됩니다.

 

성능 스키마가 요청(서버 명령 또는 SQL) 계측할 최종 계측기 이름에 도달할 때까지보다 일반적인(또는 추상)단계에서 구체적인 단계로 진행되는 계측기 이름을 사용합니다.

 

최종 기기 이름은 서버 statement SQL문에 해당합니다.

1. 서버 명령은 mysql_com.h 헤더 파일에 정의되고 sql/sql_parse.cc에서 처리되는 COM_xxx코드에 해당합니다. COM_PING COM_QUIT 예입니다. 명령 계측기에는 statement/com/Ping statement/com/Quit 같이 statement/com 으로 시작하는 이름이 있습니다.

2. SQL 문은 DELETE FROM t1 또는 SELECT * FROM t2 같은 텍스트로 표현됩니다. SQL 문용 인스트루먼트에는 statement/sql/delete statement/sql/select 같이 statement/sql 시작하는 이름이 있습니다.

 

일부 최종 기기 이름은 오류 처리와 관련된 것입니다.

1. statement/com/Error 대역을 벗어난 서버에서받은 메시지를 설명합니다. 서버가 이해하지 못하는 클라이언트가 보낸 명령을 감지하는데 사용할 있습니다. 이는 잘못 구성된 클라이언트를 식별하거나 서버보다 최신 버전의 MySQL 사용하거나 서버를 공격하려는 클라이언트를 식별하는데 유용할 있습니다.

2. statement/sql/error 구문 분석에 실패한 SQL 문을 설명합니다. 클라이언트가 보낸 잘못된 쿼리를 감지하는데 사용할 있습니다. 구문 분석에 실패한 쿼리는 구문 분석하는 쿼리와 다르지만 실행중 오류로 인해 실패합니다. 예를 들어, SELECT * FROM 형식이 잘못되었으며 statement/sql/error 도구가 사용됩니다. 반대로 SELECT * 구문 분석을 수행하지만 테이블 사용 없음 오류와 함께 실패합니다. 경우 statement/sql/select 사용되며 statement 이벤트에는 오류의 특성을 나타내는 정보가 포함됩니다.

 

다음 소스에서 요청할 있습니다.

1. 요청을 패킷으로 보내는 클라이언트의 명령 또는 명령문 요청으로

2. 복제본의 릴레이 로그에서 읽은 statement 문자열로

3. 이벤트 스케줄러의 이벤트로

요청에 대한 세부 정보는 처음에 알려지지 않았으며 성능 스키마는 요청 소스에 따라 순서대로 추상에서 특정 기기 이름으로 진행됩니다.

 

클라이언트로부터받은 요청의 경우 :

1. 서버가 소켓 수준에서 패킷을 감지하면 statement/abstract/new_packet 추상 계측기 이름으로 명령문이 시작됩니다.

2. 서버가 패킷 번호를 읽을때 수신된 요청 유형에 대해 많이 알고 성능 스키마가 기기 이름을 구체화합니다. 예를 들어 요청이 COM_PING 패킷인 경우 계측기 이름은 statement/com/Ping이되고 이것이 최종 이름입니다. 요청이 COM_QUERY 패킷인 경우 특정 유형의 문이 아닌 SQL문에 해당하는 것으로 알려져 있습니다. 경우 도구는 하나의 추상 이름에서 구체적이지만 여전히 추상적 이름, statement/abstract/Query 변경되며 요청에는 추가 분류가 필요합니다.

3. 요청이 명령문이면 명령문 텍스트를 읽고 파서에 제공합니다. 구문 분석후 정확한 명령문 유형이 알려져 있습니다. 예를 들어 요청이 INSERT 문인 경우 성능 스키마는 statement/abstract/Query에서 최종 이름인 statement/sql/insert 계측기 이름을 구체화합니다.

 

복제본의 릴레이 로그에서 명령문으로 읽은 요청의 경우 :

1. 릴레이 로그의 명령문은 텍스트로 저장되고 그대로 읽힙니다. 네트워크 프로토콜이 없으므로 statement/abstract/new_packet 계측기는 사용되지 않습니다. 대신, 초기 도구는 statement/abstract/relay_log입니다.

2. 명령문을 구문 분석할 정확한 명령문 유형이 알려져 있습니다. 예를 들어 요청이 INSERT 문인 경우 성능 스키마는 statement/abstract/Query에서 최종 이름인 statement/sql/insert 계측기 이름을 구체화합니다.

 

앞의 설명은 명령문 기반 복제에만 적용됩니다. 기반 복제의 경우 변경을 처리할 복제본에서 수행된 테이블 I/O 계측 있지만 릴레이 로그의 이벤트는 개별문으로 나타나지 않습니다.

 

이벤트 스케줄러에서받은 요청의 경우 :

이벤트 실행은 name statement/scheduler/event 사용하여 계측됩니다. 이것이 최종 이름입니다.

 

이벤트 본문내에서 실행되는 명령문은 이전의 추상 도구를 사용하지 않고 statement/sql/* 이름을 사용하여 계측됩니다. 이벤트는 저장된 프로그램이며 저장된 프로그램은 실행전에 메모리에 미리 컴파일됩니다. 결과적으로 런타임에는 구문 분석이 없으며 명령문의 유형은 실행 시간에 의해 알려집니다.

 

이벤트 본문 내에서 실행되는 명령문은 자식 명령문입니다. 예를 들어 이벤트가 INSERT 문을 실행하는 경우 이벤트 자체의 실행은 statement/scheduler/event 사용하여 계측된 부모이고 INSERT statement/sql/insert 사용하여 계측된 자식입니다. 별도의 계측된 작업간에 부모/자식 관계가 유지됩니다. 이것은 추상에서 최종 계측기 이름에 이르기까지 단일 계측 작업 내에서 발생하는 개선 순서와 다릅니다.

 

명령문에 대한 통계를 수집하려면 개별 명령문 유형에 사용되는 마지막 statement/sql/* 도구만 활성화하는 것만으로는 충분하지 않습니다. 추상 statement/abstract/* 도구도 활성화해야합니다. 모든 명세서 도구가 기본적으로 활성화되어 있으므로 일반적으로 문제가되지 않습니다. 그러나 명령문 도구를 선택적으로 활성화 또는 비활성화하는 응용 프로그램은 추상도구를 비활성화하면 개별 명령문 계측기에 대한 통계 수집도 비활성화된다는 점을 고려해야합니다. 예를 들어, INSERT문에 대한 통계를 수집하려면 statement/sql/insert 활성화해야하지만 statement/abstract/new_packet statement/abstract/Query 활성화해야 합니다. 마찬가지로, 복제 명령문을 계측하려면 statement/abstract/relay_log 활성화해야 합니다.

 

statement/abstract/Query 같은 추상 도구에 대한 통계는 집계되지 않습니다. 추상 도구를 사용하여 최종 명령문 이름으로 분류된 명령문이 없기 때문입니다.

 

 

 

 

▶︎ events_statements_current : 스레드에 대한 현재 명령문 이벤트.

events_statements_current 테이블에는 현재 명령문 이벤트가 포함됩니다. 테이블은 스레드의 가장 최근 모니터된 명령문 이벤트의 현재 상태를 표시하는 스레드당 하나의 행을 저장하므로 테이블 크기를 구성하기위한 시스템 변수가 없습니다.

 

명령문 이벤트 행을 포함하는 테이블 중에서 events_statements_current 가장 기본입니다. 명령문 이벤트 행을 포함하는 다른 테이블은 현재 이벤트에서 논리적으로 파생됩니다. 예를 들어 events_statements_history events_statements_history_long 테이블은 각각 스레드당 최대 수까지, 그리고 모든 스레드에서 전역적으로 종료된 가장 최근의 명령문 이벤트 모음입니다.

 

주요 컬럼

- THREAD_ID, EVENT_ID

이벤트와 연관된 스레드 이벤트가 시작될때 스레드 현재 이벤트 번호. 함께 취해진 THREAD_ID EVENT_ID 값은 행을 고유하게 식별합니다. 행에 동일한 쌍이 없습니다.

 

- END_EVENT_ID

컬럼은 이벤트가 시작될 NULL 설정되고 이벤트가 종료 스레드 현재 이벤트 번호로 업데이트됩니다.

 

- EVENT_NAME

이벤트가 수집된 도구의 이름입니다. 이것은 setup_instruments 테이블의 NAME 값입니다.

SQL 문의 경우 EVENT_NAME 값은 처음에는 문이 구문 분석 때까지 statement/com/Query입니다.

 

- SOURCE

이벤트를 생성한 계측된 코드가 포함된 소스 파일의 이름과 계측이 발생한 파일의 번호입니다. 이를 통해 소스를 확인하여 관련된 코드를 정확히 확인할 있습니다.

 

- TIMER_START, TIMER_END, TIMER_WAIT

이벤트 타이밍 정보. 값의 단위는 피코초(1조분의 1)입니다. TIMER_START TIMER_END 값은 이벤트 타이밍이 시작되고 종료된 시기를 나타냅니다.

TIMER_WAIT 이벤트 경과 시간 (기간)입니다.

이벤트가 완료되지 않은 경우 TIMER_END 현재 타이머 값이고 TIMER_WAIT 지금까지 경과한 시간입니다(TIMER_END-TIMER_START).

TIMED=NO 계측기에서 이벤트가 생성되면 타이밍 정보가 수집되지 않고 TIMER_START, TIMER_END TIMER_WAIT 모두 NULL입니다.

 

- LOCK_TIME

테이블 잠금을 기다리는 소요된 시간입니다. 값은 마이크로초 단위로 계산되지만 다른 성능 스키마 타이머와 쉽게 비교할 있도록 피코초로 정규화됩니다.

 

- SQL_TEXT

SQL문의 텍스트입니다. SQL문과 연관되지 않은 명령의 경우 값은 NULL입니다.

명령문 표시에 사용할 수있는 최대 공간은 기본적으로 1024 바이트입니다. 값을 변경하려면 서버 시작시 performance_schema_max_sql_text_length 시스템 변수를 설정하십시오.

 

- DIGEST

명령문은 MD5값을 32개의 16진수 문자열로 요약하거나, statements_digest 소비자가 no이면 NULL입니다.

 

- DIGEST_TEXT

정규화된 명령문 다이제스트 텍스트 또는 statements_digest 소비자가 no 경우 NULL입니다.

performance_schema_max_digest_length 시스템 변수는 다이제스트값 저장에 대해 세션당 사용 가능한 최대 바이트 수를 결정합니다. 그러나 다이제스트 버퍼의 키워드 리터럴값과 같은 명령문 요소의 인코딩으로 인해 명령문 요약의 표시 길이가 사용 가능한 버퍼 크기보다 있습니다. 결과적으로 명령문 이벤트 테이블의 DIGEST_TEXT 열에서 선택한 값이 performance_schema_max_digest_length값을 초과하는 것처럼 보일 있습니다.

 

- CURRENT_SCHEMA

명령문의 기본 데이터베이스입니다. 없는 경우 NULL입니다.

 

- OBJECT_SCHEMA, OBJECT_NAME, OBJECT_TYPE

중첩된 명령문(저장 프로그램) 경우 이러한 컬럼에는 상위 명령문에 대한 정보가 포함됩니다. 그렇지 않으면 NULL입니다.

 

- OBJECT_INSTANCE_BEGIN

컬러은 명령문을 식별합니다. 값은 메모리에있는 개체의 주소입니다.

 

- MYSQL_ERRNO

명령문 진단 영역의 명령문 오류 번호입니다.

 

- RETURNED_SQLSTATE

명령문 진단 영역의 명령문 SQLSTATE .

 

- MESSAGE_TEXT

명령문 진단 영역의 명령문 오류 메시지.

 

- ERRORS

명령문에 오류가 발생했는지 여부. SQLSTATE 값이 00 (완료) 또는 01 (경고) 시작하는 경우 값은 0입니다. 값은 1이며 SQLSTATE 값은 다른 것입니다.

 

- WARNINGS

명령문 진단 영역의 경고 수입니다.

 

- ROWS_AFFECTED

명령문의 영향을받는 수입니다.

 

- ROWS_SENT

명령문에서 반환 수입니다.

 

- ROWS_EXAMINED

서버 계층에서 검사한 (스토리지 엔진 내부 처리는 계산하지 않음)

 

- CREATED_TMP_DISK_TABLES

Created_tmp_disk_tables 상태 변수와 비슷하지만 명령문에만 해당됩니다.

 

- CREATED_TMP_TABLES

Created_tmp_tables 상태 변수와 비슷하지만 명령문에 따라 다릅니다.

 

- SELECT_FULL_JOIN

Select_full_join 상태 변수와 비슷하지만 명령문에만 해당됩니다.

 

- SELECT_FULL_RANGE_JOIN

Select_full_range_join 상태 변수와 비슷하지만 명령문에만 해당됩니다.

 

- SELECT_RANGE

Select_range 상태 변수와 비슷하지만 명령문에만 해당됩니다.

 

- SELECT_RANGE_CHECK

Select_range_check 상태 변수와 비슷하지만 명령문에만 해당됩니다.

 

- SELECT_SCAN

Select_scan 상태 변수와 비슷하지만 명령문에만 해당됩니다.

 

- SORT_MERGE_PASSES

Sort_merge_passes 상태 변수와 비슷하지만 명령문에만 해당됩니다.

 

- SORT_RANGE

Sort_range 상태 변수와 비슷하지만 명령문에만 해당됩니다.

 

- SORT_ROWS

Sort_rows 상태 변수와 비슷하지만 명령문에만 해당됩니다.

 

- SORT_SCAN

Sort_scan 상태 변수와 비슷하지만 명령문에만 해당됩니다.

 

- NO_INDEX_USED

명령문이 인덱스를 사용하지 않고 테이블 스캔을 수행하면 1, 그렇지 않으면 0입니다.

 

- NO_GOOD_INDEX_USED

서버가 명령문에 사용할 좋은 색인을 찾지 못하면 1, 그렇지 않으면 0입니다.

 

- NESTING_EVENT_ID, NESTING_EVENT_TYPE, NESTING_EVENT_LEVEL

컬럼은 다른 컬럼과 함께 사용되어 최상위(중첩되지 않은) 명령문 중첩된 명령문(저장 프로그램 내에서 실행 ) 대해 다음과 같은 정보를 제공합니다.

 

최상위 :

OBJECT_TYPE = NULL

OBJECT_SCHEMA = NULL

OBJECT_NAME = NULL

NESTING_EVENT_ID = NULL

NESTING_EVENT_TYPE = NULL

NESTING_LEVEL = 0

 

중첩 명령문의 경우 :

OBJECT_TYPE = the parent statement object type

OBJECT_SCHEMA = the parent statement object schema

OBJECT_NAME = the parent statement object name

NESTING_EVENT_ID = the parent statement EVENT_ID

NESTING_EVENT_TYPE = 'STATEMENT'

NESTING_LEVEL = the parent statement NESTING_LEVEL plus one

 

• Tuncate Table 허용 여부.

events_statements_current 테이블에는 TRUNCATE TABLE 허용됩니다.

 

 

▶︎ events_statements_history : 스레드별로 종료 가장 최근의 명령문 이벤트.

events_statements_history 테이블에는 스레드별로 종료된 N개의 최근 명령문 이벤트가 포함됩니다. 명령문 이벤트는 종료될 때까지 테이블에 추가되지 않습니다.

테이블에 주어진 스레드에 대한 최대 수가 포함된 경우 해당 스레드에 대한 행이 추가될 가장 오래된 스레드 행이 삭제됩니다. 스레드가 종료되면 모든 행이 삭제됩니다.

 

성능 스키마는 서버 시작 중에 N값을 자동으로 조정합니다. 스레드당 수를 명시적으로 설정하려면 서버 시작시 performance_schema_events_statements_history_size 시스템 변수를 설정합니다.

 

 

▶︎ events_statements_history_long : 전역 적으로 (모든 스레드에서) 종료 가장 최근의 명령문 이벤트.

events_statements_history_long 테이블에는 모든 스레드에서 전역적으로 종료된 N개의 최근 명령문 이벤트가 포함됩니다.

명령문 이벤트는 종료될 때까지 테이블에 추가되지 않습니다. 테이블이 가득차면 어느 스레드가 어느 행을 생성했는지에 관계없이 행이 추가될 가장 오래된 행이 삭제됩니다.

N값은 서버 시작시 자동으로 조정됩니다. 테이블 크기를 명시적으로 설정하려면 서버 시작시 performance_schema_events_statements_history_long_size 시스템 변수를 설정합니다.

 

 

▶︎ prepared_statements_instances : 

성능 스키마는 가지 프로토콜이있는 준비된 명령문에 대한 도구를 제공합니다.

 

바이너리 프로토콜. 이는 MySQL C API 통해 액세스되며 다음 표와 같이 기본 서버 명령에 매핑됩니다.

C API Function Corresponding Server Command
mysql_stmt_prepare() COM_STMT_PREPARE
mysql_stmt_execute() COM_STMT_EXECUTE
mysql_stmt_close() COM_STMT_CLOSE

 

텍스트 프로토콜. 이는 SQL 문을 사용하여 액세스되며 다음 표에 표시된 것처럼 기본 서버 명령에 매핑됩니다.

SQL Statement Corresponding Server Command
PREPARE SQLCOM_PREPARE
EXECUTE SQLCOM_EXECUTE
DEALLOCATE PREPAREDROP PREPARE SQLCOM_DEALLOCATE PREPARE

 

성능 스키마 prepared statements 계측은 프로토콜을 모두 포함합니다. 다음 설명은 C API함수 또는 SQL문이 아닌 서버 명령을 참조합니다.

 

준비된 명령문에 대한 정보는 ready_statements_instances 테이블에서 사용할 있습니다. 테이블은 서버에서 사용되는 준비된 명령문을 검사할 있도록 하며 이에 대한 집계된 통계를 제공합니다. 테이블의 크기를 제어하려면 서버 시작시 performance_schema_max_prepared_statements_instances 시스템 변수를 설정합니다.

 

prepared statement 정보의 수집은 다음표에 표시된 명세서 도구에 따라 다릅니다. 이러한 기기는 기본적으로 활성화되어 있습니다. 이를 수정하려면 setup_instruments 테이블을 업데이트합니다.

Instrument Server Command
statement/com/Prepare COM_STMT_PREPARE
statement/com/Execute COM_STMT_EXECUTE
statement/sql/prepare_sql SQLCOM_PREPARE
statement/sql/execute_sql SQLCOM_EXECUTE

 

성능 스키마는 Prepared_statements_instances 테이블의 내용을 다음과 같이 관리합니다.

- Statement preparation

COM_STMT_PREPARE 또는 SQLCOM_PREPARE 명령은 서버에 prepared statement 만듭니다. 명령문이 성공적으로 계측되면 Prepared_statements_instances 테이블에 행이 추가됩니다. 명령문을 계측할 없는 경우 Performance_schema_prepared_statements_lost 상태 변수가 증가합니다.

 

- Prepared statement execution(준비된 명령문 실행)

인스트루먼트된(계측된) prepared statements 인스턴스에 대해 COM_STMT_EXECUTE 또는 SQLCOM_PREPARE 명령을 실행하면 해당하는 prepared_statements_instances 테이블 행이 업데이트 됩니다.

 

- Prepared statement deallocation(준비된 명령문 할당 해제)

인스트루먼트된(계측된) prepared statements 인스턴스에 대해 COM_STMT_CLOSE 또는 SQLCOM_DEALLOCATE_PREPARE 명령을 실행하면 해당하는 prepared_statements_instances 테이블 행이 제거됩니다. 리소스 누출을 방지하기 위해 앞서 설명한 준비된 명령문 도구가 비활성화 경우에도 제거가 발생합니다.

 

 

주요 컬럼 :

- OBJECT_INSTANCE_BEGIN

계측된 준비 명령문의 메모리 주소입니다.

 

- STATEMENT_ID

서버에서 할당한 내부 명령문 ID입니다. 텍스트 이진 프로토콜은 모두 명령문 ID 사용합니다.

 

- STATEMENT_NAME

바이너리 프로토콜의 경우 컬럼은 NULL입니다. 텍스트 프로토콜의 경우 컬럼은 사용자가 지정한 외부 명령문 이름입니다. 예를 들어, 다음 SQL 문의 경우 준비된 명령문의 이름은 stmt입니다.

PREPARE stmt FROM 'SELECT 1';

 

- SQL_TEXT

?(물음표) 위치 표시자 마커가 포함된 prepared statement 텍스트.

 

- OWNER_THREAD_ID, OWNER_EVENT_ID

컬럼은 준비된 명령문을 생성 이벤트를 나타냅니다.

 

- OWNER_OBJECT_TYPE, OWNER_OBJECT_SCHEMA, OWNER_OBJECT_NAME

클라이언트 세션에서 생성된 prepared statements 경우 이러한 컬럼은 NULL입니다. 저장 프로그램에 의해 작성된 prepared statements 경우 컬럼은 저장 프로그램을 가리킵니다.

일반적인 사용자 오류는 준비된 명령문을 할당 해제하는 것을 잊는 것입니다. 다음 컬럼을 사용하여 준비된 명령문을 누출하는 저장된 프로그램을 찾을 있습니다.

SELECT

  OWNER_OBJECT_TYPE, OWNER_OBJECT_SCHEMA, OWNER_OBJECT_NAME,

  STATEMENT_NAME, SQL_TEXT

FROM performance_schema.prepared_statements_instances

WHERE OWNER_OBJECT_TYPE IS NOT NULL;

prepared statements 자체를 실행하는데 소요된 시간입니다.

 

- COUNT_REPREPARE

명세서가 내부적으로 작성된 횟수. 준비를위한 타이밍 통계는 별도의 작업이 아니라 명령문 실행의 일부로 계산되기 때문에 사용할 없습니다.

 

- COUNT_EXECUTE, SUM_TIMER_EXECUTE, MIN_TIMER_EXECUTE, AVG_TIMER_EXECUTE, MAX_TIMER_EXECUTE

준비된 명령문 실행에 대한 집계된 통계입니다.

 

- SUM_xxx

나머지 SUM_xxx 컬럼은 명령문 요약 테이블의 경우와 동일합니다.

 

• Tuncate Table 허용 여부.

TRUNCATE TABLE Prepared_statements_instances 테이블의 통계컬럼을 재설정합니다.

 

 

▶︎ Statement Summary 테이블

성능 스키마는 현재 최근 명령문 이벤트를 수집하기 위한 테이블을 유지 관리하며 해당 정보를 요약 테이블에 집계합니다.

명령문 이벤트 내용, 현재 과거 명령문 이벤트 , 기본적으로 부분적으로 비활성화된 명령문 이벤트 수집을 제어하는 방법에 대한 자세한 내용은 설명을 참조합니다.

 

예제 명령문 이벤트 요약 정보 :

mysql> SELECT *
       FROM performance_schema.events_statements_summary_global_by_event_name\G
*************************** 1. row ***************************
                 EVENT_NAME: statement/sql/select
                 COUNT_STAR: 25
             SUM_TIMER_WAIT: 1535983999000
             MIN_TIMER_WAIT: 209823000
             AVG_TIMER_WAIT: 61439359000
             MAX_TIMER_WAIT: 1363397650000
              SUM_LOCK_TIME: 20186000000
                 SUM_ERRORS: 0
               SUM_WARNINGS: 0
          SUM_ROWS_AFFECTED: 0
              SUM_ROWS_SENT: 388
          SUM_ROWS_EXAMINED: 370
SUM_CREATED_TMP_DISK_TABLES: 0
     SUM_CREATED_TMP_TABLES: 0
       SUM_SELECT_FULL_JOIN: 0
 SUM_SELECT_FULL_RANGE_JOIN: 0
           SUM_SELECT_RANGE: 0
     SUM_SELECT_RANGE_CHECK: 0
            SUM_SELECT_SCAN: 6
      SUM_SORT_MERGE_PASSES: 0
             SUM_SORT_RANGE: 0
              SUM_SORT_ROWS: 0
              SUM_SORT_SCAN: 0
          SUM_NO_INDEX_USED: 6
     SUM_NO_GOOD_INDEX_USED: 0
...

 

  명령문 요약 테이블에는 테이블이 이벤트를 집계하는 방법을 나타내는 하나 이상의 그룹화 컬럼이 있습니다. 이벤트 이름은 setup_instruments 테이블의 이벤트 장비 이름을 참조합니다.

- events_statements_summary_by_account_by_event_name에는 EVENT_NAME, USER HOST 열이 있습니다. 행은 지정된 계정 (사용자 호스트 조합) 이벤트 이름에 대한 이벤트를 요약합니다.

- events_statements_summary_by_digest에는 SCHEMA_NAME DIGEST 열이 있습니다. 행은 스키마 다이제스트 값당 이벤트를 요약합니다. (DIGEST_TEXT 컬럼은 해당하는 정규화된 명령문 요약 텍스트를 포함하지만 그룹화도 요약 컬럼도 아닙니다.)

  테이블의 최대행 수는 서버 시작시 자동으로 조정됩니다. 최대 값을 명시적으로 설정하려면 서버 시작시 performance_schema_digests_size 시스템 변수를 설정합니다.

- events_statements_summary_by_host_by_event_name에는 EVENT_NAME HOST컬럼이 있습니다. 행은 지정된 호스트 이벤트 이름에 대한 이벤트를 요약합니다.

- events_statements_summary_by_program에는 OBJECT_TYPE, OBJECT_SCHEMA OBJECT_NAME컬럼이 있습니다. 행은 지정된 저장 프로그램 (저장 프로 시저 또는 함수, 트리거 또는 이벤트) 대한 이벤트를 요약합니다.

- events_statements_summary_by_thread_by_event_name에는 THREAD_ID EVENT_NAME 컬럼이 있습니다. 행은 주어진 스레드 이벤트 이름에 대한 이벤트를 요약합니다.

- events_statements_summary_by_user_by_event_name에는 EVENT_NAME USER 컬럼이 있습니다. 행은 주어진 사용자 이벤트 이름에 대한 이벤트를 요약합니다.

- events_statements_summary_global_by_event_name에는 EVENT_NAME 컬럼 있습니다. 행은 주어진 이벤트 이름에 대한 이벤트를 요약합니다.

- prepared_statements_instances 에는 OBJECT_INSTANCE_BEGIN 컬럼이 있습니다. 행은 주어진 준비된 명령문에 대한 이벤트를 요약합니다.

 

  명령문 요약 테이블에는 집계 값이 포함 다음 요약 컬럼이 있습니다 (설명 예외 사항 포함).

- COUNT_STAR, SUM_TIMER_WAIT, MIN_TIMER_WAIT, AVG_TIMER_WAIT, MAX_TIMER_WAIT

  이러한 열은 명령문 요약 테이블이 events_waits_current 아닌 events_statements_current에서 이벤트를 집계한다는 점을 제외하면 대기 이벤트 요약 테이블 (24.12.15.1 대기 이벤트 요약 테이블참조)에있는 동일한 이름의 열과 유사합니다.

  prepared_statements_instances 테이블에는 이러한 컬럼이 없습니다.

 

- SUM_xxx

  events_statements_current 테이블에서 해당 xxx컬럼의 집계입니다. 예를 들어, 명령문 요약 테이블의 SUM_LOCK_TIME SUM_ERRORS 컬럼은 events_statements_current 테이블의 LOCK_TIME ERRORS 컬럼의 집계입니다.

 

 events_statements_summary_by_digest 테이블에는 다음과 같은 추가 요약 컬럼이 있습니다.

- FIRST_SEEN, LAST_SEEN

주어진 다이제스트 값이 있는 문이 처음 표시되고 가장 최근에 표시되는 시간을 나타내는 타임 스탬프입니다.

 

 events_statements_summary_by_program 테이블에는 다음과 같은 추가 요약 컬럼이 있습니다.

- COUNT_STATEMENTS, SUM_STATEMENTS_WAIT, MIN_STATEMENTS_WAIT, AVG_STATEMENTS_WAIT, MAX_STATEMENTS_WAIT

스토어드 프로그램 실행 중에 호출 중첩 명령문에 대한 통계입니다.

 

prepared_statements_instances 테이블에는 다음과 같은 추가 요약 컬럼이 있습니다.

- COUNT_EXECUTE, SUM_TIMER_EXECUTE, MIN_TIMER_EXECUTE, AVG_TIMER_EXECUTE, MAX_TIMER_EXECUTE

prepared statement 실행에 대한 집계된 통계입니다.

 

 TRUNCATE TABLE 명령문 요약 테이블에 허용됩니다. 다음과 같은 효과가 있습니다.

- events_statements_summary_by_digest 경우 행을 제거합니다.

- 계정, 호스트 또는 사용자별로 집계되지 않은 기타 요약 테이블의 경우 잘림은 행을 제거하지 않고 요약 열을 0으로 재설정합니다.

- 계정, 호스트 또는 사용자별로 집계 다른 요약 테이블의 경우 잘림은 연결이없는 계정, 호스트 또는 사용자에 대한 행을 제거하고 나머지 행에 대해 요약 열을 0으로 재설정합니다.

 

 또한 계정, 호스트, 사용자 또는 스레드별로 집계 명령문 요약 테이블은 종속 연결 테이블의 절단 또는 events_statements_summary_global_by_event_name 절단에 의해 내재적으로 절단됩니다.

 

명령문 다이제스트 집계 규칙

setup_consumers 테이블의 statement_digest consumer 설정이 활성화된 경우 명령문이 완료되면 다음과 같이 events_statements_summary_by_digest 집계됩니다. 집계는 명령문에 대해 계산된 DIGEST 값을 기반으로합니다.

- 방금 완료된 명령문에 대한 다이제스트 값이 있는 events_statements_summary_by_digest 행이 이미 있는경우 명령문에 대한 통계가 해당 행으로 집계됩니다. LAST_SEEN 컬럼이 현재 시간으로 업데이트됩니다.

- 방금 완료된 명령문에 대한 요약값이 있는 행이 없고 테이블이 가득차지 않은 경우 명령문에 대해 행이 작성됩니다. FIRST_SEEN LAST_SEEN컬럼은 현재 시간으로 초기화됩니다.

- 방금 완료된 명령문에 대한 명령문 요약값이 있는 행이 없고 테이블이 가득찬 경우 방금 완료된 명령문에 대한 통계가 DIGEST=NULL 특수 catch-all행에 추가되며 필요한 경우 생성됩니다. 행이 생성되면 FIRST_SEEN LAST_SEEN컬럼이 현재 시간으로 초기화됩니다. 그렇지 않으면 LAST_SEEN컬럼이 현재 시간으로 업데이트됩니다.

 

 성능 스키마 테이블이 메모리 제약으로 인해 최대 크기를 가지므로 DIGEST=NULL 행이 유지됩니다. DIGEST=NULL 행은 요약 테이블이 가득찬 경우에도 다른 행과 일치하지 않는 다이제스트가 공통 "기타"버킷을 사용하여 계산되도록 허용합니다. 행은 요약 요약이 대표적인지 여부를 추정하는 도움이됩니다.

- 모든 다이제스트의 5% 나타내는 COUNT_STAR값이 있는 DIGEST=NULL 행은 다이제스트 요약 테이블이 매우 대표적임을 나타냅니다. 다른 행은 명세서의 95% 차지합니다.

- 모든 다이제스트의 50% 나타내는 COUNT_STAR 값이 있는 DIGEST=NULL 행은 다이제스트 요약 테이블이 그다지 대표적이지 않음을 나타냅니다. 다른 행은 명세서의 절반만 포함합니다.

DBA DIGEST=NULL 행에 포함된 많은 행이 대신 구체적인 행을 사용하여 계산되도록 최대 테이블 크기를 늘려야 합니다. 이렇게 하려면 서버 시작시 performance_schema_digests_size 시스템 변수를 값으로 설정합니다. 기본 크기는 200입니다.

 

저장 프로그램 계측 동작

setup_objects 테이블에서 계측이 활성화된 내장 프로그램 유형의 경우 events_statements_summary_by_program 다음과 같이 내장 프로그램에 대한 통계를 유지합니다.

- 객체가 서버에서 처음 사용될 행이 추가됩니다.

- 개체를 삭제하면 개체 행이 제거됩니다.

- 통계는 개체가 실행될 행에 집계됩니다.

 

▣ Performance Schema 목차.

[MySQL] Performance Schema 소개 및 사용방법

 

[MySQL] Performance Schema 소개 및 사용방법

■ Performance Schema 소개 MySQL 성능 스키마는 낮은 수준에서 MySQL 서버 실행을 모니터링하는 기능입니다. 성능 스키마에는 다음과 같은 특성이 있습니다. - 성능 스키마는 런타임에 서버의 내부 실

myinfrabox.tistory.com

[MySQL] Performance Schema 상태 모니터링

 

[MySQL] Performance Schema 상태 모니터링

■ performance schema 상태 모니터링. 다음과 같은 쿼리로 performance schema의 상태를 확인할 수 있습니다. mysql> SHOW STATUS LIKE 'perf%'; +-----------------------------------------------+-------+ | V..

myinfrabox.tistory.com

[MySQL] Performance Schema 설정 테이블 - Setup 및 Instance 테이블

 

[MySQL] Performance Schema 설정 테이블 - Setup 및 Instance 테이블

■ Setup Tables setup_actors : 새로운 포그라운드 스레드(foreground threads : 접속 클라이언트 혹은 서버)에 대한 모니터링을 초기화하는 방법 setup_consumers : 이벤트 정보를 보내고 저장할 수 있는 대상 s..

myinfrabox.tistory.com

[MySQL] Performance Schema 모니터링 테이블 - Wait Event 및 Lock 테이블

 

[MySQL] Performance Schema 모니터링 테이블 - Wait Event 및 Lock 테이블

■ Wait Event 테이블 종류 성능 스키마 도구는 시간이 걸리는 이벤트를 대기합니다. 이벤트 계층 구조 내에서 대기 이벤트는 트랜잭션 이벤트 내에 중첩되는 명령문 이벤트 내에 중첩되는 스테이

myinfrabox.tistory.com

[MySQL] Performance Schema 모니터링 테이블 - Stage Event 테이블

 

[MySQL] Performance Schema 모니터링 테이블 - Stage Event 테이블

■ Stage Event 테이블 성능 스키마 단계는 명령문 구문 분석, 테이블 열기 또는 파일 정렬 작업 수행과 같은 명령 실행 프로세스 중 단계입니다. 스테이지는 SHOW PROCESSLIST에 의해 표시되거나 INFORMATI

myinfrabox.tistory.com

 

[MySQL] Performance Schema 모니터링 테이블 - Statement Event 테이블

 

[MySQL] Performance Schema 모니터링 테이블 - Statement Event 테이블

■ Statement Event 테이블 성능 스키마 도구 명령문 실행. 명령문 이벤트는 이벤트 계층 구조의 높은 수준에서 발생합니다. 이벤트 계층 구조 내에서 대기 이벤트는 트랜잭션 이벤트 내에 중첩되는

myinfrabox.tistory.com

[MySQL] Performance Schema 모니터링 테이블 - Transaction 테이블

 

[MySQL] Performance Schema 모니터링 테이블 - Transaction 테이블

■ Transaction 테이블 성능 스키마는 트랜잭션을 계측합니다. 이벤트 계층 구조 내에서 대기 이벤트는 트랜잭션 이벤트 내에 중첩되는 명령문 이벤트 내에 중첩되는 스테이지 이벤트 내에 중첩됩

myinfrabox.tistory.com

[MySQL] Performance Schema 모니터링 테이블 - Connection 및 Connection Attribute 테이블

 

[MySQL] Performance Schema 모니터링 테이블 - Connection 및 Connection Attribute 테이블

■ Connection 테이블 클라이언트가 MySQL 서버에 연결하면 특정 사용자 이름과 특정 호스트에서 연결됩니다. 성능 스키마는 이러한 연결에 대한 통계를 제공하고 다음 표를 사용하여 계정 (사용자

myinfrabox.tistory.com

[MySQL] Performance Schema 모니터링 테이블 - User, 시스템, 상태 및 기타 테이블

 

[MySQL] Performance Schema 모니터링 테이블 - User, 시스템, 상태 및 기타 테이블

■ User-Defined Variable 테이블 성능 스키마는 사용자 정의 변수를 노출하는 user_variables_by_thread 테이블을 제공합니다. 이들은 특정 세션 내에서 정의된 변수이며 이름 앞에 @문자를 포함합니다. user_v

myinfrabox.tistory.com

[MySQL] Performance Schema 모니터링 테이블 - Summary(요약) 테이블

 

[MySQL] Performance Schema 모니터링 테이블 - Summary(요약) 테이블

■ Summary(요약) 테이블 ▶︎ objects_summary_global_by_type 테이블 성능 스키마는 개체 대기 이벤트를 집계하기 위해 objects_summary_global_by_type 테이블을 유지합니다. 예제 개체 대기 이벤트 요약 정보..

myinfrabox.tistory.com

[MySQL] Performance Schema 모니터링 테이블 - Replication 테이블

 

[MySQL] Performance Schema 모니터링 테이블 - Replication 테이블

■ Replication 테이블 성능 스키마는 복제 정보를 노출하는 테이블을 제공합니다. 이는 SHOW SLAVE STATUS 문에서 사용할 수있는 정보와 비슷하지만 테이블 형식으로 표현하는 것이 더 접근하기 쉽고

myinfrabox.tistory.com

 

Designed by JB FACTORY