Question

J'ai 98W lignes de données.Quand je veux trier mes données avec pub_time, j'ai trouvé un intérêt d'intérêt.

Voici le SQL:

select * 
from t_p_blog_article_info t  
order by t.pub_time desc

Cela coûte 19 ans.

select * 
from t_p_blog_article_info t 
where t.pub_time > to_date( '1900-01-01 01:00:00', 'yyyy-mm-dd   hh24:mi:ss ')  
order by t.pub_time desc

Cela coûte 0,2s.

Je veux savoir, pourquoi?

Était-ce utile?

La solution

Vous avez probablement un index sur pub_time sur votre table.

Par conséquent, la deuxième requête peut utiliser cet index pour ne renvoyer que ces enregistrements avec des dates non nulles après la date spécifiée, alors que la première requête doit interroger toute la table.

Autres conseils

Il existe une gamme de possibilités. Vous pouvez filtrer un grand nombre de lignes avec des dates invalides / nulles dans PUB_TIME, mais je doute que vous ne voudriez pas remarquer / mentionner un nombre important de ceux-ci.

Les trois choses qui sortent dans mon esprit sont les suivantes:

1 - vous avez un index ou un index composite impliquant pub_time, et la restriction de votre clause où la clause est déclenchant l'utilisation d'un chemin d'accès différent

2 - Vous n'avez eu aucune statistique disponible pour l'optimiseur lorsque vous avez exécuté votre première requête. Lors de l'exécution de la deuxième requête, un meilleur chemin d'accès a été sélectionné grâce à une mise en cache d'informations qui s'est produite lors de la première requête. Cela peut être vérifié en exécutant la première requête quelques fois de plus et en voyant s'il y a une amélioration significative des performances.

3 - similaire au premier point, l'optimiseur pourrait simplement sélectionner un meilleur chemin d'accès basé uniquement sur les implications de la clause WHERE. Donner peut-être l'indice que les valeurs nulles / invalides ne devront pas être manipulées sont suffisantes - votre système pourrait éviter une ou plusieurs analyses de table complètes à éliminer invalide / null pub_times.

identifier les raisons des choses comme ceci devient rapidement une entreprise empirique - il est difficile pour moi de dire plus sans connaître votre plate-forme et votre version. À partir de la balise, je suppose que vous utilisez Oracle, auquel cas vous devriez pouvoir utiliser une forme de "Expliquer la requête" ou "Expliquer le plan" pour obtenir un meilleur sentiment de ce qui se passe. Pour plus d'informations sur Oracle Optimizer, voir http://docs.oracle .com / cd / b10500_01 / serveur.920 / a96533 / optimops.htm (ceci est pour Oracle 9i V9.2, mais il a une explication décente des concepts indépendants de la version)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top