2016-12-01 10 views
0

このクエリの実行には20〜40秒かかります。私はできるだけそれを大きくスピードアップする必要があります。この複雑なクエリをより速く実行させるにはどうすればよいですか?

SELECT DISTINCT a.category, a.key 
FROM system_permissions AS a, system_permission_to_role AS b, 
system_user_to_role AS c, system_users AS d 
WHERE 
( 
    ( 
     a.system_permission_id=b.system_permission_id 
     AND (b.system_role_id=c.system_role_id || c.system_role_id = 0) 
     AND a.system_permission_id NOT IN ( 
      SELECT system_permission_id FROM system_permission_exclusions AS f 
      WHERE d.system_user_id=f.system_user_id 
     ) 
     AND c.system_user_id=d.system_user_id 
    ) 
    OR a.system_permission_id IN ( 
     SELECT system_permission_id 
     FROM system_permission_inclusions AS g 
     WHERE d.system_user_id=g.system_user_id 
    ) 
) 
    AND d.ldap_objectguid = '?'; 

このようにそれをやって背後にある理由は、私は私が役割の一部ですが、中に存在するものを排除する必要があるので、まず、標準定義された役割の範囲外の権限の除外とインクルージョンのテーブルを作成していますということです除外テーブルを作成したら、役割の一部ではないが包含テーブルに存在するものを追加する必要があります。

私はテーブルを再設計するという考え方にもオープンしています。

+0

まず、クエリの実行計画を確認してください。 – randominstanceOfLivingThing

+0

私はあなたがそのことを意味するのか分かりません。私は質問をはっきりと表現し、コードを完全に投稿したと思ったときに私の質問に否定的な評価(ハッ?質問。 – TBowman

+0

質問は私には合理的だと思う。一部の人はちょうどお尻です。 – CptMisery

答えて

1

これは機能しますか?

SELECT DISTINCT P.category, P.key 
FROM system_users U 
LEFT OUTER JOIN system_permission_inclusions PI ON PI.system_user_id = U.system_user_id 
INNER JOIN system_user_to_role UR ON UR.system_user_id = U.system_user_id 
INNER JOIN system_permission_to_role PR ON PR.system_role_id = UR.system_role_id 
INNER JOIN system_permissions P ON P.system_permission_id = PR.system_permission_id OR P.system_permission_id = PI.system_permission_id 
WHERE U.ldap_objectguid = '?' 
    AND P.system_permission_id NOT IN (SELECT system_permission_id FROM system_permission_exclusions WHERE system_user_id = U.system_user_id) 
+0

うわー!右の銃から! 影響を受ける行:0 時間:0.002秒 – TBowman

+1

ありがとうございました! – TBowman

関連する問題