应用程序中的一个选项卡已损坏(当按下该选项卡时,它将继续旋转并调用特定服务,并在一段时间后出现404错误)。我们为Application DB中的几列创建了索引,以查看是否可以提高性能。创建索引并没有太大的区别。
所以我们计划重写sql查询以提高性能并修复它。
select distinct
editedUser.*
from
users editedUser,
relationship_ref editedUserRelationship,
users approvingUser,
user_role approvingUserRoles,
role_permission approvingUserRolePermissions,
account approvingUserAccount
where
approvingUser.user_id = 175263
and approvingUser.user_id = approvingUserRoles.user_id
and approvingUserRoles.role_id = approvingUserRolePermissions.role_id
and approvingUserRoles.user_role_status_id = 2
and editedUserRelationship.relationship_id =
editedUser.submitted_relationship_id
and (approvingUser.account_id = approvingUserAccount.account_id
or approvingUser.account_id is null)
and editedUser.review_status = 'R'
and approvingUserRolePermissions.permission_id =
editedUserRelationship.view_pending_permission_id;
这将近6分钟。因此,请在此查询中建议如何使用正确的联接。它具有36列和30,000条记录。
答案 0 :(得分:1)
以一种更易于阅读的样式(至少对我来说)重新排列,我得到了:
select distinct ed.*
from users ap
join user_role ro
on ro.user_id = ap.user_id
join account ac
on ac.account_id = ap.account_id or ap.account_id is null
join role_permission rp
on rp.role_id = ro.role_id
join relationship_ref re
on re.view_pending_permission_id = rp.permission_id
join users ed
on ed.submitted_relationship_id = re.relationship_id
where au.user_id = 175263
and ro.user_role_status_id = 2
and ed.review_status = 'R'
多少个批准用户的空account_id
?对于其中任何一个,您都将检索系统中的所有帐户。这实际上是业务要求吗?我不确定这是否有意义。该查询不再使用该表,因此您可以完全删除account
连接。