CORRECTIF : MERGE UNION n'est pas utilisé avec un grand nombre de clauses UNION

Ancien nº de publication de cet article : F295037
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
N° DE BOGUE : 351918 (SHILOH_BUGS)
Symptômes
Des requêtes utilisant plus de 20 branches d'une clause UNION ALL sont exécutées avec une union HASH, et non pas avec MERGE UNION, ce qui provoque l'utilisation excessive de la mémoire et peut entraîner l'échec de la requête. Il en résulte qu'une vue partitionnée s'exécutant sur 24 noeuds possède des plans différents et moins efficaces qu'une vue sur 20 noeuds.
Résolution
Pour résoudre ce problème, procurez-vous le dernier Service Pack de SQL Server 2000. Pour plus d'informations, consultez l'article suivant dans la Base de connaissances Microsoft :
290211 INF : Procédures pour obtenir le dernier Service Pack de SQL Server 2000
Contournement
L'utilisation d'un paramètre de requête MERGE UNION résoudra ce problème. Testez soigneusement les conseils de l'optimisateur avant de mettre le code en production.
Statut
Microsoft a confirmé l'existence de ce problème dans SQL Server 2000. Ce problème a été corrigé dans le Service Pack 1 pour SQL Server 2000.
Plus d'informations

Procédure pour reproduire le comportement

  1. Ouvrez une fenêtre dans l'Analyseur de requêtes.
  2. Dans le menu Requête, sélectionnez Afficher le plan d'exécution.
  3. Exécutez la requête suivante :
    use Northwindgoselect top 1 * from(select orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union allselect orderid from orders union all select orderid from orders) xxorder by orderid
  4. Cliquez sur l'onglet Plan d'exécution et observez les résultats.
  5. Mettez en commentaire la ligne suivante de la requête :
    union all select orderid from orders
  6. Exécutez la requête modifiée et observez la différence du plan dans l'onglet Plan d'exécution.
Propriétés

ID d'article : 295037 - Dernière mise à jour : 01/16/2015 22:17:18 - Révision : 3.1

  • Microsoft SQL Server 2000 Standard
  • kbnosurvey kbarchive kbbug kbfix kbsqlserv2000bug kbsqlserv2000sp1fix KB295037
Commentaires