Pourquoi est-Oracle si lent lorsque je passe la java.sql.L'horodatage pour une colonne de DATE?

J'ai une table avec un DATE colonne avec le temps (comme d'habitude dans Oracle puisqu'il n'y a pas un TIME type). Quand j'ai une requête que la colonne de JDBC, j'ai deux options:

  • Convertir manuellement les valeurs d'Oracle to_date()
  • Utiliser un java.sql.Timestamp

Les deux approches de travail et ont des zones exclusives de hideux. Mon problème est quand je suis SELECTing données. Voici deux exemples de requêtes:

select *
from TABLE
where TS between {ts '2009-12-08 00:00:00.000'} and {ts '2009-12-09 00:00:00.000'}

select *
from TABLE
where TS between trunc({ts '2009-12-08 00:00:00.000'}) and trunc({ts '2009-12-09 00:00:00.000'})

Les deux requêtes de travail, les mêmes résultats et produit exactement le même résultat dans EXPLAIN PLAN. Ce droit index sont utilisés.

Requête ne fonctionne 15 minutes, tandis que la deuxième requête prend 0.031 s. Pourquoi est-ce? Est-il un lieu central pour résoudre ce problème ou dois-je vérifier toutes mes requêtes pour cet article et de faire absolument sûr que la trunc() est là? Comment puis-je résoudre ce problème lorsque j'ai besoin de sélectionner jusqu'à une certaine deuxième?

[MODIFIER] La table est partitionnée et je suis sur Oracle 10.2.0.

  • Est votre table partitionnée? Oracle JDBC ne semble pas utiliser la partition de l'élagage lorsque vous définissez les paramètres comme Timestamp, pour des raisons que je n'ai jamais compris.
  • Oui, c'est partitionnée.
  • +1 j'aimerais comprendre aussi. Cela se produit uniquement sur une immense table?
  • Eh bien, je suppose que vous ne remarquerez même pas avec une petite table 🙂
  • Comme vous l'avez noté, à l'aide de l' {ts "} syntaxe de votre code de base de données agnostiques, mais est-il une façon de savoir ce que SQL est vraiment passé à la base de données? Et comment est-il important d'être de la base de données agnostique? Si vous pouviez poster le PLAN d'EXPLIQUER les résultats que nous pourrions être en mesure de mieux comprendre ce qui se passe.
  • Bob: Expliquer le plan montre les mêmes résultats, même lorsque j'utilise TO_DATE().