2013-03-06 2 views
1

몇 가지 결함이있는 저장 프로 시저를 발견했습니다.직선 쿼리 또는 하위 쿼리의 차이점은 무엇입니까?

SELECT firstname, surname, id 
    FROM TableName 
    WHERE afield = avalue 

이 많이 반복 :

SELECT alias.firstname, alias.surname, alias.id 
FROM 
    (SELECT firstname, surname, id, address, anotherfield, etc, etc 
    FROM TableName 
    WHERE afield = avalue) alias 

그래서,이 같이 명확하게 동일합니다 : 하나 개의 존재, 개발자는 이런 짓을. 그래서, 내 질문은 하위 쿼리를 수행하여 성능 손실이 무엇입니까? 나는 그것이 쓸모 없다는 것을 안다 ... 그리고 최선의 생각은 그것을 바르게 만드는 것이다 - 나는 그것을했다. 하지만, 그것을 떠나는 성능 손실이 있습니까?

나는 쿼리 최적화 프로그램이이를 이해하고 올바른 일을한다고 생각하고있다.

답변

2

이와 같은 간단한 경우 SQL Server는 이러한 쿼리를 동일한 실행 계획으로 축소합니다.

나는 AdventureWorks2012에이 시도 :

SELECT CarrierTrackingNumber, ProductID, UnitPrice, LineTotal 
FROM 
(
    SELECT * 
    FROM Sales.SalesOrderDetail 
    WHERE ProductID = 781 
) AS Alias; 

SELECT CarrierTrackingNumber, ProductID, UnitPrice, LineTotal 
FROM Sales.SalesOrderDetail 
    WHERE ProductID = 781; 

계획은 동일하고 런타임 통계의 차이는 구별 할 수 없다. 옵티마이 저는 인덱스 스캔을 축소하고 무시 각각의 경우에,

SELECT AddressLine1, City, StateProvinceID 
FROM Person.Address 
    WHERE StateProvinceID = 9; 

SELECT AddressLine1, City, StateProvinceID 
FROM 
(
    SELECT * FROM Person.Address 
    WHERE StateProvinceID = 9 
) AS x; 

SELECT AddressLine1, City, StateProvinceID 
FROM 
(
    SELECT * FROM Person.Address 
) AS x 
WHERE StateProvinceID = 9; 

같은 일이 :

enter image description here

나는 또한 의도적으로 복잡한 유형 (지리)로 테이블을 선택하고, 다음을 시도 표시 다른 열을 참조 할 수 있습니다 :

enter image description here

당신이 t에 의존 할 수 있는지 여부 보다 복잡한 쿼리에서 동일한 최적화가 수행 될지 확신 할 수 없습니다. 옵티 마이저가 항상 완벽하거나 예측 가능한 것은 아니기 때문에이 붕괴가 안정적으로 발생하지 않는 더 복잡한 쿼리를 구상 할 수 있습니다.

내가보고있는 패턴의 가치를 잘 모르겠다. 실제로 어떤 목적을 실제로 수행하는 예가있을 수 있습니다.

+0

감사합니다. @Aaron, 놀라운 답변이며 매우 유용합니다. 필자가 보았던 질의에 대한 이유는 순수하게 개발자가 상급자가 제공 한 지침에 대한 오해였습니다. 문제는 이것이 많이 완료되었습니다 ... 아주 간단한 쿼리였습니다. 그리고 그들 모두를 바꾸려면 중요한 재시험이 필요했습니다. 그래서 몇 가지를 변경했지만 이제 시간 변경 비용에 관한 한 지속적으로 변경하는 것이 유용했는지 궁금합니다. 성능 손실은 없습니다. 남겨 둡니다. 귀하의 회신이 그에 응답했습니다. 감사! – Craig

1

두 쿼리에 대한 실행 계획은 성능면에서 동일합니다. 옵티마이 저는 방금 사용하지 않는 열을 버립니다.

2

외부 쿼리에 projection 만 관련된 경우에는 두 쿼리간에 실행 계획에 차이가 없어야합니다. 내부 쿼리와 외부 쿼리 모두에서 "where"절을 사용하는보다 복잡한 쿼리는 쿼리 최적화 프로그램의 제한을 테스트 할 수 있으며 2 수준 쿼리에 대한 열등한 쿼리 계획을 생성 할 수 있습니다. 그러나 계획 및 실행 속도는 같은.

관련 문제