리소스

/

ACP 실습 노트

[37편] SQL을 승인하기 전에 실행 계획도 함께 봤다

DB 접근 제어 · 승인 · 감사 · 운영

2026년 11월 9일

SQL을 승인할 때는 쿼리 내용과 작업 사유를 읽게 된다. 여기에 DB의 실행 계획도 함께 있으면 어떤 테이블과 인덱스를 사용할지 살펴보며 검토할 수 있다.

 

이번에는 QueryPie의 SQL Request에 실행 계획을 붙여 보냈다. 작성자가 확인한 자료를 승인자도 같은 요청 안에서 열어 볼 수 있는지 직접 확인했다.

 

 

실행 계획을 첨부할 수 있도록 준비했다

 

관리자 전역 설정에서 Use "Attach Explain Results" feature in SQL Request를 켰다. SQL 요청에 실행 계획을 첨부할 수 있도록 허용하는 옵션이다. 전역 옵션을 켜도 요청별 Attach Explain Results는 기본 Off이고, 작성자가 필요할 때 켠다.

 

화면 1. SQL Request에서 실행 계획 첨부 기능을 사용할 수 있도록 설정했다.
화면 1. SQL Request에서 실행 계획 첨부 기능을 사용할 수 있도록 설정했다.

 

실습용 연결은 SQL Explain Lab으로 만들고, Demo Developer에게 Lab - Explain Review 권한을 부여했다. 이 권한에는 조회를 위한 Select와 실행 계획을 확인하는 Explain을 선택했다.

 

화면 2. 이번 연결에서 사용할 Select와 Explain 권한을 준비했다.
화면 2. 이번 연결에서 사용할 Select와 Explain 권한을 준비했다.

 

승인 규칙은 앞서 사용한 Orders Lab - SQL Change Approval을 그대로 썼다. 요청과 실행은 Demo Developer, 승인은 Demo Approver가 맡았다.

 

 

주문 한 건을 조회하는 SQL의 계획을 봤다

 

새 SQL Request에서 SQL Explain Lab과 route_lab을 선택하고, Content Type은 Text로 지정했다. 주문번호 27002의 상태와 금액을 조회하는 SELECT를 입력했다.

 

Attach Explain Results를 켜고 Table을 선택한 뒤 Explain을 눌렀다. 결과 창에는 작성한 SQL과 MySQL의 실행 계획이 함께 나왔다.

 

화면 3. 요청 화면에서 SQL의 실행 계획을 확인하고, 요청에 첨부하도록 선택했다.
화면 3. 요청 화면에서 SQL의 실행 계획을 확인하고, 요청에 첨부하도록 선택했다.

 

표의 대상 테이블은 orders, 조회 방식인 type은 const, 사용할 인덱스인 key는 PRIMARY였다. rows에는 1이 표시됐다. 이 값은 MySQL이 읽을 것으로 예상한 행 수다. 주문번호 조건으로 기본키 인덱스를 사용하는 계획을 요청 단계에서 확인할 수 있었다.

 

확인한 계획을 첨부해 주문 조회 SQL 실행 계획 검토 — 37편이라는 제목으로 요청을 올렸다.

 

 

승인자도 같은 요청에서 계획을 확인했다

 

Demo Approver로 받은 요청을 열고 Explain Results 탭을 선택했다. 작성자가 보낸 SELECT와 같은 실행 계획 표가 나왔다. orders, PRIMARY, 예상 행 수 1까지 그대로 확인할 수 있었다.

 

화면 4. 승인자도 요청에 첨부된 SQL과 실행 계획을 같은 화면에서 확인했다.
화면 4. 승인자도 요청에 첨부된 SQL과 실행 계획을 같은 화면에서 확인했다.

 

승인 의견에는 실제로 확인한 내용을 적었다. “주문번호 조건과 PRIMARY를 사용하는 실행 계획, 예상 행 수 1을 확인했습니다. 가상 주문 조회 실습을 승인합니다.”라는 코멘트를 남기고 승인했다.

 

화면 5. 실행 계획에서 확인한 내용을 승인 코멘트로 남겼다.
화면 5. 실행 계획에서 확인한 내용을 승인 코멘트로 남겼다.

 

실행 계획을 별도 파일로 전달하거나 다른 화면을 찾아볼 필요가 없었다. 승인할 SQL과 검토할 자료가 같은 요청에 있으니, 어떤 쿼리의 계획인지 맞춰 보기 편했다.

 

 

승인된 SQL을 실행했다

 

Demo Developer의 실행 대기 목록에서 승인된 요청을 열고 Execute를 한 번 눌렀다. Results에는 1 Rows selected, in 10 ms가 표시됐다.

 

화면 6. 승인된 SELECT를 실행한 뒤 한 행이 조회됐다는 결과를 확인했다.
화면 6. 승인된 SELECT를 실행한 뒤 한 행이 조회됐다는 결과를 확인했다.

 

앞에서 본 rows 1은 실행 전 예상값이고, 여기의 1 Rows selected는 실제 실행 후의 조회 건수다. 이번 요청은 실행 계획을 검토한 뒤 승인과 실행까지 이어졌다.

 

 

검토한 요청과 실행 기록을 함께 확인했다

 

Query Audit에서도 이번 SELECT의 성공 기록을 확인했다. 사용자 Demo Developer, 연결 SQL Explain Lab, 권한 Lab - Explain Review와 함께 실행 경로가 SQL Request로 표시됐다. 대상은 route_lab.orders였고, 요청에 넣었던 SELECT와 일치했다.

 

화면 7. 승인된 요청에서 실행한 SELECT가 SQL Request 경로의 성공 기록으로 남았다.
화면 7. 승인된 요청에서 실행한 SELECT가 SQL Request 경로의 성공 기록으로 남았다.

 

Workflow Logs에서는 요청 제출, 승인, SQL 실행 세 건을 확인했다. 승인 기록에는 앞서 남긴 코멘트도 있었다. 실행 계획을 보고 어떤 의견으로 승인했는지, 이후 SQL이 실행됐는지를 요청과 처리 기록에서 따라가 볼 수 있었다.

 

화면 8. 같은 요청의 제출·승인·실행 이력을 모아 확인했다.
화면 8. 같은 요청의 제출·승인·실행 이력을 모아 확인했다.

 

확인을 마친 뒤 이번 연결에 부여한 실습 권한을 회수하고, 전역 첨부 옵션을 원래 값인 Off로 돌렸다. 이후 승인자 화면에서 완료된 요청을 다시 열어 보니 Explain Results의 SQL과 실행 계획이 그대로 남아 있었다.

 

승인 담당자가 SQL과 사유를 읽으면서 실행 계획도 함께 볼 수 있다는 점이 좋았다. 작성자가 전달한 계획을 같은 요청에서 검토하고 의견을 남길 수 있어, SQL 승인을 위한 자료를 따로 주고받는 수고를 줄일 수 있었다.

 

실습은 QueryPie Community 11.6.7과 MySQL 8.0.42에서 진행했다. 사용자와 주문은 모두 실습용이다.

 

참고: 실행 계획(Explain) 기능 사용하기 · General 설정 · SQL Request