it-swarm-ko.tech

SQL Server에서 열악한 스풀 작업을 피하는 방법

SELECT INTO 문을 많이 사용하는 저장 프로 시저와 관련된 ETL 프로세스가 있습니다 (최소 로깅되므로 로그 트래픽이 적게 생성됨에 따라 더 빠름). 하나의 특정 저장 스토어드 프로 시저에서 발생하는 일괄 처리 작업 중 가장 비싼 작업 중 일부는 쿼리 결과를 버퍼링 한 다음 생성중인 테이블에 복사하는 것처럼 보이는 열성적인 스풀입니다.

eager spools 에 대한 MSDN 설명서는 매우 드.니다. 이것이 정말로 필요한지 (그리고 어떤 상황에서) 더 깊은 통찰력을 가진 사람이 있습니까? 이해가되지 않을 수도있는 몇 가지 이론이 있지만 쿼리에서 이러한 이론을 제거하는 데 성공하지 못했습니다.

.sqlplan 파일은 상당히 크므로 (160kb) 포럼에 직접 게시하는 것이 적절하지 않은 것 같습니다.

따라서 다음은 특정 답변을 적용 할 수있는 몇 가지 이론입니다.

  • 쿼리는 형식화 된 날짜 구문 분석과 같은 데이터 변환에 일부 UDF를 사용합니다. 이 데이터 변환은 합리적인 스풀을 사용하여 합리적인 유형 (예 : varchar 길이)을 구성하기 전에 테이블에 할당해야합니까?
  • 위 질문의 확장으로 누구나 쿼리 에서이 작업을 수행하거나 수행하지 않는 것에 대해 더 깊이 이해하고 있습니까?

스풀링에 대한 나의 이해는 그것이 당신의 실행 계획에 약간의 빨간 청어라는 것입니다. 그렇습니다. 쿼리 비용이 많이 들지만 실제로는 비용이 많이 드는 재검색을 피할 수 있도록 SQL Server가 자동으로 수행하는 최적화입니다. 스풀링을 피하려면 실행 트리의 비용이 증가하고 전체 쿼리의 비용이 증가합니다. 특히 SQL 코드를 보지 않고 데이터베이스의 쿼리 최적화 프로그램이 실행 방식을 구문 분석하는 원인에 대한 특별한 통찰력은 없지만 동작을 신뢰하는 것이 좋습니다.

그러나 이것이 정확히 무엇을하고 소스 데이터의 변동성에 따라 실행 계획을 최적화 할 수 없다는 것을 의미하지는 않습니다. SELECT INTO를 수행 할 때 종종 실행 계획에 스풀링 항목이 표시되고 읽기 격리와 관련 될 수 있습니다. 특정 상황에 적합한 경우 트랜잭션 격리 수준을보다 저렴한 비용으로 낮추거나 NOLOCK 힌트를 사용하면됩니다. 복잡하고 성능이 중요한 쿼리에서 NOLOCK (데이터에 안전하고 적절한 경우) 아무 이유가 없어도 쿼리 실행 속도를 크게 높일 수 있다는 것을 알았습니다.

이 상황에서 READ UNCOMMITTED 또는 NOLOCK 힌트를 시도하면 일부 스풀을 제거 할 수 있습니다. (일관되지 않은 상태로 착륙 할 가능성이 있지만 모든 사람의 데이터 격리 요구 사항이 다른 경우에는이 작업을 수행하지 않으려 고합니다.) TOP 연산자와 OR 연산자는 때때로 스풀링을 일으킬 수 있지만 ETL 프로세스에서 수행하는 작업 중 하나를 의심합니다 ...

귀하의 UDF도 범인이 될 수 있습니다. 각 UDF를 한 번만 사용하는 경우 인라인으로 배치하여 성능 이점이 큰지 확인하는 흥미로운 실험이 될 것입니다. (그리고 쿼리와 함께 인라인을 작성하는 방법을 알 수 없다면 스풀링을 일으킬 수 있습니다.).

마지막으로 살펴보아야 할 것은 순서를 바꿀 수있는 조인을 수행하는 경우 힌트를 사용하여 조인 순서가 가장 선택적 순서 인 것으로 알려진 순서대로 발생하도록하는 것입니다. 그것은 약간의 도달 거리이지만 이미 최적화를 고수했다면 시도해 보는 것은 아프지 않습니다.

33
Grank