1

내 항목에 대한 많은 정보를 요약 한보기가 있습니다. v_item_details라고 부르 자.하위 쿼리 X 임시 테이블 X 동적 SQL 테이블 값 함수

이보기는 재귀 cte 's를 통해 정의되며, 오른쪽 필터링이 적용되지 않으면 매우 느려질 수 있습니다. 기본적으로 항목 ID의 목록을 제공하면 일이 순조롭게 진행됩니다. 따라서 SELECT * FROM v_item_details WHERE item_id IN(1,2,3)과 같은 것이 1 초 미만으로 실행됩니다.

다른 테이블에 정의 된 항목 그룹에 대한 항목 정보를 가져 오려고하면 상황이 복잡해집니다. SELECT * FROM v_item_details WHERE item_id IN (SELECT item_id FROM items WHERE group_id = 1) 쿼리는 group_id가 인덱싱되고 하위 쿼리가 이전 쿼리 (1,2,3)와 동일한 item_id를 반환하더라도 1 분 이상 걸립니다.

테이블 변수를 만들고 하위 쿼리 결과를 삽입 한 다음 조인을 시도했지만 1 분 이상 걸렸습니다.

다음 매개 변수로 item_id를받은 테이블 값 함수로 내보기를 래핑하고 교차 적용을 시도하여 단순 선택과 동일한 계획의 실행을 강제로 시도했지만 4 의사록!

지금은 ID를 선택하고 빠른 하위 쿼리를 실행하는 동적 쿼리를 사용하고 있습니다. 하지만 이제는 저장 프로 시저가 붙어서 더 조작 할 수있는 뷰가 없기 때문에 차선책입니다.

SQL에서 먼저 하위 쿼리의 값을 선택하고 빠른 하위 쿼리를 실행하도록하는 방법에 대한 의견이 있으십니까? 나는 LOOP 조인 쿼리 힌트를 사용하는 것이 효과가있을 것이라고 생각했지만 서브 쿼리로 시작하는 루프를 수행했지만 뷰에 대한 쿼리 계획은 빠른 쿼리와 같지 않았기 때문에 여전히 그렇지 않았습니다. 성능 문제.

안부, 카를로스 JOURDAN

답변

0

우리가 문제를 재현하고 진단하는 우리 자신의 SQL Server 인스턴스에 구축 할 수 있습니다 라이브 예제를 가지고 도움이 될 것입니다. 이없는 경우, 여기에 몇 가지가 있습니다 나는 시도 할 수 있습니다 :

  • A가 오히려 절에 비해 가입 사용해보십시오 (나는이 정상적으로 알이 최대 최신 items 테이블에 대한 통계가 있는지 확인 일반적으로 동일하지만 COLUMNSTORE 인덱스와 같이 매우 다르게 동작합니다. 재귀 CTE가있는 단점이있을 수도 있습니다.
  • vw_item_details에서 사용되는 테이블에 적절한 기본 키가 있고/또는 인덱스
  • * vw_item_details (* lo ng-shot,하지만 절대로 몰라 ...)