La requête:Pourquoi cette requête effectue-t-elle une analyse de table complète?
SELECT tbl1.*
FROM tbl1
JOIN tbl2
ON (tbl1.t1_pk = tbl2.t2_fk_t1_pk
AND tbl2.t2_strt_dt <= sysdate
AND tbl2.t2_end_dt >= sysdate)
JOIN tbl3 on (tbl3.t3_pk = tbl2.t2_fk_t3_pk
AND tbl3.t3_lkup_1 = 2577304
AND tbl3.t3_lkup_2 = 1220833)
where tbl2.t2_lkup_1 = 1020000002981587;
Faits:
- Oracle XE
- tbl1.t1_pk est une clé primaire.
- tbl2.t2_fk_t1_pk est une clé étrangère sur cette colonne t1_pk.
- tbl2.t2_lkup_1 est indexé.
- tbl3.t3_pk est une clé primaire.
- tbl2.t2_fk_t3_pk est une clé étrangère sur cette colonne t3_pk.
Expliquer le plan sur une base de données avec 11.000 lignes tbl1 et 3500 lignes tbl2 montre qu'il est fait un scan de table sur tbl1. Semble à moi que il devrait être plus rapide s'il pourrait faire une requête d'index sur tbl1. Expliquer le plan sur une base de données avec 11 000 lignes dans tbl1 et 3500 lignes dans tbl2 montre qu'il effectue une analyse de table complète sur tbl1. Semble à moi que il devrait être plus rapide s'il pourrait faire une requête d'index sur tbl1.
Mise à jour: J'ai essayé l'indice que quelques-uns d'entre vous ont suggéré, et le coût de l'explication a été bien pire! Maintenant, je suis vraiment confus.
nouvelle mise à jour: J'ai finalement eu accès à une copie de la base de données de production, et « expliquer le plan » montré à l'aide d'index et une requête de coût beaucoup plus faible. Je suppose que d'avoir plus de données (plus de 100 000 lignes dans tbl1 et 50 000 lignes dans tbl2) étaient ce qu'il fallait pour lui faire décider que les index valaient la peine. Merci à tous ceux qui ont aidé. Je pense toujours que le réglage des performances d'Oracle est un art noir, mais je suis content que certains d'entre vous le comprennent.
Mise à jour supplémentaire: J'ai mis à jour la question à la demande de mon ancien employeur. Ils n'aiment pas que leurs noms de table apparaissent dans les requêtes Google. J'aurais du être mieux informé.
Est-ce une sorte de sadique en choisissant les noms des tables et des colonnes? Ou est-ce le résultat d'un code obfuscator? –
Ce n'est pas vraiment un plan d'explication "complet". AutoTrace dans SQLPlus donne beaucoup plus d'informations. –
Ce sont quelques-uns des pires noms de table que j'ai vu depuis un moment. – Kibbee