1

私はストアド プロシージャに取り組んでおり、ある時点でテーブル変数をチェックして、特定のフィールドが null に等しい行がまったくないかどうかを確認したいと考えています。つまり、テーブルのすべての行で、このフィールドには null 以外の値があります。count() をチェックするのではなく、EXISTS を使用して実行したいと思います。

現在、私はこれをやっています:

IF EXISTS ( SELECT * FROM @sometable where somefield IS NULL ) 
       SET @somefield = @somefield /* just a way to skip this */
ELSE
       /* perform some logic */

これで、NOT EXISTS を使用できることがわかりましたが、NOT EXISTS は EXISTS よりもはるかに遅いと思います。私は最近、Exists句でやりたいことをする方法の例を持っている何かを読んだことを誓いますが、それを見つけることができず、ブックマークするのを怠りました。多分私は間違っていますが。

if/else を設定する理由は、私の理解では、EXISTS が NOT EXISTS の前に返されるためです。これは非常に集中的なストアド プロシージャ (非常に頻繁に呼び出され、場合によっては一括で呼び出される) であるため、ここで処理を節約したいと考えています。

たぶん、私はこれをすべて間違って見ているか、何かを間違って想定しています。私は学ぶためにここにいるので、間違っている場合は正しい方向に向けてください。

編集:明らかに、このコンテキストに違いはありません(where句/サブクエリの一部ではありません)。しかし、where 句で exists を使用していて、特に問題のテーブルに何千もの行がある可能性がある場合に、上記の正確なシナリオ (フィールド内のすべての非 null 値) を確認したいとします。[SO にとって初めてのことです。これを独自の質問として投稿する必要がある場合は、お知らせください]

4

2 に答える 2

3

この形式の EXISTS または NOT EXISTS は、行が見つかると停止し、必要に応じて true/false を返します。

IF はそれに応じてジャンプし、ここで最適化することはあまりありません...

于 2010-11-05T11:30:35.373 に答える
0

NOT EXISTS同じ時間EXISTSがかかるはずです。どちらか一方は、最初にもう一方を計算し、結果を否定することによって導き出すことができます。

于 2010-11-05T11:30:24.470 に答える