1

많은 수의 행이있는 SQL Server 2014의 테이블이 있습니다. TableA라고 부르 자.SQL Server 큰 테이블을 쿼리하는 가장 효율적인 방법은 거의 완전한 결과 집합

나는 거의 모든 행 (행 97 %의 말을하자)에 대한 자사의 PK (AN AUTOINCREMENT ID 클러스터 된 KEY)를 쿼리해야하고이 결과 집합은 일반적으로 다른 테이블 (TableB의)를 통해 함께 참여한다 외래 키 (FK_A라고 부르 자). 문제는 TableALowSparseColumn = 100와 행의 97 %를 갖는다는 것이다

SELECT 
    TableB.someColumnNotFKNorPK 
FROM 
    TableB 
INNER JOIN 
    TableA ON TableB.FK_A = TableA.ID 
WHERE 
    TableA.LowSparseColumn = 100 

SQL 서버 부분 결과

에게 숨길 필요가 있기 때문에 스풀 등을 행하기 때문에이 수율 : 같이

쿼리 보인다

그 문제를 어떻게 처리해야하는지 알고 있습니까?

도움이 정말 감사합니다!

감사합니다.

+1

아마도'LowSparseColumn = 100'에 [필터링 된 색인 생성] (https://docs.microsoft.com/en-us/sql/relational-databases/indexes/create-filtered-indexes)을 작성했을 것입니다. –

+0

나는 필터링 된 인덱스가 97 %의 행을 충족하는 데 도움이 될 것이라고 생각하지 않습니다. 필터링 된 인덱스를 만드는 주요 고려 사항 중 하나는 관련 레코드가 최소화되어야합니다. LowSparseColumn에서 단순한 비 클러스터형 인덱스가 속도를 향상시킬 수 있습니다. –

답변

2

당신이 더 나은 아직 TableB(fk_A)에 인덱스를 (또는 경우 (TableB(fk_A, someColumnNotFKNorPK)와 테이블 통계가 최신이며, 다음 최적화가 작업을 수행해야합니다. 스풀링없이 TableB에 가입하기 TableA을 읽고해야한다.

( ID 기본 키의 경우 해당 인덱스가 필요하지 않지만)이 TableA(ID, LowSparseColumn)에 인덱스의 사용을 최적화한다

SELECT TableB.someColumnNotFKNorPK 
FROM TableB 
WHERE EXISTS (SELECT 1 
       FROM TableA 
       WHERE TableB.FK_A = TableA.ID AND 
        TableA.LowSparseColumn = 100 
      ); 

:

당신은 쿼리를 다시 작성할 수 있습니다.