SQL 전문가에게 질문이 있습니다.SQL Server 2008 실행 계획 질문
거의 동일한 구조의 테이블이 두 개 있습니다.
저장 프로 시저에 전달 된 매개 변수에 따라 하나 또는 다른 테이블에서 데이터를 수집해야합니다.
가장 좋은 방법은?
이러한 테이블을 하나의 테이블로 결합하는 것은 바람직하지 않습니다.
나는 (MS SQL 서버 2008) 다음 그것을했다 :
Select *
FROM
String s
JOIN (
SELECT id
,TypeCode
,ProdNo
FROM Table1
WHERE @param = 1 AND TypeCode= 'INV'
UNION
SELECT id
,TypeCode
,ProdNo
FROM Table2
WHERE @param = 2 AND TypeCode= 'INV'
) m ON m.Id = s.Id
WHERE s.Id = 256
을하지만 실행 계획을보고 할 때 병렬 스레드 만 @param에 의해 필터링 그 이후 두 테이블에서 데이터를 얻었 기 때문에 놀랐습니다 값.
필자는 필터링이 첫 번째 단계에서 이루어지며 단일 테이블에서 수집 된 데이터라고 생각했습니다.
쿼리를 두 개의 쿼리로 분할하지 않고 IF 연산자 만 사용하여 한 테이블에서만 선택하는 방법이 있습니까?
감사합니다.
전체 저장 프로 시저를 표시 할 수 있습니까? 계획은 다른 요인들로 인해 차선책 일 수 있습니다. 예 : 매개 변수 스니핑, 합집합 대신에 합집합 등이 있습니다. –
이 글은 Erland Sommarskog가 작성한 T-SQL의 동적 검색 조건 (http://www.sommarskog.se/dyn-search.html)을 반드시 읽어야합니다. 반복 코드에 대해 걱정할 필요가 없습니다. 이는 숙제가 아닙니다. 실행 계획에 인덱스를 사용하는 것에 대해 걱정하십시오. SQL 코드를 "pretty"로 만들 때 고려해야 할 유일한 것은 indenting & case입니다. 다른 변경으로 인해 쿼리 계획이 느려질 수 있습니다. 나는 슈퍼 슬로우 쿼리의 초고속 쿼리 결과에 사소한 변화를 보았다. GO SPEED (색인 사용) 및 필요에 따라 코드를 복제하십시오. 또한보십시오 : http://www.sommarskog.se/dynamic_sql.html –
2KM - 그렇습니다, 나는 당신에 동의한다. Index Seek로 실행 된 쿼리. 사용하기에 충분히 빠릅니다. 그 중 하나가 완전히 불필요한 경우에 두 하위 쿼리를 실행하지 않는 방법에 흥미 롭습니다. – Cheburek