2016-12-01 84 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.002s – TBowman

+1

非常感謝! – TBowman