|
|
| (같은 사용자의 중간 판 6개는 보이지 않습니다) |
| 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 찾기]] == |