Haben Sie schon einmal eine Abfrage, die SQL Server konnte nicht ausgeführt werden angetroffen, weil es zu viele Tabellen verwiesen?

stimmen
15

Haben Sie jemals eine von dort Fehlermeldungen gesehen?

- SQL Server 2000

Konnte nicht Nebentabelle für Sicht oder Funktionsauflösung zuzuteilen.
Die maximale Anzahl von Tabellen in einer Abfrage (256) wurde überschritten.

- SQL Server 2005

Zu viele Tabellennamen in der Abfrage. Die maximal zulässige ist 256.

Wenn ja, was hast du getan?

Aufgegeben? Überzeugt die Kunden ihre Forderungen zu vereinfachen? Denormalisierte die Datenbank?


@ (Jeder wollte mir die Abfrage schreiben):

  1. Ich bin mir nicht sicher, ob ich 70 Kilobyte Code in der Antwort Bearbeitungsfenster einfügen können.
  2. Auch wenn ich kann nicht helfen, das dieses seit diesem 70 Kilobyte Code 20 oder 30 Ansichten verweisen, die ich auch, da sonst schreiben würde der Code bedeutungslos.

Ich will nicht klingen wie ich Prahlerei hier bin, aber das Problem ist nicht in den Abfragen. Die Abfragen sind optimal (oder zumindest fast optimal). Ich habe unzählige Stunden damit verbracht, sie zu optimieren, sucht für jede einzelne Spalte und jeder einzelne Tabelle, die entfernt werden können. Stellen Sie sich einen Bericht, der 200 oder 300 Spalten hat, die mit einer einzelnen SELECT-Anweisung gefüllt werden muss (weil das ist, wie es vor einigen Jahren entworfen wurde, als es noch ein kleiner Bericht war).

Veröffentlicht am 05/08/2008 um 15:54
quelle vom benutzer
In anderen Sprachen...                            


8 antworten

stimmen
8

Für SQL Server 2005, würde ich empfehlen Tabellenvariablen und den Aufbau teilweise die Daten, wie Sie gehen.

Dazu erstellen Sie eine Tabelle Variable, die Ihre endgültige Ergebnismenge repräsentiert, die Sie an den Benutzer senden möchten.

Dann finden Sie Ihre primäre Tabelle (sagen wir die Auftragstabelle im Beispiel oben) und ziehen Sie diese Daten, sowie ein wenig zusätzlichen Daten, die nur eines sagen, kommen Sie weg (Kundenname, Produktname). Sie können ein SELECT INTO tun diese Variable direkt in Ihren Tisch zu legen.

Von dort durch die Tabelle durchlaufen und für jede Zeile, führen Sie eine Reihe von kleinen SELECT-Abfragen, die die zusätzlichen Daten alles, was Sie für Ihre Ergebnismenge benötigen abruft. Legen Sie diese in jeder Spalte, wie Sie gehen.

Wenn Sie fertig sind, können Sie dann eine einfache SELECT * aus Ihrer Tabelle variabel und senden Sie das Ergebnis auf den Benutzer.

Ich habe keine harten Zahlen für diese, aber es gibt drei verschiedene Fälle, die ich auf dem neuesten Stand gearbeitet haben, wo diese kleinere Abfragen tatsächlich schneller tun gearbeitet hat als der Joins mit einem Bündel einer massiven Auswahlabfrage zu tun.

Beantwortet am 05/08/2008 um 16:19
quelle vom benutzer

stimmen
1

Dies würde die ganze Zeit passieren , wenn Reporting Services - Berichte Installationen für Dynamics CRM Schreiben auf SQL Server 2000 ausgeführt CRM verfügt über ein schön normalisierte Datenschema , das in vielen Ergebnisse der Joins. Es gibt tatsächlich ein Hotfix um diesen Willen auf die Grenze von 256 auf satte 260: http://support.microsoft.com/kb/818406 (wir dies ein großer Witz auf dem Teil des SQL Server - Team immer gedacht).

Die Lösung, wie Dillie-O Aludes zu, ist angemessen zu identifizieren „sub-Joins“ (vorzugsweise solche, die mehrfach verwendet werden) und sie in temp-Tabelle Variablen ausklammern, die Sie dann in Ihrem Haupt-Joins verwenden. Es ist ein wichtiger PIA und oft tötet Leistung. Es tut mir leid für dich.

@ Kevin, Liebe des T-Shirt - sagt alles :-).

Beantwortet am 02/11/2008 um 16:50
quelle vom benutzer

stimmen
1

@chopeen könnten Sie die Art und Weise ändern Sie diese Statistiken sind zu berechnen und stattdessen eine separate Tabelle aller pro-Produkt Statistiken halten .. wenn ein Auftrag erteilt wird, eine Schleife durch die Produkte und aktualisieren Sie die entsprechenden Datensätze in der Statistiktabelle. Dies würde einen großen Teil der Rechenlast zur Kasse Seite verschieben, anstatt alles in einer riesigen Abfrage ausgeführt wird, wenn ein Bericht ausgeführt wird. Natürlich gibt es einige Statistiken, die nicht so gut auf diese Weise arbeiten werden, wie zB Kunden nächsten Einkäufe nach dem Kauf eines bestimmten Produkts zu verfolgen.

Beantwortet am 05/08/2008 um 16:19
quelle vom benutzer

stimmen
1

Ich habe noch nie in einer solchen Situation kommen, und die Idee der Referenzierung> 256 Tabellen ehrlich zu sein in einer Abfrage mich mit einem Todesangst fils.

Ihre erste Frage sollte wohl von „Warum so viele?“, Dicht gefolgt von „welche Bits von Informationen kann ich nicht brauchen?“ Ich wäre besorgt , dass die Menge an Daten aus einer solchen Abfrage zurückgegeben werden würde beginnen Leistung der Anwendung auswirken ziemlich stark, auch.

Beantwortet am 05/08/2008 um 15:57
quelle vom benutzer

stimmen
0

Hat das gleiche Problem in SQL Server 2005 (im Jahr 2008 arbeitete), wenn ich eine Ansicht erstellen wollte. Ich löste das Problem, indem eine gespeicherte Prozedur statt einer Ansicht erstellen.

Beantwortet am 07/03/2012 um 16:59
quelle vom benutzer

stimmen
0

Ich hatte das gleiche Problem ... meine Entwicklung Box läuft SQL Server 2008 (die Ansicht funktionierte gut), sondern auf der Produktion (mit SQL Server 2005) die Ansicht nicht. Ich landete Ansichten erstellen, diese Einschränkung zu vermeiden, die neuen Ansichten als Teil der Abfrage in der Ansicht verwenden, die den Fehler warfen.

Art albert die logische Ausführung unter Berücksichtigung ist das gleiche ...

Beantwortet am 19/08/2010 um 18:29
quelle vom benutzer

stimmen
0

Stellen Sie die Abfrage: D

Ich fühle mich auch wie einer der möglichen Probleme könnten eine Tonne (read 200+) von Name / Wert-Tabellen werden, die in einer einzigen Nachschlagetabelle kondensiert könnte.

Beantwortet am 05/08/2008 um 16:26
quelle vom benutzer

stimmen
0

Ich mag, dass die Abfrage, um zu sehen, aber ich glaube, es ist ein Problem mit irgendeiner Art von Iterator, und während ich nicht von irgendwelchen Situationen, in denen seine möglichen denken kann, ich wette, es ist von einem schlecht während / case / Cursor oder einer Tonne schlecht umgesetzt Aussicht.

Beantwortet am 05/08/2008 um 15:58
quelle vom benutzer

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