none
SQL 2005 에서 LIKE 검색시 예상행수 이상 현상 RRS feed

  • 질문

  • SQL 2005 업그레이드를 위해 테스트 중입니다.

    그런데 쿼리 실행계획이 좀 이상하게 나오는게 있어 확인해보니 LIKE 검색시 예상행수를 제대로 판단을 못하는 경우가 있었습니다.

    예상 행수가 실제 행수보다 훨씬 많게 나오네요. 물론 통계정보 갱신을 100%로 해도 마찬가지구요...

    그래서 아래와 같이 단순화시켜 테스트를 해봤습니다만, 여전히 예상행수가 잘 맞지 않네요.

    고객명으로 LIKE 검색하는 겁니다만, 도대체 원인이 뭘까요???

    drop table CustNm

    -- 1. 고객명 테이블 생성
    create table CustNm
    ( PatNm varchar(50)
    )

    --2. 고객명컬럼에 인덱스 생성
    create clustered index CI_CustNm on CustNm ( PatNm )
    go

    --3. 동일값에 대해 10000건 입력
    set nocount on
    declare @i int
     set @i = 1
    while (@i <= 10000)
    begin
     insert into CustNm values('콩사탕')
     set @i = @i + 1
    end

    --4. 한 건 입력
    insert CustNm values('개똥이')

    -- 5. 통계 갱신
    update statistics CustNm with fullscan

    dbcc show_statistics(CustNm, CI_CustNm)

    --6. 예상실행계획 보기(Ctrl+L)
    select count(*)
    from CustNm (nolock)
    where PatNm  like '개똥이%' -- 예상행수 : 10001건

    select count(*)
    from CustNm (nolock)
    where PatNm like '개똥이%'

     위에서 여러번 SELECT해 본 이유는 재밌는게 어떤 경우는 1건으로 판단하고, 또 어떤 경우는 10001건으로 판단하기도 해서입니다. 쩝~

    제가 테스트해 본 환경은 32bit, 64bit 두 군데에서였고, collation은 Korean_Wansung_CS_AS 입니다.

    "대소문자 구분"이란게 일반 환경과는 좀 다르죠...

    참, 영문은 별 문제가 없는 듯 하네요.

    혹시 테스트해보시고 어떤지 좀 봐주세요.

    꾸벅~

     

    2006년 10월 24일 화요일 오전 4:18

모든 응답

  • 위의 예제는 클러스터인덱스라서 예상행수 문제만 보일 뿐, 실행계획의 문제는 보이지 않아

    파악이 어려울 수 있어서 좀더 알기 쉬운 예제를 다시 올립니다.

    이번에는 조건절 컬럼을 넌클러스터 인덱스로 만들었고 조회시에는 인덱스 외의 컬럼을 조회하기 때문에

    북마크 룩업이 필요한 상황입니다.

    꾸벅~

    /***********************
     한글 LIKE 판단
     ***********************/
    drop table CustNm

    -- 1. 고객명 테이블 생성
    create table CustNm
    ( num int identity primary key,
      Sex char(2) null,
    PatNm varchar(50) null )

    --2. 고객명컬럼에 인덱스 생성
    create  index IX_CustNm on CustNm ( PatNm )
    go

    --3. 동일값에 대해 10000건 입력
    set nocount on
    declare @i int
     set @i = 1
    while (@i <= 10000)
    begin
     insert into CustNm values('남', '박또또')
     set @i = @i + 1
    end

    --4. 한 건 입력
    insert CustNm values('남', '김또또')


    -- 5. 통계 갱신
    update statistics CustNm with fullscan

    dbcc show_statistics(CustNm, IX_CustNm)

    --6. 예상실행계획 (Ctrl+L) 및 실제 실행계획 보기
    select PatNm, Sex
    from CustNm (nolock)
    where PatNm like '김또또%'

    select PatNm, Sex
    from CustNm (nolock)
    where PatNm  like '김또또%'

    2006년 10월 27일 금요일 오전 7:20