큰 인덱스 INCLUDE 필드는 시스템 성능에 어떤 영향을 줍니까?


15

이 질문은 포함 인덱스에있는 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 바이트는 견고합니다.
모든 거래의 존

단지 관찰 : 여기서 "냄새가 나는"것은 큰 열이 1) 자유 텍스트를 포함 할 수 있다는 것입니다.이 경우 쿼리는 FULLTEXT 인덱스를 사용하기 위해 다시 작성하는 것이 도움이 될 수 있습니다. VIN과 같은 키)를 사용하면 별도의 열로 분할하거나 INDEX를 사용하여 계산 된 열을 유지할 수 있습니다. 다시 말해, 지능 및 데이터 변경의 흐름은 제대로 설계되지 않았습니다.
Graeme

1
네, 그래미, 여기 나쁜 냄새가 나네요- "레거시"라고 생각합니다. 이 데이터베이스에는 많은 문제가 있습니다.
RaoulRubin 1

답변:


14

절대 큰 단어이지만, 일반적으로, 나는 varchar (2000) 필드를 INCLUDE에 넣지 않을 것입니다.

예, 데이터가 페이지 수준에서 저장되는 방식은 인덱스 사용 방법에 따라 인덱스 성능에 심각한 영향을 줄 수 있습니다.

문제는 한 페이지에 넣을 수있는 데이터 행이 많을수록 더 적은 페이지에 액세스해야할수록 시스템의 속도가 빨라집니다. 실제로 큰 열을 추가하면 페이지에 저장된 정보가 적으므로 범위를 찾거나 스캔 할 경우 데이터를 검색하기 위해 더 많은 페이지를 읽어야하므로 데이터 속도가 크게 느려집니다.

이것이 쿼리 또는 시스템에서 문제인지 확인하려면 읽기, 특히 쿼리가 사용하는 페이지 수를 모니터해야합니다.


고마워 그랜트. 다른 의견을 언급했듯이 좋은 성능 정보는 거의 없으므로 추상적 인 질문입니다. 페이지 크기 성능 비용을 모니터링 한 경험이 없습니다. 내 직감은 그것이 문제라는 것입니다. 통계를 얻을 수 있는지 볼 것입니다.
RaoulRubin 2019

1
통계에 IO를 설정하면 쿼리에 많은 정보가 표시되며 논리적 읽기는 액세스 된 페이지 수를 나타냅니다. 일반 성능 정보를 얻기 위해 perfmon 카운터에서 초 / 읽기를 모니터링 할 수도 있습니다.
Grant Fritchey

6

현재 클러스터 된 인덱스 키를 검토하고 col2대신 클러스터 된 인덱스 키를 만들 수 있습니까? 이 방법으로 데이터를 복제하지 않고 '포함'동작 (클러스터형 인덱스가 항상 '모든 것을 포함'하기 때문에)을 처리 할 수 ​​있습니다. 이것은 물론, 많은 적용을받습니다 if하고 but, 그럼에도 불구하고 아마 고려 가치가있다. 물론 현재 클러스터형 인덱스가 제약 조건 (기본 키, 고유)을 적용하는 경우 해당 제약 조건은 비 클러스터형 인덱스로 이동해야합니다.


PK에 대한 귀하의 제안은 좋은 생각이지만,이 경우에는 적용 할 수 없지만 다른 쿼리에는 기존 PK가 필요합니다. (이것은 도구 상자에 보관할 기술입니다!)
RaoulRubin

4

대답하기가 어렵습니다. 그것은 모두 읽기 : 쓰기 비율에 달려 있습니다. 포함 된 열이 포함되거나 포함되지 않은 테스트 시스템에서 워크로드를 테스트하거나 전체 비즈니스주기를 시뮬레이션 했습니까? 검색하지 않으면 조회 비용이 많이 들지만 데이터를 읽는 것보다 자주 업데이트하는 경우 문제가 없습니다.


전반적인 읽기 대 업데이트는 대부분 균형을 이룹니다. 조직 및 개인 정보 보호 문제로 인해 유용한 통계 및 현실적인 테스트를 얻기가 어렵습니다. 우리는 대부분 맹인으로 비행하기 때문에 추상적 인 관점에서 사물을 봐야합니다. 테스트는 생산 변경을 추진하고 결과를 관찰하는 것을 의미합니다-매우 위험합니다.
RaoulRubin

2
그리고 대부분의 읽기가 실제로이 VARCHAR(2000)열을 가져 옵니까, 아니면 대부분의 쿼리를 나타내지 않는 매우 특정한 쿼리의 성능 문제를 해결하고 있습니까? Grant는이 열이 많은 쿼리에 사용 되지 않거나 실제로 검색에 문제를 일으키는 경우 제안 할 때 필요할 때 조회 비용을 지불하는 것이 좋지만, 그렇지 않은 경우 스토리지 비용을 지불하지 않는 것이 좋습니다. . 다시 말하지만, 울타리의 어느 쪽을 가리켜 야하는지 말하기가 어렵습니다. 우리는 실제로 구체적인 내용이 없기 때문에 (테스트 할 수 없기 때문에 더 어려워서 고치려고 노력해야합니다).
Aaron Bertrand

3

나는이 파티에 늦었다는 것을 알고 있지만 substring (col3,10,1)과 같이 행을 찾는 데 사용되는 표현식을 정확하게 색인화합니다. 전체 col3을 사용한 경우 CHECKSUM (col3)을 색인화합니다 (물론 충돌이 있음을 이해함).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.