메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
편집 요약 없음
 
(같은 사용자의 중간 판 7개는 보이지 않습니다)
1번째 줄: 1번째 줄:
= SQL SERVER (Microsoft SQL Server) =
= SQL SERVER (Microsoft SQL Server) =
== [[설치 방법]] ==
== [[설치 방법|설치 및 접속]] ==
== [[DB생성 및 접속]] ==
== [[세그먼트 (테이블+인덱스+LOB) 사이즈 조회 ]] ==
== [[테이블/인덱스 생성]] ==
 
* 스키마별 테이블에 대해 데이터 + 인덱스 + LOB + Row Overflow를 한 번에 집계합니다.
 
== [[테이블/인덱스 사이즈 조회 ]] ==
== [[테이블/인덱스 사이즈 조회 ]] ==
== [[통계정보 갱신]] ==
== [[통계정보 갱신]] ==


==[[실행 계획]]==
==[[실행 계획]]==
* 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 확인하기
** SQL Server에서도 Cardinality Estimation 문제가 있는지 보는 것이 중요.
<source lang=sql>
Estimated Number of Rows = 10
Actual Number of Rows    = 1,500,000
</source>
 
* SSMS 실행계획에서 우클릭하여: Save Execution Plan As...  > .sqlplan파일로 저장
* oracle DBMS_XPLAN 과 비슷
<source lang=xml>
<ShowPlanXML ...>
    ...
</ShowPlanXML>
</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 일 수 있습니다.
 
=== Oracle 과 비교표 ===
{| class="wikitable"
|+ 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
|}


== [[힌트 사용 방법 ]] ==
== [[ 튜닝 대상 SQL 찾기]] ==

2026년 9월 10일 (목) 10:01 기준 최신판

SQL SERVER (Microsoft SQL Server)

설치 및 접속

세그먼트 (테이블+인덱스+LOB) 사이즈 조회

  • 스키마별 테이블에 대해 데이터 + 인덱스 + LOB + Row Overflow를 한 번에 집계합니다.

테이블/인덱스 사이즈 조회

통계정보 갱신

실행 계획

힌트 사용 방법

튜닝 대상 SQL 찾기