SQL Server 인덱스 크기를 어떻게 추정합니까?
-
05-07-2019 - |
문제
직선과 테이블 크기를 추정하는 것은 상당히 간단한 수학이지만, 각 인덱스가 얼마나 많은 공간을 차지할 것인지 추측하는 것이 어렵다는 것을 알게됩니다 (주어진 테이블 크기). 지수에 대한 더 나은 추정치 및 성장률을 계산하는 법을 배울 수있는 영역은 무엇입니까?
해결책
인덱스 리프에는 프레임 블리트가 데이터 페이지 (7 바이트와 가변 길이 열에 대한 일부 디렉토리 정보,있는 경우)와 해당 열의 테이블 데이터와 동일한 크기 인 키 값의 사본을 식별합니다. 테이블에 각 행마다 하나가 있습니다. 지수의 높은 수준이 훨씬 작으며, 매우 넓은 키를 색인하지 않는 한 일반적으로 잎의 1% 미만입니다.
충전 계수는 약간의 공간이 없어서 업데이트 및 인서트가 과도한 잎 분할 트래픽을 생성하지 않도록합니다.
편집하다: 이 MSDN 링크 개별 색인 행의 형식에 약간 가볍지 만 페이지 수준 구조를 설명합니다. 이 프레젠테이션 디스크 로그 항목 및 데이터 페이지의 물리적 형식으로 어느 정도까지 들어갑니다. 이 하나 자세한 내용은 색인 데이터 구조를 포함합니다. 숫자 및 고정 길이 열에는 상자에 표시된 크기가 있습니다. Varchar 열의 평균 크기를 추정해야합니다.
다른 팁
가능하면 일반적으로 원래 테이블에서 1000 개의 레코드를 가져 와서 내 테이블에 삽입하고 아래 스크립트를 사용하여 샘플을 가지고 있습니다.
좋아, 정확하지는 않지만 출발점을 줄 수 있습니다.
--Find out the disk size of an index:
--USE [DB NAME HERE]
go
SELECT
OBJECT_NAME(I.OBJECT_ID) AS TableName,
I.name AS IndexName,
8 * SUM(AU.used_pages) AS 'Index size (KB)',
CAST(8 * SUM(AU.used_pages) / 1024.0 AS DECIMAL(18,2)) AS 'Index size (MB)'
FROM
sys.indexes I
JOIN sys.partitions P ON P.OBJECT_ID = I.OBJECT_ID AND P.index_id = I.index_id
JOIN sys.allocation_units AU ON AU.container_id = P.partition_id
--WHERE
-- OBJECT_NAME(I.OBJECT_ID) = '<TableName>'
GROUP BY
I.OBJECT_ID,
I.name
ORDER BY
TableName
--========================================================================================
--http://msdn.microsoft.com/en-us/library/fooec9de780-68fd-4551-b70b-2d3ab3709b3e.aspx
--I believe that keeping the GROUP BY
--is the best option in this case
--because of sys.allocation_units
--can have 4 types of data inside
--as below:
--type tinyint
--Type of allocation unit.
--0 = Dropped
--1 = In-row data (all data types, except LOB data types)
--2 = Large object (LOB) data (text, ntext, image, xml, large value types, and CLR user-defined types)
--3 = Row-overflow data
--marcelo miorelli 8-NOV-2013
--========================================================================================
제휴하지 않습니다 StackOverflow