Как повысить производительность SQL-запроса в БД Oracle - PullRequest
0 голосов
/ 24 декабря 2018

одна из вкладок не работает в приложении (при нажатии на эту вкладку она продолжает вращаться и вызывать конкретную службу, а через некоторое время выдает ошибку 404).мы создали индексы для нескольких столбцов в базе данных приложений, чтобы посмотреть, не улучшает ли это производительность.Создание индексов не имело большого значения.

поэтому мы планировали переписать 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 записей.

1 Ответ

0 голосов
/ 24 декабря 2018

Перестроенный в стиле, который легче читать (по крайней мере, мне), я получаю это:

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'

Сколько одобряющих пользователей имеют значение null account_id?Для любого из них вы получаете все учетные записи в системе.Это на самом деле бизнес-требование?Я не уверен, что это имеет какой-либо смысл.Запрос больше не использует эту таблицу, поэтому, возможно, вы сможете полностью удалить соединение account.

...