Avez-vous jamais rencontré une requête SQL Serveur n'a pas pu exécuter parce qu'il référencés trop de tables?

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

Question

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

-- SQL Server 2000

Ne peut pas allouer les accessoires de table pour la vue ou de la fonction de résolution.
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 de 256.

Si oui, qu'avez-vous fait?

Abandonné?Convaincu le client afin de simplifier leurs revendications?Dénormalisée la base de données?


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

  1. Je ne suis pas sûr si je peux coller 70 kilo-octets de code dans la réponse à la fenêtre d'édition.
  2. Même si je peux ce n'est pas aider depuis ces 70 kilo-octets de code de référence de 20 ou 30 points de vue que je voudrais aussi avoir un post car sinon le code n'aura pas de sens.

Je ne veux pas sonner comme je suis bénéficiant d'ici, mais le problème n'est pas dans les requêtes.Les requêtes sont optimales (ou au moins presque optimal).J'ai passé d'innombrables heures à les optimiser, à la recherche de chaque colonne et de chaque ligne de tableau 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).

Était-ce utile?

La solution

Pour SQL Server 2005, je vous recommande d'utiliser les variables de table et partiellement bâtiment les données que vous allez.

Pour ce faire, créez un tableau de la variable qui représente le résultat final que vous voulez envoyer à l'utilisateur.

Alors à trouver votre table primaire (disons que la table commandes dans votre exemple ci-dessus) et d'extraire des données, en plus d'un bit de données supplémentaires qui est seulement dire une jointure loin (nom du client, nom du produit).Vous pouvez faire un SELECT INTO pour mettre ce directement dans votre tableau de variables.

À partir de là, parcourir le tableau 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érer dans chaque colonne que vous allez.

Une fois terminé, vous pourrez alors faire une simple SÉLECTIONNEZ * à partir de votre tableau de variable et de retour cet ensemble de résultats à l'utilisateur.

Je n'ai pas de chiffres, mais il y a eu trois instances distinctes que j'ai travaillé à la date où faire ces petites requêtes a effectivement travaillé plus rapide que de faire un énorme requête select avec un tas de jointures.

Autres conseils

Je n'ai jamais rencontré ce genre de situation, et pour être honnête, l'idée de référencer > 256 tables dans une requête fils moi avec un mortel effroi.

Votre première question devrait probablement par "Pourquoi alors tant de gens?", suivi de près par "ce que les bits d'information dois-je PAS besoin?" Je serais inquiet que la quantité de données retourné par une telle requête serait de commencer à influer sur les performances de l'application, assez sévèrement, trop.

@chopeen Vous pouvez changer la façon dont vous êtes le calcul de ces statistiques, et au lieu de garder une table distincte de toutes les par-produit stats..quand une commande est passée en boucle à travers les produits et mettre à jour les documents appropriés dans les statistiques de la table.Cela allait changer beaucoup de la charge de calcul à la page de paiement, plutôt que de courir le tout dans un énorme requête lors de l'exécution d'un rapport.Bien sûr, il y a quelques stats qui ne sont pas aller travailler en tant que bien de cette façon, par exemplele suivi des clients prochains achats après l'achat d'un produit particulier.

Ce qui allait se passer tout le temps lors de la rédaction de Rapports Reporting Services pour Dynamics CRM installations en cours d'exécution sur SQL Server 2000.CRM dispose d'un bien de données normalisé schéma qui entraîne beaucoup de jointures.Il y a effectivement un correctif autour de qui va jusqu'à la limite de 256 à un énorme 260: http://support.microsoft.com/kb/818406 (nous avons toujours pensé que ce une grande blague de la part de l'équipe SQL Server).

La solution, comme Dillie-O aludes, est d'identifier les "sous-jointures" (de préférence ceux qui sont utilisés plusieurs fois) et le facteur en temp-table de variables que vous pouvez ensuite l'utiliser dans votre principale jointures.C'est l'un des principaux PIA et tue souvent la performance.Je suis désolé pour vous.

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

J'aimerais voir cette requête, mais j'imagine que c'est un problème avec un certain type d'itérateur, et bien que je ne peux pas penser à des situations où son possible, je parie que c'est une mauvaise alors que/cas/curseur ou une tonne de mal vues.

Post la requête :D

Aussi je me sens comme l'un des éventuels problèmes pourraient avoir une tonne (lu 200+) de nom/valeur des tables qui pourrait condensés dans un seul tableau de recherche.

J'ai eu ce même problème...mon développement encadré 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 la création de vues de contourner cette limitation, l'utilisation de la nouvelle vue dans le cadre de la requête dans le point de vue qui a déclenché l'erreur.

Un peu ridicule compte tenu de la logique d'exécution est le même...

Eu le même problème dans SQL Server 2005 (qui a travaillé en 2008) quand j'ai voulu créer une vue.J'ai résolu le problème en créant une procédure stockée à la place d'un point de vue.

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