메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Dbstudy (토론 | 기여)님의 2026년 9월 9일 (수) 22:42 판 (새 문서: == 실행 계획 == * SSMS에서 쿼리 → 실제 실행 계획 포함 켜기. (Ctrl + M) <source lang=sql> SET STATISTICS IO ON; SET STATISTICS TIME ON; SELECT * FROM dbo.EMP WHERE EMPNO = 1000; </source> - 실행하면 결과 창 외에 실행 계획(Execution Plan) 탭이 나타납니다. <source lang=sql> SELECT └─ Hash Match ├─ Index Scan └─ Index Scan </source> * Index Seek => oracle의 index range/unique scan * Actual Plan 에서 실제 row 확...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

실행 계획

  • SSMS에서 쿼리 → 실제 실행 계획 포함 켜기. (Ctrl + M)
SET STATISTICS IO ON;
SET STATISTICS TIME ON;

SELECT *
FROM dbo.EMP
WHERE EMPNO = 1000;

- 실행하면 결과 창 외에 실행 계획(Execution Plan) 탭이 나타납니다.

SELECT
 └─ Hash Match
     ├─ Index Scan
     └─ Index Scan
  • Index Seek => oracle의 index range/unique scan
  • Actual Plan 에서 실제 row 확인하기
    • SQL Server에서도 Cardinality Estimation 문제가 있는지 보는 것이 중요.
Estimated Number of Rows = 10
Actual Number of Rows    = 1,500,000
  • SSMS 실행계획에서 우클릭하여: Save Execution Plan As... > .sqlplan파일로 저장
  • oracle DBMS_XPLAN 과 비슷
<ShowPlanXML ...>
    ...
</ShowPlanXML>

I/O를 더 자세하게 확인

SET NOCOUNT ON;

SET STATISTICS IO ON;
SET STATISTICS TIME ON;

SELECT O.ORDER_ID,
       O.CUSTOMER_ID,
       O.ORDER_DATE,
       O.AMOUNT
FROM dbo.ORDERS O
WHERE O.CUSTOMER_ID = 100
  AND O.ORDER_DATE >= '2026-01-01';

SET STATISTICS IO OFF;
SET STATISTICS TIME OFF;
Table 'ORDERS'.
Scan count 1,
logical reads 23500,
physical reads 0,
read-ahead reads 0
SQL Server Execution Times:
   CPU time = 850 ms,
   elapsed time = 920 ms.

SET STATISTICS IO에서 특히 중요한 항목

Table 'ORDERS'.

Scan count 1,
logical reads 125000,
physical reads 0,
read-ahead reads 120000,
lob logical reads 0,
lob physical reads 0,
lob read-ahead reads 0.
  • Scan count
    테이블/인덱스에 대한 Scan 횟수입니다.
  • Nested Loop와 같이 반복 접근이 발생하면 눈여겨봐야 합니다.
  • logical reads
    -메모리에 있는 데이터 페이지를 읽은 횟수입니다.
  • physical reads
    디스크에서 실제 페이지를 읽은 횟수입니다.
  • SQL Server는 데이터가 버퍼 캐시에 올라가 있을 경우:
    physical reads = 0 이어도 logical reads = 1000000 일 수 있습니다.

실제 튜닝 템플릿

SET NOCOUNT ON;

SET STATISTICS IO ON;
SET STATISTICS TIME ON;

-- 대상 SQL
SELECT
    O.ORDER_ID,
    O.CUSTOMER_ID,
    O.ORDER_DATE,
    O.AMOUNT
FROM dbo.ORDERS O
WHERE O.CUSTOMER_ID = 100
  AND O.ORDER_DATE >= '2026-01-01';

SET STATISTICS IO OFF;
SET STATISTICS TIME OFF;

Oracle 과 비교표

Oracle 과 비교표
Oracle SQL Server
A-Rows Actual Rows
E-Rows Estimated Rows
Buffers logical reads
Physical Reads physical reads
Execution Time CPU / elapsed
TABLE ACCESS FULL Table Scan
INDEX RANGE SCAN Index Seek
INDEX FULL SCAN Index Scan
HASH JOIN Hash Match
NESTED LOOPS Nested Loops
SORT Sort

Query Store

실행 횟수
CPU Time
Duration
Logical Reads
Physical Reads
Memory
Plan 변경
SELECT TOP 20
       qt.query_sql_text,
       rs.execution_count,
       rs.avg_duration,
       rs.avg_cpu_time,
       rs.avg_logical_io_reads
FROM sys.query_store_query_text qt
JOIN sys.query_store_query q
  ON qt.query_text_id = q.query_text_id
JOIN sys.query_store_plan p
  ON q.query_id = p.query_id
JOIN sys.query_store_runtime_stats rs
  ON p.plan_id = rs.plan_id
ORDER BY rs.avg_logical_io_reads DESC;