이 질문은 포함 인덱스에있는 SQL Server 인덱스 성능에 관한 varchar(2000)
것 INCLUDE
입니다.
느리고 불안정한 데이터베이스 응용 프로그램에서 성능을 개선하려고합니다. 어떤 경우에는, 데이터는 같은 multple 문자열 연산을 포함하는 쿼리, 큰 VARCHAR 문자열을 통해 액세스 SUBSTRING()
, SPACE()
및 DATALENGTH()
. 다음은 간단한 액세스 예입니다.
update fattable set col3 =
SUBSTRING(col3,1,10) + '*' +
SUBSTRING(col3,12,DATALENGTH(col3)-12)
from fattable where substring(col3,10,1) = 'A' and col2 = 2
스키마는 다음과 같습니다.
CREATE TABLE [dbo].[FatTable](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[col1] [nchar](12) NOT NULL,
[col2] [int] NOT NULL,
[col3] [varchar](2000) NOT NULL, ...
큰 텍스트 열에 포함 필드가있는 다음 색인이 정의되었습니다.
CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable] ( [col2] ASC )
INCLUDE( [col3] )
내가 읽은 것에서 큰 데이터 필드를 색인에 넣는 것은 BAD입니다. 인덱스 성능에 대한 페이징 및 디스크 크기의 영향에 대해 설명하는 http://msdn.microsoft.com/en-us/library/ms190806.aspx 를 비롯한 여러 기사를 읽었 습니다. 이 말에 따르면 쿼리 계획은 확실히 인덱스를 사용합니다. 시스템로드 측면에서 실제로 비용이 얼마나 드는지를 결정하기에 충분한 정보가 없습니다. 나는 전체적으로 시스템의 성능이 좋지 않다는 것을 알고 있으며 이것이 문제 중 하나라는 것을 알고 있습니다. 질문 :
이
varchar(2000)
열을 색인에 넣는INCLUDE
것이 좋은 생각입니까?때문에
INCLUDE
필드가 리프 노드에 저장됩니다, 그들은 큰 영향 지수 성능을해야합니까?
업데이트 : 훌륭한 답변 감사합니다! 이것은 몇 가지면에서 불공평 한 질문입니다. 여러분이 말했듯이 실제 통계와 프로파일 링이 없으면 절대적인 정답이 없습니다. 많은 성능 문제와 마찬가지로 대답은 "의존"이라고 생각합니다.
VARCHAR(2000)
이는 일반적으로 저장 단지 10 자 한 것입니다; 레코드 당 2,000 바이트는 견고합니다.