2013-01-22 2 views
2

를 느리게합니까 나는 SQL 서버를 2012왜 일부 열은 쿼리

이 같은 somehting하는 쿼리를 최적화하기 위해 노력하고 있습니다를 사용하고 있습니다 달리기. 조인에 사용되는 모든 열에 대한 인덱스가 있습니다. 테이블에는 500k 개의 레코드가 있습니다.

제 질문은 : select에서 tc.name, tc.id 및 tc.descr 열을 제거하면 쿼리가 1 초 이내에 결과를 반환합니다. 왜?

+2

을 이해하는데 정말 도움이됩니다. 가장 큰 테이블부터 시작하여 작은 테이블에 대해 'JOIN'해야합니다. – Kermit

+0

'c'는 자주 쓰여 집니까? – MikeSmithDev

+0

SQL Management Studio를 사용하는 경우 최적화 프로그램을 실행하여 실행 계획을 볼 수 있습니다. 이것은 정확하게 문제가 무엇인지에 대한 통찰력을 제공 할 수 있습니다. http://www.simple-talk.com/sql/sql-training/the-sql-server-query-optimizer/ – Wade

답변

0

마지막으로 추가 색인을 테이블에 추가하여 쿼리를 조정할 수있었습니다. SQL 서버는 누락 된 색인을 보여 주거나 암시하지 않았지만 select에있는 필드에 새로운 클러스터되지 않은 색인을 작성하여 알아 냈습니다.

여러분 모두에게 도움을 주셔서 감사합니다. 링크 @Wade

당신이`JOIN`에서 전체 테이블을 제거하고 있기 때문에 SQL 옵티 마이저에게

0

실제로 차이점을 알기 위해 실행 계획을 게시해야합니다.

내가 아는 한 SQL Server는 이 아니며 어웨이를 최적화합니다. 결국 선택 목록에 열이 없더라도 조인을 필터링하여 행 수를 늘릴 수 있습니다.

그러나 한 단계는 건너 뛸 수 있습니다. select에있는 변수를 사용하면 엔진에서 색인 으로 이동하여 데이터가있는 페이지를 가져와야합니다. 변수가 없으면 엔진에서 가져 오기를 수행 할 필요가 없습니다. 이렇게하면 한 유형의 조인에서 다른 유형으로 옵티 마이저의 균형을 미묘하게 조정할 수 있습니다.

두 번째 가능성은 단순히 타이밍과 관련됩니다. 쿼리를 한 번 실행하면 페이지 캐시가 시스템에 채워질 수 있습니다. 두 번째 실행하면 데이터가 메모리에 있기 때문에 쿼리가 훨씬 빠르게 수행됩니다. (1) 각 호출 사이에 캐시를 지우거나 (2) 캐시가 동등하게 채워지 지 않는 한 타이밍을 실행하지 마십시오.