문제

나는 수십 개의 다른 시간에 합류하고 있으며 매번 열 중 하나의 하위 스트링 결과를 기반으로 합류 (또는 필터)를 결합합니다 (문자열이지만 0으로 왼쪽으로 가득 차 있습니다. 마지막 4 자리에 관심이 있습니다). 결과적 으로이 열이 색인화되고 쿼리가 인덱스를 사용하더라도 하위 문자 자체가 인덱스되지 않기 때문에 테이블 스캔을 수행하므로 SQL Server는 결합하기 전에 모든 행에 대해 계산해야합니다.

이 프로세스 속도를 높이는 방법에 대한 아이디어를 찾고 있습니다. 현재 테이블에보기가 있습니다 (테이블에 친근한 이름을 부여하기 위해 "선택 *에서"입니다). 계산 된 뷰에 열을 추가 한 다음 색인화하는 것을 고려하고 있습니다. 그래도 다른 제안에 열려 있습니다. 어떤 생각이 있습니까?

자세한 세부 사항:나는 이것을 처음 공유 했어야했다. 테이블은 청구 시스템에서 복제를 받으므로 계산 된 열을 추가하기 위해 기본 테이블을 편집하는 것은 옵션이 아닙니다. 계산 된 열은 테이블의보기에 추가되어야합니다. 또한 주요 0은 항상 제로를 선도하는 것은 아닙니다. 때로는 관심이없는 다른 데이터입니다. 실제 질문은 "라고 생각합니다."인덱스를 사용하면서 Varchar 열의 중간에있는 데이터에 어떻게 가입 할 수 있습니까? 전체 텍스트 검색?"

내 예를 명확히합니다단순화하지만 본질적으로 다음 값의 열에서 값을 찾으려고한다고 가정 해 봅시다.

00000012345MoreStuff
00000012345Whatever
19834212345
Houses12345837443GGD
00000023456MoreStuff

나는 서브 스트링 (7,5) = "12345"가있는 행에 관심이 있으므로 행 1-4를 원하지만 행 5가 아님을 원합니다. 제안하는 것은 내 "select *"에 열을 추가하는 것입니다. 이 하위 문자열이 들어간 다음 그에 따라 색인화됩니다. 더 의미가 있습니까?

도움이 되었습니까?

해결책

이 형식의 필드가 있다고 가정합니다.

00Data0007
000000Data0011
0000Data0015

, 다음을 수행 할 수 있습니다.

  • 계산 된 열 만들기 : ndata AS RIGHT(REVERSE(data), LEN(data) - 4)

    이렇게하면 열을 다음으로 변환합니다.

    ataD00
    ataD000000
    ataD0000
    
  • 해당 열에 인덱스를 만듭니다

  • 문자열을 검색하려면이 쿼리를 발행하십시오 Data:

    SELECT  *
    FROM    mytable
    WHERE   ndata LIKE N'ataD%'
            AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
    

    첫 번째 조건은 거친 필터링에 인덱스를 사용합니다.

    두 번째는 모든 주요 캐릭터 (계산 된 열에서 후행 캐릭터가 된)가 0에 지나지 않도록합니다.

성능 세부 사항은 내 블로그 에서이 항목을 참조하십시오.

업데이트

색인을 원한다면 SUBSTRING 스키마를 변경하지 않고보기를 만드는 것이 옵션입니다.

CREATE VIEW v_substring75
WITH SCHEMABINDING
AS
SELECT  s.id, s.data, SUBSTRING(data, 7, 5) AS substring75
FROM    mytable

CREATE UNIQUE CLUSTERED INDEX UX_substring75_substring_id ON (substring75, id)

SELECT  id, data
FROM    v_substring75
WHERE   substring75 = '12345'

다른 팁

을 추가하다 계산 된 열 테이블에 그리고이 열에 인덱스를 만듭니다.

ALTER TABLE MyTable
Add Column CodeHead As LEFT(Code,Len(Code)-4)

그런 다음 이것에 대한 색인을 만듭니다.

CREATE INDEX CodeHeadIdx ON MyTable.CodeHead

같은 'Something%'문의 관점에서 필터 기준을 다시 제출할 수 있습니까? (이것은 색인에 적용 가능합니다)

열을 두 개의 열 - 교사 데이터와 추가 4 자로 변경하십시오. 칼럼의 일부를 사용하면 본 것처럼 물건이 느려집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top