流行測驗,SQL Server能手:可以在單個查詢中有效完成「常量」查找嗎?
下面student
子查詢將被執行多少次? (假設有在something
至少十行):
SELECT TOP 10 a, b
, (SELECT type_id
FROM type
WHERE type_code = 'student') student
FROM something
如果說1,然後像我一樣,你承擔的SQL Server將認識到student
值作爲一個不變的標量。
遺憾的是,答案是10:
我知道,我將使用一個CTE!
WITH codes (student) AS (
SELECT (SELECT type_id
FROM type
WHERE type_code = 'student')
)
SELECT TOP 10 a, b
, student
FROM something
CROSS JOIN codes
結果是完全一樣的。
當然,我可以先捕獲標給一個變量獲得所需的效率:
DECLARE @Student tinyint
SELECT @Student = type_id
FROM type
WHERE type_code = 'student'
SELECT TOP 10 a, b
, @Student student
FROM something
這隻做一求,並增加了無以主查詢計劃:
除了更詳細的內容,如果你正在定義一個內聯表值函數,這意味着你還必須寫出一個隱含的返回模式,這是一個痛苦(並且爲錯誤添加了一個向量)。
有沒有什麼辦法可以寫一個只運行子查詢的查詢?
出於興趣,是它的TOP 10是造成這種現象?而且,如果是這樣,如果將TOP 10放入子查詢中,會發生什麼情況,然後使用不同的選項來「加入」/「附加」您的標量常量? – MatBailie
@MatBailie,*很有趣。 「TOP 0」只是爲了「簡化」這個例子,但它確實影響了結果。當我刪除它時,我確實會得到一個搜索,但它也增加了一個「表假脫機」,每行完成一次,總成本爲90%。所以很高興知道這會帶來意想不到的效果,但從接受的答案中得出的建議仍然比原來更簡單和更高效 - 按照我預期的方式行事。當「MWE」不夠「M」時,會發生這種情況! – harpo