1

このクエリを最適化したい

    **SELECT * FROM Users WHERE Active = 1 AND UserId IN (SELECT UserId FROM Users_Roles WHERE RoleId IN (SELECT RoleId FROM Roles WHERE PermissionLevel >= 100)) ORDER BY LastName**

上記のクエリを以下のように結合に置き換えると、実行時間が短縮されました。

     **SELECT  u.* FROM Users u INNER JOIN Users_Roles ur ON (u.UserId = ur.UserId) INNER JOIN Roles r ON  (r.RoleId = ur.RoleId) WHERE u.Active = 1  AND r.PermissionLevel > 100 GROUP BY u.UserId ORDER BY u.LastName**

しかし、私のロールテーブルにはすべてのユーザーに対して複数のエントリがあるため、上記のクエリでは重複したレコードが返されます。

SELECT( * ) FROM を SELECT COUNT(*) FROM に置き換えてカウントを見つけ、ページネーションのカウントを見つけてから、カウントクエリと結果クエリを実行する関数があるため、DISTINCTを使用できません

count と GROUP BY を一緒に使用すると、不適切な出力になることが既にわかっています。

今、私はクエリを最適化したいので、行数、つまりクエリの数を見つける必要があります。結果を見つけるためのより良い方法を教えてください。

4

1 に答える 1

2

スキーマ、インデックス化されているもの、インデックス化されていないもの、データの量、DBMS などを完全に知らずに、他の人々のクエリを最適化することは困難です。これを使用しても、実行計画や IO 統計などを確認することはできません。これを念頭に置いて、以下はあなたがすでに持っているものより良くないかもしれませんが、あなたの状況でクエリを書く方法です.

SELECT  u.* 
FROM    Users u
        INNER JOIN 
        (   SELECT  ur.UserID
            FROM    Users_Roles ur
                    INNER JOIN Roles r
                        ON r.RoleID = ur.RoleID
            WHERE   r.PermissionLevel > 100 
            GROUP BY ur.UserID
        ) ur
            ON u.UserId = ur.UserId
WHERE   u.Active = 1  
ORDER BY u.LastName
于 2012-07-20T09:45:26.140 に答える