|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 37 ![]() |
J'essaie désespérément d'exécuter une requête - plutôt basique - en espérant la voir passer par un index, et, quelque soit le sens je n'y parviens pas. J'utilise une base Oracle 8i sur Unix 5.2 voici le code : Code :
sur Toad, j'obtiens l'Explain Plan suivant : Code :
la table tb_o_ent_tkv possède 16 M lignes et les indexes sont les suivants : IX_ENT_TKV_ID_COL (CD_ENT_TKV_ID_COL) IX_FK_ENT_TKV_EMP (ID_EMP) IX_FK_ENT_TKV_TPS_JOU (ID_TPS_JOU) PK_ENT_TKV (ID_ENT_TKV) la table tb_o_lig_tkv, quant à elle, dispose de 19,6 M lignes et les indexes sont les suivants : IX_FK_LIG_TKV_UVC (ID_UVC) IX_LIG_TKV_ID_ENT (ID_ENT_TKV) IX_LIG_TKV_TYP_ENT (CD_LIG_TKV_TYP, ID_ENT_TKV) PK_LIG_TKV (ID_LIG_TKV) j'ai tenté d'ajouter des commandes du type /*+ leading (ODS.TB_O_LIG_TKV IX_LIG_TKV_ID_ENT) */ afin de forcer l'utilisation de l'index... ...mais rien n'y fait. |
||||
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
les stats sont à jour, il y a une FK entre les 2 tables ? T'as essayé le hint INDEX ?
|
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
L'optimiseur considère que le critère sur la date ramènera 796 000 lignes de ta table TB_O_ENT_TKV. En conséquence, il considère qu'il n'est pas rentable de faire 796 000 accès par index et préfère une methode plus efficace qui est l'acces complet suivi de HASH.
Si ton critère sur la date est beaucoup plus discriminant que ça alors tu as 2 solutions: - Faire un histograme sur la colonne TB_O_ENT_TKV.ID_TPS_JOU - Forcer la boucle plutot que le HASH par le HINT /*+ USE_NL (TB_O_ENT_TKV TB_O_LIG_TKV) */ Mais attention le passage par l'index ne veut pas forcément dire que ce sera le plus efficace, tout dépend de la selectivité de la clause sur la date. |
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
ça peut valoir le coup de vérifier la hash_area_size aussi
Pour tester rapidement tu peux faire un Code :
ALTER SESSION SET hash_join_enabled = FALSE |
|
|
00
|
|
|
#5 | |
|
Invité régulier
![]() Inscription : septembre 2006 Messages : 37 ![]() |
Citation:
je vais essayer le Hint de rémi4x : /*+ USE_NL (TB_O_ENT_TKV TB_O_LIG_TKV) */ ça devrait limiter la requête à deux millions de lignes (si ça marche !) Je vais aussi lancer la commande de fred : ALTER SESSION SET hash_join_enabled = FALSE |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com