MSSQL (Microsoft SQL Server)에서 Oracle의 v$sql
뷰와 유사하게 실행 중이거나 캐시된 SQL 문장에 대한 정보를 제공하는 시스템 뷰나 DMV(Dynamic Management View)는 다음과 같습니다:
✅ Oracle의 v$sql
이란?
Oracle에서 v$sql
은 라이브 SQL 문, 캐시된 SQL 실행 계획, 실행 통계 등을 확인할 수 있는 뷰입니다.
✅ SQL Server에서 유사한 시스템 뷰
SQL Server에서는 다음 DMV들을 조합해서 사용합니다:
1. sys.dm_exec_query_stats
- 실행된 쿼리들의 실행 통계 정보를 담고 있음
- 실행 횟수, CPU 시간, 논리적 읽기, 실행 시간 등
2. sys.dm_exec_sql_text(sql_handle)
- SQL 텍스트를 반환
sql_handle
을 이용하여dm_exec_query_stats
와 조인
3. sys.dm_exec_query_plan(plan_handle)
- 실행 계획 XML을 반환
plan_handle
을 이용
✅ 예제 쿼리
sql복사편집SELECT
qs.execution_count,
qs.total_worker_time AS total_cpu_time,
qs.total_elapsed_time,
qs.total_logical_reads,
qs.creation_time,
st.text AS sql_text,
qp.query_plan
FROM
sys.dm_exec_query_stats qs
CROSS APPLY
sys.dm_exec_sql_text(qs.sql_handle) st
CROSS APPLY
sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY
qs.total_worker_time DESC;
이 쿼리는 캐시에 저장된 쿼리들 중 CPU 사용량이 높은 순서로 SQL 문과 실행 계획을 보여줍니다.
✅ 관련 DMV 요약
DMV 이름 | 설명 |
---|---|
sys.dm_exec_query_stats | 실행 통계 |
sys.dm_exec_sql_text | SQL 텍스트 |
sys.dm_exec_query_plan | 실행 계획 (XML 형태) |
sys.dm_exec_requests | 현재 실행 중인 요청 정보 |
sys.dm_exec_sessions | 세션별 정보 |
✅ 현재 실행 중인 SQL 확인 예시
sql복사편집SELECT
r.session_id,
r.status,
r.start_time,
st.text AS sql_text,
r.cpu_time,
r.total_elapsed_time
FROM
sys.dm_exec_requests r
CROSS APPLY
sys.dm_exec_sql_text(r.sql_handle) st
ORDER BY
r.cpu_time DESC;
필요 시, SSMS에서 “Activity Monitor”를 시각적으로 이용해도 일부 유사 정보를 볼 수 있습니다.
원하시는 데이터나 뷰가 특정 상황에 국한되었다면 알려주세요 — 예: 쿼리 성능 분석, 현재 실행 중인 것만, 캐시된 전체 등.
나의 말:
디스크i/o체크방법
ChatGPT의 말:
SQL Server에서 디스크 I/O 성능을 확인하는 방법은 여러 가지가 있으며, 상황에 따라 SQL Server DMV, PerfMon(성능 모니터), DMF, 시스템 뷰 등을 활용할 수 있습니다. 아래는 대표적인 방법들입니다:
✅ 1. DMV로 데이터베이스별 I/O 통계 확인
sys.dm_io_virtual_file_stats
sql복사편집SELECT
DB_NAME(vfs.database_id) AS database_name,
mf.physical_name,
vfs.num_of_reads,
vfs.num_of_writes,
vfs.io_stall_read_ms,
vfs.io_stall_write_ms,
vfs.size_on_disk_bytes / 1024 / 1024 AS size_mb
FROM
sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs
JOIN
sys.master_files AS mf
ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id
ORDER BY
vfs.io_stall_read_ms + vfs.io_stall_write_ms DESC;
🔎 설명:
num_of_reads/writes
: 읽기/쓰기 횟수io_stall_read_ms/write_ms
: 읽기/쓰기 대기 시간 (밀리초)- I/O 병목이 있는 파일 식별에 유용
✅ 2. 현재 I/O가 많은 쿼리 확인
sql복사편집SELECT
r.session_id,
r.status,
r.command,
r.cpu_time,
r.total_elapsed_time,
r.reads,
r.writes,
st.text AS sql_text
FROM
sys.dm_exec_requests r
JOIN
sys.dm_exec_sessions s ON r.session_id = s.session_id
CROSS APPLY
sys.dm_exec_sql_text(r.sql_handle) st
ORDER BY
r.reads + r.writes DESC;
✅ 3. PerfMon (성능 모니터)
Windows Performance Monitor를 통해 체크할 수 있는 주요 I/O 관련 카운터:
- PhysicalDisk\Avg. Disk sec/Read
- PhysicalDisk\Avg. Disk sec/Write
- PhysicalDisk\Disk Reads/sec
- PhysicalDisk\Disk Writes/sec
- LogicalDisk% Disk Time
- SQLServer:Buffer Manager\Page reads/sec
- SQLServer:Buffer Manager\Page writes/sec
⚠️ 참고:
Avg. Disk sec/Read
또는Write
가 20ms(0.02초) 이상이면 느린 디스크로 간주
✅ 4. 쿼리별 논리/물리 읽기 확인 (실행계획 포함)
sql복사편집SET STATISTICS IO ON;
SET STATISTICS TIME ON;
-- 여기에 분석할 쿼리 작성
SELECT * FROM YourTable WHERE YourCondition;
- STATISTICS IO: 논리/물리 읽기 수
- STATISTICS TIME: CPU 시간과 전체 실행 시간
SSMS에서 실행하면 메시지 탭에 결과 표시됨.
✅ 5. TempDB I/O 확인
sql복사편집SELECT
vfs.database_id,
DB_NAME(vfs.database_id) AS database_name,
mf.physical_name,
vfs.io_stall_read_ms,
vfs.io_stall_write_ms,
vfs.num_of_reads,
vfs.num_of_writes
FROM
sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs
JOIN
sys.master_files AS mf
ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id
WHERE
mf.database_id = 2 -- TempDB
ORDER BY
vfs.io_stall_write_ms DESC;
✅ 결론
목적 | 사용 도구 | 설명 |
---|---|---|
전체 디스크 I/O 확인 | sys.dm_io_virtual_file_stats | DB/파일별 읽기/쓰기/대기 시간 |
쿼리별 I/O | sys.dm_exec_requests + dm_exec_sql_text | 현재 실행 중 쿼리 기준 I/O |
실시간 OS 레벨 I/O | Performance Monitor | 디스크 지연, 읽기/쓰기 속도 등 |
특정 쿼리 성능 확인 | SET STATISTICS IO/TIME | SQL 내부 I/O 측정 |