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

voix
15

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

- SQL Server 2000

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

- SQL Server 2005

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

Si oui, ce que vous avez fait?

Abandonné? Convaincu que le client de simplifier leurs demandes? Dénormaliser la base de données?


@ (Tout le monde me voulant poster la requête):

  1. Je ne sais pas si je peux coller 70 kilo-octets de code dans la fenêtre d'édition de réponse.
  2. Même si je peux le cela ne contribue pas depuis ces 70 kilo-octets de code de référence 20 ou 30 vues que j'aurais aussi poster sinon le code sera dénué de sens.

Je ne veux pas sonner comme je vantais ici, mais le problème est pas dans les requêtes. Les requêtes sont optimales (ou au moins presque optimale). J'ai passé d'innombrables heures à les optimiser, à la recherche de chaque colonne et à chaque table unique qui peut être enlevé. Imaginez un rapport qui a 200 ou 300 colonnes qui doit être rempli avec une seule instruction SELECT (parce que c'est la façon dont il a été conçu il y a quelques années quand il était encore un petit rapport).

Créé 05/08/2008 à 15:54
source utilisateur
Dans d'autres langues...                            


8 réponses

voix
8

Pour SQL Server 2005, je vous recommande d'utiliser les variables de table et la construction en partie les données que vous allez.

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

Ensuite, trouvez votre table primaire (par exemple la table des commandes dans votre exemple ci-dessus) et tirez ces données, plus un peu de données supplémentaires qui disent qu'une jointure loin (nom du client, le nom du produit). Vous pouvez faire un SELECT INTO pour mettre ce droit dans votre variable de table.

De là, itérer la table et pour chaque ligne, faire un tas de petites requêtes SELECT qui récupère toutes les données supplémentaires dont vous avez besoin pour votre jeu de résultats. Insérez ces derniers dans chaque colonne que vous allez.

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

Je n'ai pas de chiffres pour cela, mais il y a eu trois cas distincts que j'ai travaillé à ce jour où faire ces petites requêtes a effectivement travaillé plus vite que faire une requête de sélection massive avec un tas de jointures.

Créé 05/08/2008 à 16:19
source utilisateur

voix
1

Ce serait le cas tout le temps lors de la rédaction Reporting Services rapports pour les installations Dynamics CRM en cours d' exécution sur SQL Server 2000. CRM dispose d' un schéma de données bien normalisé qui se traduit par un grand nombre de jointures. Il y a en fait un correctif autour de cette volonté jusqu'à la limite de 256 à une somme exorbitante 260: http://support.microsoft.com/kb/818406 (nous avons toujours pensé à ceci une grande blague de la part de l'équipe SQL Server).

La solution, comme aludes Darlie-O à, est d'identifier appropriée « sous-joint » (de préférence ceux qui sont utilisés plusieurs fois) et les factoriser dans les variables temp-table que vous utilisez alors dans votre principale joint. Il est une grande PIA et tue souvent la performance. Je suis désolé pour toi.

@ Kevin, l'amour que tee - dit tout :-).

Créé 02/11/2008 à 16:50
source utilisateur

voix
1

@chopeen Vous pouvez changer la façon dont vous calculez ces statistiques, et au lieu de garder une table séparée de toutes les statistiques par produit .. quand une commande est passée, boucle à travers les produits et mettre à jour les dossiers appropriés dans le tableau des statistiques. Cela changerait beaucoup de la charge de calcul à la page de paiement plutôt que tout fonctionne dans une requête énorme lors de l'exécution d'un rapport. Bien sûr, il y a des statistiques qui ne vont pas fonctionner aussi bien cette façon, par exemple le suivi des prochains achats des clients après l'achat d'un produit particulier.

Créé 05/08/2008 à 16:19
source utilisateur

voix
1

Je ne l'ai jamais rencontré ce genre de situation, et pour être honnête l'idée de référencement> 256 tables dans une requête me PIF avec une crainte mortelle.

Votre première question devrait probablement par « Pourquoi tant? », Suivi de près par « ce que les bits d'information dois - je pas besoin? » Je serais inquiet que la quantité de données de retour d'une telle requête commencerait à influer sur les performances de l'application tout à fait sérieusement, aussi.

Créé 05/08/2008 à 15:57
source utilisateur

voix
0

Eu le même problème dans SQL Server 2005 (a travaillé en 2008) quand je voulais créer une vue. Je résolu le problème en créant une procédure stockée au lieu d'une vue.

Créé 07/03/2012 à 16:59
source utilisateur

voix
0

J'ai eu ce même problème ... ma boîte de développement exécute SQL Server 2008 (le point de vue a bien fonctionné), mais sur la production (avec SQL Server 2005) le point de vue n'a 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 jeté l'erreur.

Type de considérer stupide l'exécution logique est la même ...

Créé 19/08/2010 à 18:29
source utilisateur

voix
0

Poster la requête: D

Aussi je me sens comme l'un des problèmes possibles pourrait être d'avoir une tonne (lire 200+) des tables nom / valeur qui pourrait condensées dans une table de consultation unique.

Créé 05/08/2008 à 16:26
source utilisateur

voix
0

Je voudrais voir cette requête, mais je pense qu'il est un problème avec une sorte de iterator, et alors que je ne peux pas penser à toutes les situations où il est possible, je parie que c'est d'un mauvais tout / cas / curseur ou une tonne de vues mal mises en œuvre.

Créé 05/08/2008 à 15:58
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more