BLOB이 다른 테이블에 있어야한다는 데는 동의하지 않지만 데이터베이스에 있으면 안됩니다 . 디스크에 파일이있는 위치에 대한 포인터를 저장 한 다음 데이터베이스에서 가져옵니다.
그들이 (나를 위해) 일으키는 주요 문제는 색인 작성입니다. 쿼리 계획에 XML을 사용하면 모든 사람들이 참여할 수 있으므로 테이블을 만들어 보겠습니다
SELECT TOP 1000
ID = IDENTITY(INT,1,1),
deq.query_plan
INTO dbo.index_test
FROM sys.dm_exec_cached_plans AS dec
CROSS APPLY sys.dm_exec_query_plan(dec.plan_handle) AS deq
ALTER TABLE dbo.index_test ADD CONSTRAINT pk_id PRIMARY KEY CLUSTERED (ID)
1000 행이지만 크기를 확인하는 중입니다 ...
sp_BlitzIndex @DatabaseName = 'StackOverflow', @SchemaName = 'dbo', @TableName = 'index_test'
단 1000 행에 40MB가 넘습니다. 1000 행마다 40MB를 추가한다고 가정하면 꽤 빨리 추악해질 수 있습니다. 백만 행에 도달하면 어떻게됩니까? 그것은 약 1TB의 데이터입니다.
클러스터형 인덱스를 사용해야하는 모든 쿼리는 이제 BLOB 데이터 열이 참조 될 때 해당 BLOB 데이터를 모두 메모리 설명 으로 읽어야합니다 .
BLOB를 저장하는 것보다 SQL Server 메모리를 사용하는 더 좋은 방법을 생각할 수 있습니까? 확실히 할 수 있기 때문입니다.
비 클러스터형 인덱스로 확장 :
CREATE INDEX ix_noblob ON dbo.index_test (ID)
CREATE INDEX ix_returnoftheblob ON dbo.index_test (ID) INCLUDE (query_plan)
BLOB 열을 크게 피하도록 비 클러스터형 인덱스를 디자인 할 수 있으므로 일반 쿼리는 클러스터형 인덱스를 피할 수 있지만 해당 BLOB 열이 필요할 때 클러스터형 인덱스가 필요합니다.
INCLUDED
키 조회 시나리오를 피하기 위해 비 클러스터형 인덱스에 열로 추가하면 거대한 비 클러스터형 인덱스가 생깁니다.
더 많은 문제가 발생합니다.
- 누구나
SELECT *
쿼리를 실행 하면 모든 BLOB 데이터를 얻습니다.
- 백업 및 복원에서 공간을 차지하여 속도가 느려집니다.
DBCC CHECKDB
부패를 확인하고 있다는 것을 알고 있기 때문에 속도가 느려집니다 .
- 그리고 인덱스 유지 관리를 수행하면 속도가 느려집니다.
이것이 도움이되기를 바랍니다!