첫 번째 SELECT를 하위 쿼리에 넣을 수도 있습니다. 대부분의 옵티마이 저는 어쨌든 상수로 변환 할 것이기 때문에 이에 대한 성능 저하는 없어야합니다. 덧붙여
,이 같은 술어 사용하고 있기 때문에 : 표현을 술어
이
CONVERT(...) = CONVERT(...)
적절하게 최적화 할 수 없거나을 CONVERT() 함수에 의해 열 참조에 사용하는 인덱스.
여기에 약간 더 나은 원래 쿼리를 만드는 방법 중 하나입니다 :
DECLARE @ooDate datetime
SELECT @ooDate = OO.Date FROM OLAP.OutageHours AS OO where OO.OutageID = 1
SELECT
COUNT(FF.HALID)
FROM
Outages.FaultsInOutages AS OFIO
INNER JOIN Faults.Faults as FF ON
FF.HALID = OFIO.HALID
WHERE
FF.FaultDate >= @ooDate AND
FF.FaultDate < DATEADD(day, 1, @ooDate) AND
OFIO.OutageID = 1
이 버전은 FaultDate을 포함 인덱스에 활용할 수 있으며, 같은 목표를 달성 할 수있다.
변수 선언과 후속 SELECT를 피하기 위해 하위 쿼리를 사용하도록 다시 작성했습니다. 이 방법으로 인해 FF.FaultDate에 CONVERT()의 사용, 원본과 동일한 인덱스 사용 문제가 있다는
는
SELECT
COUNT(FF.HALID)
FROM
Outages.FaultsInOutages AS OFIO
INNER JOIN Faults.Faults as FF ON
FF.HALID = OFIO.HALID
WHERE
CONVERT(varchar(10), FF.FaultDate, 126) = (SELECT CONVERT(varchar(10), OO.Date, 126) FROM OLAP.OutageHours AS OO where OO.OutageID = 1) AND
OFIO.OutageID = 1
참고. 이 작업은 하위 쿼리를 두 번 추가하여 해결할 수 있지만이 경우 변수 접근 방식을 사용하는 것이 좋습니다. 이 마지막 버전은 데모 용입니다.
감사합니다.
예를 들어, "select count (*) from user"를 괄호로 묶어야하거나 SQL 2008이 빨간색의 구불 구불 한 선으로 표시됩니다. 두 가지 구문 예제를 제공해 주셔서 감사합니다! – TWood