9

外部 ID とローカル ID の間のマッピングであるテーブルがあります。

このテーブルが全単射であるかどうかを調べるクエリを作成する必要がありました。私はこれを思いついた

IF 1 <> ANY(
    SELECT COUNT(foreignId)
    FROM mappingTable
    GROUP BY localId
    )
BEGIN
    SELECT 'Oh noes!'
END

ELSE BEGIN
    SELECT 'Everything is fine.'
END

私の上司はこれを見て顔をしかめ、代わりにこれを書くべきだったと私に言いました:

IF EXISTS(
    SELECT NULL
    FROM mappingTable
    GROUP BY localId
    HAVING COUNT(foreignId) <> 1
    )
BEGIN
    SELECT 'Oh noes!'
END

ELSE BEGIN
    SELECT 'Everything is fine.'
END

私の質問は、これらのクエリのどちらがより良いスタイルであるかということです。私はそれらが同等であることを確信しています。

4

2 に答える 2

12

SQL Server 2008 でのテストでは、これらのクエリで同じ結果が得られるだけでなく、クエリ プランも同じであることがわかりました。クエリ オプティマイザーは、これらのクエリが同等であることを既に認識しています。したがって、一方を他方よりも優先する議論は、スタイルなどの他の側面に焦点を当てる必要があるというあなたの意見は正しい.

個人的には、2 番目のクエリの方が理解しやすいですが、最初のクエリの方が英語で検索を表現する方法により厳密に従っていEXISTSますANY。最初のクエリは、「待って、何? ああ、そうです...」と思わせてくれます。2 番目のクエリはすぐにわかります。他の人にとっては(おそらくあなたにとって)異なる場合があります。クエリが上司や同僚にとって読みやすいものであることを確認する必要があります。

于 2013-06-27T06:57:26.830 に答える
3

列にインデックスがあるかどうかに応じて、クエリは同じように悪いか、同じように良いです。

インデックスがない場合、すべての行のテーブル スキャン/クラスター化インデックス スキャンが行われ、その後に重複を削除するハッシュ マッチが行われます。

チェックしている列にインデックスがある場合、両方のクエリがそのインデックスを使用し、重複が見つかったときに早期に終了します。

インデックス付きのクエリ プラン:

ここに画像の説明を入力

インデックスなしのクエリ プラン:

ここに画像の説明を入力

于 2013-06-27T07:06:30.567 に答える