Avez-vous déjà rencontré une requête que SQL Server n'a pas pu exécuter car elle faisait référence à trop de tables ?

Avez-vous déjà vu l'un de ces messages d'erreur ?

-- SQL Server 2000

Impossible d'allouer une table auxiliaire pour la résolution de la vue ou de la fonction.
Le nombre maximum de tables dans une requête (256) a été dépassé.

-- SQL Server 2005

Trop de noms de table dans la requête. Le maximum autorisé est 256.

Si oui, qu'avez-vous fait ?

Abandonné ? Convaincu le client de simplifier ses demandes ? Dénormalisé la base de données ?

@(tous ceux qui veulent que je poste la requête) :

  1. Je ne sais pas si je peux coller 70 Ko de code dans la fenêtre d'édition des réponses.
  2. Même si je peux le faire, cela ne servira à rien puisque ces 70 Ko de code feront référence à 20 ou 30 vues que je devrais également publier, sinon le code n'aura aucun sens.

Je ne veux pas avoir l'air de me vanter ici, mais le problème ne réside pas dans les requêtes. Les requêtes sont optimales (ou du moins presque optimales). J'ai passé d'innombrables heures à les optimiser, à rechercher chaque colonne et chaque tableau pouvant être supprimés. Imaginez un rapport de 200 ou 300 colonnes qui doit être rempli avec une seule instruction SELECT (parce que c'est comme ça qu'il a été conçu il y a quelques années quand c'était encore un petit rapport).

请先 登录 后评论

5 réponses

Shawn

J'aimerais voir cette requête, mais j'imagine que c'est un problème avec une sorte d'itérateur, et bien que je ne puisse penser à aucune situation où c'est possible, je parie que cela vient d'un mauvais moment/cas/curseur ou une tonne de vues mal implémentées.

请先 登录 后评论
pix0r

@chopeen Vous pouvez modifier la façon dont vous calculez ces statistiques et conserver à la place un tableau séparé de toutes les statistiques par produit. Lorsqu'une commande est passée, parcourez les produits et mettez à jour les enregistrements appropriés dans le tableau des statistiques . Cela déplacerait une grande partie de la charge de calcul vers la page de paiement plutôt que de tout exécuter dans une énorme requête lors de l'exécution d'un rapport. Bien sûr, certaines statistiques ne fonctionneront pas aussi bien de cette façon, par exemple. suivre les prochains achats des clients après l'achat d'un produit particulier.

请先 登录 后评论
Dillie-O

Pour SQL Server 2005, je vous recommande d'utiliser des variables de table et de créer partiellement les données au fur et à mesure.

Pour ce faire, créez une variable de table qui représente votre jeu de résultats final que vous souhaitez envoyer à l'utilisateur.

Ensuite, trouvez votre table principale (disons la table des commandes dans votre exemple ci-dessus) et extrayez ces données, ainsi qu'un peu de données supplémentaires qui ne sont qu'à une jointure (nom du client, nom du produit). Vous pouvez faire un SELECT INTO pour mettre cela directement dans votre variable de table.

À partir de là, parcourez la table et pour chaque ligne, effectuez un ensemble de petites requêtes SELECT qui récupèrent toutes les données supplémentaires dont vous avez besoin pour votre ensemble de résultats. Insérez-les dans chaque colonne au fur et à mesure.

Une fois terminé, vous pouvez alors faire un simple SELECT * à partir de votre variable de table et renvoyer cet ensemble de résultats à l'utilisateur.

Je n'ai pas de chiffres concrets pour cela, mais il y a eu trois cas distincts sur lesquels j'ai travaillé jusqu'à présent où ces petites requêtes ont en fait fonctionné plus rapidement que de faire une requête de sélection massive avec un tas de jointures.< /p>

请先 登录 后评论
Shawn

Publier la requête :D

De plus, j'ai l'impression que l'un des problèmes possibles pourrait être d'avoir une tonne (lire 200) de tables de noms/valeurs qui pourraient être condensées en une seule table de recherche.

请先 登录 后评论
LeRoy DeNooyer

J'ai eu le même problème... ma boîte de développement exécute SQL Server 2008 (la vue fonctionnait bien) mais en production (avec SQL Server 2005), la vue ne fonctionnait pas. J'ai fini par créer des vues pour éviter cette limitation, en utilisant les nouvelles vues dans le cadre de la requête dans la vue qui a généré l'erreur.

Un peu idiot étant donné que l'exécution logique est la même...

请先 登录 后评论