ORACLE BIPUBLISHER SQL Запрос выполняется слишком долго - PullRequest
0 голосов
/ 19 февраля 2020

Ниже приведен запрос

Select
pu.username,
ROLE.ROLE_NAME,
(
CASE
WHEN ((ROLE.ORG_ID IS NOT NULL) AND ROLE.ORG_ID=fabuv.BU_ID) THEN FABUV.BU_NAME
WHEN ((ROLE.LEDGER_ID IS NOT NULL) AND ROLE.LEDGER_ID=gl.LEDGER_ID) THEN GL.NAME
WHEN ((ROLE.BOOK_ID IS NOT NULL) AND ROLE.BOOK_ID=fbc.BOOK_CONTROL_ID) THEN FBC.BOOK_TYPE_NAME
WHEN ((ROLE.SET_ID IS NOT NULL) AND ROLE.SET_ID=fssv.SET_ID) THEN FSSV.SET_NAME
WHEN ((ROLE.INV_ORGANIZATION_ID IS NOT NULL) AND ROLE.INV_ORGANIZATION_ID=iop.ORGANIZATION_ID) THEN IOP.ORGANIZATION_CODE
WHEN ((ROLE.CST_ORGANIZATION_ID IS NOT NULL) AND ROLE.CST_ORGANIZATION_ID=ccov.COST_ORG_ID) THEN CCOV.COST_ORG_CODE
WHEN ((ROLE.ACCESS_SET_ID IS NOT NULL) AND ROLE.ACCESS_SET_ID=gas.ACCESS_SET_ID) THEN GAS.NAME
WHEN ((ROLE.CONTROL_BUDGET_ID IS NOT NULL) AND ROLE.CONTROL_BUDGET_ID=xcb.CONTROL_BUDGET_ID) THEN XCB.NAME
WHEN ((ROLE.INTERCO_ORG_ID IS NOT NULL) AND ROLE.INTERCO_ORG_ID=fio.INTERCO_ORG_ID) THEN FIO.INTERCO_ORG_NAME
ELSE 'NOT_APPLICABLE'
END
) "Security_Context_Value"
from
fusion.per_users pu,
fusion.FA_BOOK_CONTROLS FBC,
fusion.FUN_ALL_BUSINESS_UNITS_V FABUV,
fusion.XCC_CONTROL_BUDGETS XCB,
fusion.CST_COST_ORGS_V CCOV,
fusion.gl_access_sets GAS,
fusion.FUN_INTERCO_ORGANIZATIONS FIO,
fusion.INV_ORG_PARAMETERS iOP,
fusion.GL_LEDGERS GL,
fusion.RCS_MFG_PARAMETERS RMP,
fusion.FUN_USER_ROLE_DATA_ASGNMNTS ROLE,
fusion.FND_SETID_SETS_VL FSSV
where
1=1
and pu.USERNAME=:Username
AND ROLE.ORG_ID != NULL
OR ROLE.LEDGER_ID != NULL
OR ROLE.BOOK_ID != NULL
OR ROLE.SET_ID != NULL
OR ROLE.INV_ORGANIZATION_ID != NULL
OR ROLE.CST_ORGANIZATION_ID != NULL
OR ROLE.ACCESS_SET_ID != NULL
OR ROLE.CONTROL_BUDGET_ID != NULL
OR ROLE.INTERCO_ORG_ID != NULL
And pu.USER_GUID=role.USER_GUID

Это запрос, необходимый для извлечения ролей, назначенных пользователям с Security_Context и Value. Я пробовал разные комбинации использования IS NOT NULL вместо '! =', Но это также не помогло, опять же, имя пользователя не учитывается при запуске.

1 Ответ

0 голосов
/ 19 февраля 2020

Я думаю, что вы ищете что-то вроде:

SELECT pu.username,
     role.role_name,
     CASE WHEN ROLE.ORG_ID IS NOT NULL THEN FABUV.BU_NAME
            WHEN ROLE.LEDGER_ID IS NOT NULL THEN GL.NAME
            WHEN ROLE.BOOK_ID IS NOT NULL THEN FBC.BOOK_TYPE_NAME
            WHEN ROLE.SET_ID IS NOT NULL THEN FSSV.SET_NAME
            WHEN ROLE.INV_ORGANIZATION_ID IS NOT NULL THEN IOP.ORGANIZATION_CODE
            WHEN ROLE.CST_ORGANIZATION_ID IS NOT NULL THEN CCOV.COST_ORG_CODE
            WHEN ROLE.ACCESS_SET_ID IS NOT NULL THEN GAS.NAME
            WHEN ROLE.CONTROL_BUDGET_ID IS NOT NULL THEN XCB.NAME
            WHEN ROLE.INTERCO_ORG_ID IS NOT NULL THEN FIO.INTERCO_ORG_NAME
            ELSE 'NOT_APPLICABLE'
       END "Security_Context_Value"
FROM   fusion.per_users pu
       INNER JOIN fusion.fun_user_role_data_asgnmnts role ON pu.user_guid = role.user_guid
       LEFT OUTER JOIN fusion.fun_all_business_units_v fabuv ON role.org_id = fabuv.bu_id
       LEFT OUTER JOIN fusion.gl_ledgers gl ON role.ledger_id = gl.ledger_id
       LEFT OUTER JOIN fusion.fa_book_controls fbc ON role.book_id=fbc.book_control_id
       LEFT OUTER JOIN fusion.fnd_setid_sets_vl fssv ON role.SET_ID=fssv.SET_ID
       LEFT OUTER JOIN fusion.inv_org_parameters iop ON role.inv_organization_id=iop.organization_id
       LEFT OUTER JOIN fusion.cst_cost_orgs_v ccov ON role.cst_organization_id=ccov.cost_org_id
       LEFT OUTER JOIN fusion.gl_access_sets gas ON role.access_set_id=gas.access_set_id
       LEFT OUTER JOIN fusion.xcc_control_budgets xcb ON role.control_budget_id=xcb.control_budget_id
       LEFT OUTER JOIN fusion.fun_interco_organizations fio ON role.interco_org_id=fio.interco_org_id
WHERE  pu.username = :username
AND    COALESCE(role.org_id,
                role.ledger_id,
                role.book_id,
                role.set_id,
                role.inv_organization_id,
                role.cst_organization_id,
                role.access_set_id,
                role.control_budget_id,
                role.interco_org_id) IS NOT NULL;

Обратите внимание на использование синтаксиса соединения ANSI, который заставляет вас добавлять условия объединения (если вы явно не запрашиваете перекрестное соединение).

Ваш исходный запрос выполнял перекрестное соединение между вашими таблицами fabuv, gl, fbc, et c, то есть каждая строка в fabuv была объединена со всеми строками в gl, и каждая из результирующих строк соединялась с каждой строкой в ​​таблице fbc и т. д. ... это партия строк - например, если в каждой из fabuv есть 100 строк, gl, fbc и т. Д. 1026 * таблиц, в итоге вы получите 100 x 100 x 100 x ... что в итоге окажется слишком большим количеством строк.

Я взял предположение о том, какими должны быть условия соединения, исходя из вашего оператора case - хотя на таблицу rmp вообще не ссылались, поэтому я исключил ее из предложения from.

Я также использовал функцию COALESCE, чтобы упростить ваше предложение where - эта функция возвращает первое ненулевое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...