문제

우리 사이트는 꽤 열심히 일하고 있기 때문에 기존 쿼리 중 일부를 최적화하는 것을 살펴보고 있습니다.

이것을 조사하는 동안 우리는 클러스터 된 인덱스의 간단한 참조가 쿼리에있을 때 실행 계획이 약 4-5 배 더 빠른 여러 쿼리를 가로 질러 달렸습니다.

이것이 이전 쿼리라면 :

SELECT ...
FROM myTable
WHERE categoryID =  @category 

SSMS의 실행 계획에 따라 다음 쿼리는 4 배 빠릅니다.

SELECT ...
FROM myTable
WHERE categoryID =  @category 
AND lotID = lotID

우리는 이것이 어떻게 쿼리를 더 빨리 만들 수 있는지 이해할 수없는 것 같습니다. 클러스터 된 인덱스는 LotID에 있지만 자체에 대한 비교를 한 이후 어떻게 도움이됩니까?

도움이 되었습니까?

해결책

나에게 꽤 분명해 보인다

첫 번째 쿼리는 클러스터 된 인덱스로 덮여 있지 않지만 두 번째 쿼리는 LOTID가 첫 번째 쿼리의 where 절에 있지 않기 때문에

읽고 싶을 수도 있습니다 SQL 서버 커버링 인덱스 모든 것이 어떻게 작동하는지 확인합니다

또한 클러스터 된 인덱스가 데이터이고 테이블의 모든 데이터가 클러스터 된 인덱스에 있음을 이해해야합니다. 클러스터 된 인덱스가있는 테이블에서 클러스터 된 인덱스가 아닌 인덱스를 만들면 클러스터 된 인덱스가 클러스터 된 인덱스에 대한 포인터가 있습니다 (이에 따라 나머지 데이터가있는 곳이기 때문에). 인덱스 와이 경우 클러스터되지 않은 인덱스 만 사용됩니다 ... 지금은 끔찍한 일을 멈출 것입니다.

편집하다

나는 읽고 lotid = @lotid not and lotid = lotid

때로는 Lotid> 0 (가장 낮은 숫자를 선택)을 수행하여 클러스터 된 색인을 가짜로 만들 수 있습니다.

그래서 당신의 가장 작은 lotid = 1이고 당신은 추가하고 lotid> 0

스캔 대신에 찾는 것을 볼 수 있습니다.이 게시물에서 indexvalue> ''를 보여줍니다. 인덱스는 항상 인덱스 스캔보다 항상 더 좋거나 빠릅니까?

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