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

Traductions disponibles Traductions disponibles
Numéro d'article: 295037 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F295037
N° DE BOGUE : 351918 (SHILOH_BUGS)
Agrandir tout | Réduire tout

Sommaire

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 Northwind
    go
    select top 1 * from
    (
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders union all
    select orderid from orders 
    union all select orderid from orders
    ) xx
    order 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

Numéro d'article: 295037 - Dernière mise à jour: vendredi 7 novembre 2003 - Version: 3.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft SQL Server 2000 Standard
Mots-clés : 
kbbug kbfix kbsqlserv2000bug kbsqlserv2000sp1fix KB295037
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com