2017-10-26 17 views
1

여러 프로젝트 (데이터베이스)에서 일부 레코드를 임시 테이블로 동적으로 수집하고 테이블에 삽입하려는 임시 테이블에서 동적으로 수집하는 절차를 만들었습니다. WHERE 성명으로,하지만 불행히도 내가 실행 계획을 확인했을 때,이 쿼리 부분은 많은 부하를 짊어 져야한다는 것을 알게되었습니다. 이 INSERT 부분 또는 WHERE 부분을 어떻게 최적화 할 수 있습니까?SQL 임시 테이블에서 테이블에 삽입을 최적화하는 방법

INSERT INTO dbo.PROJECTS_TESTS (PROJECTID, ANOTHERTID, DOMAINID, is_test) 
    SELECT * FROM #temp_Test AS tC 
    WHERE NOT EXISTS (SELECT TOP 1 1 
         FROM dbo.PROJECTS_TESTS AS ps WITH (NOLOCK) 
         WHERE ps.PROJECTID = tC.projectId 
         AND ps.ANOTHERTID = tC.anotherLink 
         AND ps.DOMAINID = tC.DOMAINID 
         AND ps.is_test = tC.test_project 
         ) 
+0

같은

INSERT INTO dbo.PROJECTS_TESTS (PROJECTID, ANOTHERTID, DOMAINID, is_test) SELECT <maybe distinct> tC.* FROM #temp_Test AS tC LEFT OUTER JOIN FROM dbo.PROJECTS_TESTS AS ps on ps.PROJECTID = tC.projectId AND ps.ANOTHERTID = tC.anotherLink AND ps.DOMAINID = tC.DOMAINID AND ps.is_test = tC.test_project where ps.PROJECT ID IS NULL 

또는 어떤이는 (NOLOCK)를 사용하지 않는 프로덕션 환경의 경우. 실행 계획을 보여주고 왜이 쿼리가 성능이 좋지 않다고 생각하십니까? PROJECTS_TESTS 테이블에 어떤 인덱스가 있습니까? –

+0

1. #temp projectId, anotherLink, DOMAINID, test_project에 색인을 작성하십시오. 2. 필요 없음 @TOP 1 1 @ 3. 삭제 NOLOCK –

답변

0

난 당신이 더 나은 JOINEXISTS보다를 수행하여 제공 될 거라고 생각합니다. 조인 조건 (현재 WHERE에 있음)의 카디널리티에 따라 DISTINCT도 필요합니다. 그