SQL Server의 경우 최종 실행 계획에 기여하는 요인은 다양합니다. 기본적인 수준에서 통계는 매우 큰 역할을하지만 데이터를 기반으로하지만 항상 모든 데이터를 기반으로하는 것은 아닙니다. 통계도 항상 최신 정보는 아닙니다. 인덱스를 만들거나 다시 작성할 때 통계는 전체/100 % 데이터 샘플을 기반으로해야합니다. 그러나 자동 통계 새로 고침의 샘플 속도는 100 %보다 훨씬 낮으므로 실제로 많은 데이터를 나타내지 않는 범위를 샘플링 할 수 있습니다. 예상되는 행 수는 테이블의 행 수나 필터링 된 조작에 대한 통계를 기반으로 할 수 있습니다. 따라서 오래된 (또는 불완전한) 통계는 테이블의 일부 행이 인덱스를 완전히 무시하게 (더 효율적일 수 있음)하는 것처럼 최적화 프로그램이 최적화되지 않은 계획을 선택하도록 유도 할 수 있습니다. 다른 대답에서 언급 된 바와 같이,보다 고유 한 (즉,선택적) 데이터가 더 유용 할 것입니다. 그러나 통계가있는 유일한 보장 된 열은 색인의 선행 (또는 "가장 왼쪽"또는 "첫 번째") 열임을 명심하십시오. SQL Server는 AutoCreateStatistics DB 옵션이 설정되어 있고 기본적으로 다른 열에 대한 통계를 수집 할 수 있습니다 (일부 인덱스가 아닐지라도 일부 인덱스 포함).
외부 키의 존재는 해당 필드가 쿼리에있을 때 옵티 마이저를 도울 수 있습니다.
그러나 질문에서 고려되지 않은 영역 중 하나는 쿼리 자체의 영역입니다. 약간 변경되었지만 여전히 동일한 결과를 반환하는 쿼리는 근본적으로 다른 실행 계획을 가질 수 있습니다. 이상적으로 (작업이 읽기 명심 지금
WHERE DATEADD(DAY, -1, field) < GETDATE()
: 같은
LIKE '%' + field
또는 함수에서 필드 포장 : 사용하여 인덱스의 사용을 무효화 할 수도 있습니다)를 사용하면 인덱스가 더 빠르지 만 인덱스는 유지해야하므로 DML 작업 (INSERT, UPDATE 및 DELETE)은 느려집니다 (더 많은 CPU 및 디스크 I/O 사용).
마지막으로 비용의 "추정 된"CPU 등 값은 항상 신뢰할 수있는 것은 아닙니다.
SET STATISTICS IO ON
run query
SET STATISTICS IO OFF
과 "논리적 읽기"에 초점 : 더 나은 테스트하는 것입니다. 논리 읽기를 줄이면 성능이 향상됩니다.
결국 인덱스와 쿼리 자체에 대해 성능을 조정하기 위해 프로덕션 환경에 어느 정도 가까운 데이터 집합이 필요합니다.
특히 데이터베이스가 있습니까? 그들은 모두 똑같은 것을 처리하지는 않습니다. –