2014-12-11 2 views
0

나는 두 개의 열이있는 테이블이 : 나는 또한 클러스터되지 않은 인덱스를 생성SQL 서버 두 개의 인덱스 컬럼은 다른 속도의 성능을

CREATE TABLE #history(
    Today  INT NOT NULL, 
    LastDay  INT NOT NULL 
      PRIMARY KEY(Today, LastDay)) 

그러나

CREATE NONCLUSTERED INDEX #history_IX1 ON #history(LastDay) 

을, 나는 열을 사용하여 테이블을 조인 할 때 오늘날 성능은 20 대 4와 같이 LastDay 열을 사용하는 것보다 훨씬 빠릅니다.

LastDay 열이 제대로 인덱싱되지 않아 문제가 발생한 것 같습니다. 또한 SQL 힌트를 사용하여 색인 생성을 강제 수행하므로 결과는 동일합니다. 이 문제에 대한

INSERT INTO anytable(
     anycolumn) 
SELECT m.anycolumn 
FROM AMillionTable m 
     INNER JOIN #history h 
       ON h.Today = m.day 

m.day also indexed. 
Same query, when change h.Today to h.LastDay, the process speed significantly drops. 

모든 솔루션 : 여기

은 예입니다?

+0

자세한 정보를 찾을 수 있습니다. 힌트를 사용하면 SQL 엔진에 엔진보다 쿼리 최적화에 대해 더 많이 알 수 있습니다. 귀하의 질문은 명확하지 않지만, 기본 수준에서 꽤 깊은 잠수까지 색인을 생성하는 기사 모음에서 많은 정보를 얻을 수 있습니다. http://www.sqlservercentral.com/stairway/72399/ –

+0

두 개의 쿼리에서 Explain 계획을 게시 할 수 있습니까? –

+0

@PeterSmith 예제를 추가했습니다. 시나리오를 설명 할 수 있기를 바랍니다. –

답변

1

CLUSTERED와 NONCLUSTERED의 두 가지 인덱스이므로 정상입니다. 오늘 열을 사용하여 참여하면 CLUSTERED 색인이 사용됩니다. NONCLUSTERED 색인에는 추가 작업이 필요합니다.

당신은 당신이 다른 방법이 없다 절대적으로 확실한 경우에만 힌트를 사용해야 여기 Link

+0

링크를 제공해 주셔서 감사합니다. 비 클러스터형 인덱스가 클러스터형 인덱스보다 느리다는 것을 알고 있습니다. 하지만 기본 키'PRIMARY KEY (LastDay, Today)'의 순서를 변경하고 오늘의 비 클러스터형 인덱스를 생성하더라도 성능은 LastDay 열에서 여전히 낮습니다. –