내측 조인 대 내측 조인(선택. 시작)
이 두 버전의 동일한 쿼리 사이에 성능 면에서 차이가 있습니까?
--Version 1
SELECT p.Name, s.OrderQty
FROM Product p
INNER JOIN SalesOrderDetail s on p.ProductID = s.ProductID
--Version 2
SELECT p.Name, s.OrderQty
FROM Product p
INNER JOIN (SELECT ProductID, OrderQty FROM SalesOrderDetail) s on p.ProductID = s.ProductID
(DBA가) Version 2가 쿼리에 필요한 열만 내부 SELECT 문으로 가져오기 때문에 더 빠르다고 합니다.그러나 쿼리 성능은 영향을 받는 행 수와 반환되는 열의 최종 목록을 기반으로 하기 때문에 의미가 없는 것 같습니다.
둘 다 조회 계획이 동일하기 때문에 차이가 없는 것 같습니다.
내가 맞나요?
맞습니다.당신은 옵티마이저를 다시 추측하려고 하기보다는 쿼리 계획을 확인하면서 정확히 옳은 일을 했습니다. :-)
큰 차이는 없을 것입니다.그러나 버전 2는 외부에 참여해야 하는 계산, 집계 등이 있을 때 더 쉽습니다.
--Version 2
SELECT p.Name, s.OrderQty
FROM Product p
INNER JOIN
(SELECT ProductID, SUM(OrderQty) as OrderQty FROM SalesOrderDetail GROUP BY ProductID
HAVING SUM(OrderQty) >1000) s
on p.ProductID = s.ProdctId
SQL Server가 쿼리에 필요하지 않은 데이터를 읽으려고 하지 않을 경우에도 동일한 것으로 보이며, Optimizer는 충분히 영리합니다.
복잡한 쿼리(즉, 조인, 그룹화 등 자체가 있는 쿼리)에 조인할 때 의미를 가질 수 있으므로, 예, 필수 필드를 지정하는 것이 좋습니다.
하지만 한 가지 더 요점이 있습니다.쿼리가 단순한 경우에는 차이가 없지만 성능을 향상시킬 수 있는 모든 추가 작업은 Optimizer가 더 열심히 작동하도록 하고 Optimizer는 최적의 계획을 제때 얻지 못할 수 있으며 최적의 쿼리를 실행하지 못할 수 있습니다.따라서 추가 선택은 성능을 저하시킬 수 있는 작업일 수 있습니다.
더 작은 데이터 세트의 경우에는 문제가 되지 않지만 더 나은 방법은CROSS APPLY
대신 방법JOIN
진술.특히 서버에 많은 쿼리가 발생하는 경우에 더욱 그렇습니다.코드는 다음과 같습니다.
SELECT p.Name, s.OrderQty
FROM Product p
CROSS APPLY (SELECT OrderQty
FROM SalesOrderDetail
WHERE ProductID = p.ProductID ) s
쿼리 계획에서 확인한 것은 옳은 일이었습니다.하지만 저는 버전 2에 대해 100% 자신이 있습니다.오프 레코드 수가 매우 높은 쪽에 있을 때 더 빠릅니다.
제 데이터베이스에는 약 1,000,000개의 레코드가 있으며 이것이 정확히 쿼리 계획이 두 쿼리 간의 차이를 보여주는 시나리오입니다.또한 where 절을 사용하는 대신 조인 자체에서 사용하면 쿼리 속도가 빨라집니다.
p를 선택합니다. 름이, s.OrderQty
제품 pFROM 품제
.ID의 JOIN( Product (SELECT Product) SalesOrderDetail OrderQTY FROM SalesOrderDetail)입니다.제품 ID = s. p= 1.p.isactive ID = 1
이 쿼리의 더 나은 버전은 다음과 같습니다.
p를 선택합니다. 름이, s.OrderQty
제품 pFROM 품제
.ID의 JOIN( Product (SELECT Product) SalesOrderDetail OrderQTY FROM SalesOrderDetail)입니다.제품 ID = s. p= 1.isactive ID 및 p.isactive = 1
(비활성은 제품 표의 필드로 활성/비활성 제품을 나타냅니다.)
언급URL : https://stackoverflow.com/questions/11574442/inner-join-vs-inner-join-select-from
'programing' 카테고리의 다른 글
python을 딕트하기 위한 URL 쿼리 매개 변수 (0) | 2023.07.19 |
---|---|
날짜/시간별 판다 데이터 프레임 그룹 (0) | 2023.07.19 |
파이썬은 무슨 뜻입니까? (0) | 2023.07.19 |
mariadb/mysql - sysdate/curdate로 날짜 열을 만드는 방법은 무엇입니까? (0) | 2023.07.19 |
Azure Keyvault - "작업 "list"는 볼트 정책에서 허용되지 않지만 모든 권한이 선택되었습니다. (0) | 2023.07.19 |