ポップクイズ、SQL Serverホットショット:1つのクエリ内で「一定」の検索を効率的に行うことはできますか?
student
サブクエリは何回実行されますか? (少なくとも10行が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
これが唯一のシーク、およびメインクエリプランに何も加えないん
さらに冗長であることに加えて、インラインのテーブル値関数を定義している場合、暗黙のリターンスキーマも作成する必要があります。これは痛みです(エラーのベクトルを追加します)。
サブクエリを1回だけ実行する1つのクエリを書く方法はありますか?このクエリの
、それはこの動作を引き起こしてTOP 10のですか?そしてもしそうなら、TOP 10をサブクエリに入れて、あなたのスカラー定数に 'join'/'append'するために異なるオプションを使用するとどうなりますか? – MatBailie
@MatBailie、それは*面白いです。 「TOP 0」は例を「単純化」するだけでしたが、結果に影響を与えました。私がそれを取り除くと、実際には1つのシークが得られますが、全体の90%のコストで各行に1回実行される「テーブルスプール」も追加されます。これは予期せぬ効果があることを知っているのは良いことですが、受け入れられた答えからの提案は、もともとより簡単で効率的なものになりました。それは、 "MWE"がかなり "M"ではない場合に起こります! – harpo