你也可以把第一個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。
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
注意,這種方法具有相同的索引使用的問題,因爲原來的,因爲使用CONVERT()上FF.FaultDate的。這可以通過兩次添加子查詢來解決,但在這種情況下,最好使用變量方法。這最後一個版本僅用於演示。
問候。
爲先您提供的示例中需要在括號中包裝「select count(*)from user」,否則sql 2008將使用紅色波浪線進行計數。感謝您提供兩個語法示例! – TWood 2012-08-27 21:50:56