Requête SQL Informix: deux requêtes similaires renvoyant des résultats différents

StackOverflow https://stackoverflow.com/questions/305306

  •  08-07-2019
  •  | 
  •  

Question

J'ai une requête SQL Informix qui renvoie un ensemble de lignes. Il a été légèrement modifié pour la nouvelle version du site sur lequel nous travaillons et notre service AQ a constaté que la nouvelle version renvoie des résultats différents. Après enquête, nous avons constaté que la seule différence entre deux requêtes concernait le nombre de champs renvoyés.

Les clauses FROM, WHERE et ORDER BY sont identiques et les noms de colonne de la partie SELECT n’affectent pas les résultats. Le problème était dû uniquement au nombre de champs.

Des idées?

Était-ce utile?

La solution 2

Le moteur SQL Informix utilise les index des tables en fonction des colonnes à récupérer. Lors de la récupération de différentes colonnes, nous utilisions différents index et obtenions donc les résultats dans un ordre différent.

Autres conseils

L'ajout de la directive join-order - + ORDERED résout le problème en vous permettant d'afficher vos résultats dans un ordre prévisible à chaque fois.

Les liens mènent à la description du fonctionnement de la directive. http : //publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp? topic = / com.ibm.sqls.doc / sqls1144.htm

  

Utilisez la directive de commande de jointure ORDERED   forcer l'optimiseur à joindre des tables   ou des vues dans l'ordre dans lequel ils   apparaissent dans la clause FROM du   requête.

SELECT --+ ORDERED
   name, title, salary, dname
FROM dept, job, emp WHERE title = 'clerk' AND loc = 'Palo Alto' 
   AND emp.dno = dept.dno 
   AND emp.job= job.job;

Je suppose que par "champs", vous entendez le nombre de lignes de données de sortie? D'après mon expérience, les gens utilisent les termes «champs» et «colonnes» comme synonymes. Étant donné que les noms figurant dans la liste de sélection n'ont pas changé, il est probable que vous n'obtenez que des différences dans le nombre de lignes renvoyées.

Étant donné les mêmes tables, données d'entrée et requête, la taille et le contenu de l'ensemble de résultats doivent être identiques, quels que soient le plan de requête ou la version du serveur. La séquence du jeu de résultats peut être différente sauf si vous imposez un ordre sur les résultats, mais cela est légitime dans n'importe quel SGBD.

Si vous obtenez différentes tailles d'ensembles de résultats, vous devriez probablement contacter le support technique IBM. Au moins un des ensembles de résultats est incorrect et les résultats erronés sont toujours graves.

Bien que des astuces puissent améliorer les performances et que le conseil standard consistant à "exécuter UPDATE STATISTICS (avec les jeux d'options appropriés)" soit généralement bénéfique, ni la présence ni l'absence d'index ne doivent modifier le jeu de résultats lorsque les données sous-jacentes sont stables. (Si les données changent, vous devrez vous préoccuper de nombreux problèmes et complications.)

Je ne peux penser qu'à deux explications à cela:

  1. Une fonction d'agrégat est utilisée, telle que COUNT (colonne DISTINCT) ou
  2. Les colonnes supplémentaires sélectionnées proviennent d'une table qui est jointe OUTER

Je comprends que vous ne souhaitiez pas publier les définitions SQL et de table, mais cela rend le diagnostic difficile.

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