14

たとえば、3 つのテーブルがあります:usergrouppermissionuser_groupsgroup_permissions

繰り返しなしで、特定のユーザーのすべての権限を選択する必要があります。同様の問題が発生するたびに、どのバージョンのクエリがより適切かを判断できません。

SELECT permisson_id FROM group_permission WHERE EXISTS(
    SELECT 1 FROM user_groups 
        WHERE user_groups.user_id = 42 
          AND user_groups.group_id = group_permission.group_id
)

SELECT DISTINCT permisson_id FROM group_permission
    INNER JOIN user_groups ON user_groups.user_id = 42 
           AND user_groups.group_id = group_permission.group_id 

説明に基づいて結論を出すのに十分な経験があります。最初のクエリにはサブクエリがありますが、私の経験では、最初のクエリの方が高速であることが示されています。おそらく、結果としてフィルタリングされたアクセス許可が多数になるためです。

この状況であなたはどうしますか?なんで?ありがとう!

4

1 に答える 1

17

DISTINCT ではなく EXISTS を使用する

DISTINCT を使用して重複行の表示を抑制することができます。EXISTS を使用して、サブクエリによって返される行の存在を確認します。DISTINCT は重複行を抑制する前に取得した行をソートするため、可能な限り、DISTINCT ではなく EXISTS を使用する必要があります。

あなたの場合、多くの重複データがあるはずなので、存在する方が速くなるはずです。

http://my.safaribooksonline.com/book/-/9780072229813/high-performance-sql-tuning/ch16lev1sec10による

于 2012-08-30T17:07:27.327 に答える