DatabaseOracle optimisation de calcul de la date de requête impliquant
Table1
Id
Table2Id
...
Table2
Id
StartTime
Duration //in hours
Recherche
select * from Table1 join Table2 on Table2Id = Table2.Id
where starttime < :starttime and starttime + Duration/24 > :endtime
Cette requête prend actuellement environ 2 secondes pour exécuter ce qui est trop long. Il y a un index sur les colonnes id et un index de fonction sur Start_time + duration/24 Dans Sql Developer, le plan de requête ne montre aucun index utilisé. La requête renvoie 475 lignes pour mes heures de début et de fin de test. Table2 a ~ 800k lignes Table1 a ~ 200k lignes
Si le calcul durée/24 est supprimé de la requête, remplacé par une valeur statique, le temps de requête est réduit de moitié. Cela ne récupère pas exactement les mêmes données, mais me laisse croire que la division est chère.
J'ai également testé l'ajout d'une colonne Endtime à Table2 qui est remplie avec (starttime + duration/24) La colonne était pré-remplie via une seule mise à jour, si elle était utilisée en production.
select * from Table1 join Table2 on Table2Id = Table2.Id
where starttime < :starttime and endtime > :endtime
Cette requête s'exécutera dans environ 600ms et utilisera un index pour la jointure. C'est moins qu'idéal en raison de la colonne supplémentaire avec des données redondantes.
Existe-t-il des méthodes pour rendre cette requête plus rapide?
D'après les requêtes affichées, vous récupérez tous les enregistrements du tableau 2 qui ne se trouvent PAS dans une plage donnée. Odd, mais d'accord. Vos statistiques sont-elles à jour? Peut-être que l'optimiseur a des informations erronées et qu'il choisit un mauvais plan? Quel problème essayez-vous de résoudre? Avez-vous besoin des données de Table2, ou est-ce que tout ce dont vous avez besoin dans le Tableau 1? Un commentaire sur la distribution des données? Version Oracle (il peut y avoir une fonctionnalité que vous pouvez/ne pouvez pas utiliser pour aider)? –
Les stats Oracle 10g sont à jour. J'ai eu la jointure en arrière, mauvaise traduction des vraies tables. –
Avez-vous au moins exécuté SQL * Plus AUTOTRACE, ou un EXPLAIN PLAN (mieux encore, l'événement de traçage 10046.) Pour régler une requête, il est important de savoir d'abord ce que fait Oracle. – spencer7593