(→실행 계획) |
(→실행 계획) |
||
| 41번째 줄: | 41번째 줄: | ||
</ShowPlanXML> | </ShowPlanXML> | ||
</source> | </source> | ||
=== I/O를 더 자세하게 확인 === | |||
<source lang=sql> | |||
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; | |||
</source> | |||
<source lang=sql> | |||
Table 'ORDERS'. | |||
Scan count 1, | |||
logical reads 23500, | |||
physical reads 0, | |||
read-ahead reads 0 | |||
</source> | |||
<source lang=sql> | |||
SQL Server Execution Times: | |||
CPU time = 850 ms, | |||
elapsed time = 920 ms. | |||
</source> | |||
==== SET STATISTICS IO에서 특히 중요한 항목 ==== | |||
<source> | |||
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. | |||
</source> | |||
* Scan count | |||
*: 테이블/인덱스에 대한 Scan 횟수입니다. | |||
*Nested Loop와 같이 반복 접근이 발생하면 눈여겨봐야 합니다. | |||
* logical reads | |||
*:-메모리에 있는 데이터 페이지를 읽은 횟수입니다. | |||
* physical reads | |||
*: 디스크에서 실제 페이지를 읽은 횟수입니다. | |||
* SQL Server는 데이터가 버퍼 캐시에 올라가 있을 경우: | |||
*: physical reads = 0 이어도 logical reads = 1000000 일 수 있습니다. | |||
== [[힌트 사용 방법 ]] == | == [[힌트 사용 방법 ]] == | ||
2026년 9월 9일 (수) 21:39 판
SQL SERVER (Microsoft SQL Server)
설치 방법
DB생성 및 접속
테이블/인덱스 생성
테이블/인덱스 사이즈 조회
통계정보 갱신
실행 계획
- 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 일 수 있습니다.