이 두 쿼리 중 하나를 사용하여 총 논리적 읽기 및 총 물리적 읽기를 볼 수 있습니다.
SELECT DB_NAME(st.dbid) Db,
OBJECT_NAME(st.objectid, st.dbid) Prc,
qs.execution_count,
qs.total_logical_reads,
qs.total_physical_reads,
qs.statement_start_offset,
qs.statement_end_offset,
st.text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st;
SELECT DB_NAME(database_id) Db,
OBJECT_NAME(object_id, database_id) Prc,
execution_count,
total_logical_reads,
total_physical_reads
FROM sys.dm_exec_procedure_stats ps;
첫 번째는 이것을 진술로 세분화하고, 두 번째는 전체 절차에서 계산합니다.
물리적 읽기는 디스크에 대한 읽기이고 논리적 읽기는 메모리에 대한 읽기입니다. 이를 사용하여 시스템에서 가장 비싼 프로 시저 또는 명령문을 파악하고 튜닝 할 수 있습니다.
논리적 읽기는 물리적 읽기보다 훨씬 저렴하지만 여전히 비싸므로 (예를 들어 적절한 색인을 추가하여) 읽기 수를 줄이면 쿼리 실행 속도가 훨씬 빨라질 수 있습니다.
위의 DMV에는 흥미로운 추가 열이 많이 있습니다.
인덱스는 논리적 읽기를 줄이는 데 어떻게 도움이됩니까?
SQL Server에서 모든 데이터는 8KB 크기의 블록으로 구성됩니다. 이러한 블록을 "페이지"라고합니다.
모든 테이블에는 파타 페이지뿐만 아니라 테이블 구조에 대한 정보가 포함 된 "메타"페이지가 포함됩니다. 인덱스가없고 SELECT * FROM tbl WHERE Id = 7
SQL Server 와 같은 쿼리를 실행 하면 전체 테이블에서이 행 또는이 행을 찾아야합니다. 따라서 한 번에 한 페이지 씩 읽고 각 페이지의 모든 행을 반복하여 WHERE
절에 맞는 행을 결정합니다 . 따라서 테이블에 1,000,000 페이지를 저장해야하는 경우이 쿼리를 실행하려면 1,000,000 개의 논리적 읽기가 필요합니다.
인덱스가있는 경우 SQL Server는 페이지 내에서 데이터를 논리적으로 정렬하고 페이지간에 연결된 목록을 설정합니다. 이를 통해 ORDER BY
값 비싼 정렬 작업없이 쿼리를 실행할 수 있습니다. 그러나 중요한 점은 정렬, SQL Server가 B + Tree 를 테이블에 추가한다는 것 입니다. B + 트리는 책의 색인과 비교할 수있는 구조로 특정 키워드를 찾으면 키워드가 포함 된 페이지로 바로 이동할 수 있습니다. 일반적인 책은 색인 수준이 하나 뿐인 반면 B + Tree는 여러 수준을 가질 수 있습니다. 색인 자체가 여러 페이지 인 큰 책을 생각해보십시오. 이와 같은 경우 추가 색인 레이어를 추가하면 어느 페이지에서든 시작하는 색인 단어 S
를 찾을 수 있습니다.
B + Tree는 가능한 한 적은 수의 레벨을 갖도록 최적화되며 인덱스 레벨 당 한 페이지를 읽어 인덱스의 모든 레코드를 찾을 수있는 특성을 제공합니다. 따라서을 기준 WHERE Id = 7
으로 인덱스를 정렬 한 경우 위 쿼리를 가정하십시오 Id
. 지수가 5 단계라고 가정 해 봅시다. 이제이 쿼리와 일치하는 모든 레코드를 찾으려면 인덱스 수준 당 한 페이지 (5 페이지)를 읽어야합니다.이를 "인덱스 찾기"라고합니다. 청구서에 맞는 여러 레코드가있는 경우 정렬 된 색인을 따라 가서 모든 레코드를 검색해야 할 수도 있습니다. 그러나 레코드가 하나만 있다고 가정합니다.
따라서 인덱스를 실행하지 않으면 해당 쿼리에 1,000,000 회의 읽기가 필요했으며 실제로는 5 회의 읽기가 필요했습니다. 논리적 읽기는 메모리 내 작업이지만 상당한 비용이 발생합니다. 실제로 위와 같은 간단한 쿼리에서 가장 비싼 작업입니다. 따라서 200,000 배로 필요한 논리적 읽기 양을 줄이면 비슷한 요소로 쿼리 속도가 빨라집니다.
따라서 논리적 읽기는 테이블 스캔과 동일하지 않지만 테이블 스캔은 인덱스 검색보다 훨씬 많은 논리적 읽기를 발생시킵니다.