Je passe par un certain code pl/sql sans commentaires. Essayer de donner un sens à cela et de l'optimiser. Voici l'exemple:Comment puis-je optimiser ces ensembles de requêtes Oracle
INSERT INTO gtt1 --75711 rows
(USER_ID, role_id, participant_code, status_id)
SELECT
r.user_id, r.role_id, r.participant_code, MAX(status_id)
FROM
user_role r,
cmp_role c
WHERE
r.role_id = c.role_id
AND r.participant_code IS NOT NULL
AND c.group_id = 3
GROUP BY
r.user_id, r.role_id, r.participant_code;
Puis
DELETE gtt1
WHERE ROWID IN (SELECT ROWID FROM gtt1
MINUS
SELECT a.ROWID FROM gtt1 a, UIV_CMP_USER_ROLE b
WHERE a.status_id = b.status_id
AND (b.ACTIVE = 1 OR (b.ACTIVE IN (0,3)
AND SYSDATE BETWEEN b.effective_from_date AND b.effective_to_date
)
)
);
enfin (ce qui prend le plus long)
OPEN cv_1 FOR
SELECT c.role_id,
c.subgroup,
c.subgroup_description,
COUNT(a.USER_ID) user_count
FROM
(SELECT b.user_id, b.role_id FROM gtt1 b, pt_user e
--pt_user table has 73000 rows
WHERE e.user_id = RTRIM(b.user_id)
) a
RIGHT OUTER JOIN CMP_ROLE c ON a.role_id = c.role_id
WHERE c.group_id = v_group_id
GROUP BY c.role_id,c.subgroup,c.subgroup_description
ORDER BY c.subgroup;
Y at-il une manière que je peux éviter la suppression de gtt1 et d'abord simplement obtenir des lignes nous vouloir?
Exécution expliquer le plan je constate des analyses complètes de table sur cette requête:
SELECT
r.user_id, r.role_id, r.participant_code, MAX(status_id)
FROM
user_role r,
cmp_role c
WHERE
r.role_id = c.role_id
AND r.participant_code IS NOT NULL
AND c.group_id = 3
GROUP BY
r.user_id, r.role_id, r.participant_code
HAVING MAX(status_id) IN (SELECT b.status_id FROM UIV_CMP_USER_ROLE b
WHERE (b.ACTIVE = 1 OR (b.ACTIVE IN (0,3)
AND SYSDATE BETWEEN b.effective_from_date AND b.effective_to_date
))
)
user_role = 803507 lignes
cmp_role = 27 lignes
user_role a 5 indices:
idx 1 = rôle_id
idx 2 = last_updt_user_id
idx 3 = actv_id, participant_code, effective_from_Date, effective_to_date
idx 4 = user_id, role_id, effective_from_Date, effective_to_date
idx 5 = participant_code, user_id, roke_id, actv_cd
Est-ce que gtt1 est toujours le même dans vos requêtes? Sont-ils des requêtes séquentielles? Peut-être que vous pourriez essayer de les écrire dans une seule requête au lieu de trois? –