database - Haben Sie jemals eine Abfrage festgestellt, die SQL Server nicht ausführen konnte, weil sie auf zu viele Tabellen verwies?

Translate

Haben Sie jemals eine dieser Fehlermeldungen gesehen?

- SQL Server 2000

Hilfstabelle für Ansichts- oder Funktionsauflösung konnte nicht zugeordnet werden.
Die maximale Anzahl von Tabellen in einer Abfrage (256) wurde überschritten.

- SQL Server 2005

Zu viele Tabellennamen in der Abfrage. Der maximal zulässige Wert beträgt 256.

Wenn ja, was haben Sie getan?

Aufgegeben? Den Kunden überzeugt, seine Anforderungen zu vereinfachen? Datenbank denormalisiert?


@ (jeder möchte, dass ich die Anfrage poste):

  1. Ich bin nicht sicher, ob ich 70 Kilobyte Code in das Antwortbearbeitungsfenster einfügen kann.
  2. Selbst wenn ich dies kann, hilft dies nicht, da diese 70 Kilobyte Code auf 20 oder 30 Aufrufe verweisen, die ich auch posten müsste, da sonst der Code bedeutungslos ist.

Ich möchte nicht so klingen, als würde ich mich hier rühmen, aber das Problem liegt nicht in den Abfragen. Die Abfragen sind optimal (oder zumindest fast optimal). Ich habe unzählige Stunden damit verbracht, sie zu optimieren und nach jeder einzelnen Spalte und jeder einzelnen Tabelle zu suchen, die entfernt werden kann. Stellen Sie sich einen Bericht mit 200 oder 300 Spalten vor, der mit einer einzigen SELECT-Anweisung gefüllt werden muss (denn so wurde er vor einigen Jahren entworfen, als es noch ein kleiner Bericht war).

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Für SQL Server 2005 würde ich empfehlen, Tabellenvariablen zu verwenden und die Daten teilweise zu erstellen, während Sie fortfahren.

Erstellen Sie dazu eine Tabellenvariable, die Ihre endgültige Ergebnismenge darstellt, die Sie an den Benutzer senden möchten.

Suchen Sie dann Ihre Primärtabelle (z. B. die Auftragstabelle in Ihrem obigen Beispiel) und ziehen Sie diese Daten sowie einige zusätzliche Daten ab, die nur einen Join entfernt sind (Kundenname, Produktname). Sie können SELECT INTO ausführen, um dies direkt in Ihre Tabellenvariable einzufügen.

Von dort aus durchlaufen Sie die Tabelle und führen für jede Zeile eine Reihe kleiner SELECT-Abfragen durch, mit denen alle zusätzlichen Daten abgerufen werden, die Sie für Ihre Ergebnismenge benötigen. Fügen Sie diese in jede Spalte ein.

Sobald Sie fertig sind, können Sie ein einfaches SELECT * aus Ihrer Tabellenvariablen ausführen und diese Ergebnismenge an den Benutzer zurückgeben.

Ich habe keine festen Zahlen dafür, aber es gab drei verschiedene Fälle, an denen ich bisher gearbeitet habe, in denen das Durchführen dieser kleineren Abfragen tatsächlich schneller funktioniert hat als das Durchführen einer massiven Auswahlabfrage mit einer Reihe von Verknüpfungen.

Quelle
Translate

Ich bin noch nie auf eine solche Situation gestoßen, und um ehrlich zu sein, macht mich die Idee,> 256 Tabellen in einer Abfrage zu referenzieren, mit Todesangst fertig.

Ihre erste Frage sollte wahrscheinlich "Warum so viele?" Sein, dicht gefolgt von "Welche Informationen habe ich?"NICHTbrauchen? "Ich würde mir Sorgen machen, dass die Datenmenge, die von einer solchen Abfrage zurückgegeben wird, die Leistung der Anwendung ebenfalls stark beeinträchtigt.

Quelle
Translate

@chopeen Sie können die Art und Weise ändern, in der Sie diese Statistiken berechnen, und stattdessen eine separate Tabelle aller Produktstatistiken führen. Wenn Sie eine Bestellung aufgeben, durchlaufen Sie die Produkte und aktualisieren Sie die entsprechenden Datensätze in der Statistiktabelle. Dies würde einen Großteil der Berechnungslast auf die Checkout-Seite verlagern, anstatt beim Ausführen eines Berichts alles in einer großen Abfrage auszuführen. Natürlich gibt es einige Statistiken, die auf diese Weise nicht so gut funktionieren, z. B. die Verfolgung der nächsten Einkäufe der Kunden nach dem Kauf eines bestimmten Produkts.

Quelle
Translate

Dies würde die ganze Zeit passieren, wenn Reporting Services-Berichte für Dynamics CRM-Installationen geschrieben werden, die unter SQL Server 2000 ausgeführt werden. CRM verfügt über ein gut normalisiertes Datenschema, das zu vielen Verknüpfungen führt. Es gibt tatsächlich einen Hotfix, der das Limit von 256 auf satte 260 erhöht:http://support.microsoft.com/kb/818406(Wir fanden das immer ein toller Witz des SQL Server-Teams).

Die Lösung besteht, wie Dillie-O andeutet, darin, geeignete "Unterverknüpfungen" (vorzugsweise solche, die mehrfach verwendet werden) zu identifizieren und sie in temporäre Tabellenvariablen zu zerlegen, die Sie dann in Ihren Hauptverknüpfungen verwenden. Es ist eine große PIA und tötet oft die Leistung. Es tut mir leid für dich.

@ Kevin, liebe dieses T-Shirt - sagt alles :-).

Quelle
Translate

Ich würde diese Abfrage gerne sehen, aber ich stelle mir vor, dass es ein Problem mit einer Art Iterator ist, und obwohl ich mir keine Situationen vorstellen kann, in denen dies möglich ist, wette ich, dass es sich um eine schlechte Zeit / einen schlechten Fall / Cursor oder eine Menge handelt schlecht umgesetzte Ansichten.

Quelle
Translate

Stellen Sie die Abfrage: D.

Ich denke auch, dass eines der möglichen Probleme darin bestehen könnte, eine Tonne (lesen Sie mehr als 200) Namen- / Wertetabellen zu haben, die zu einer einzigen Nachschlagetabelle zusammengefasst werden könnten.

Quelle
Translate

Ich hatte das gleiche Problem ... auf meiner Entwicklungsbox wird SQL Server 2008 ausgeführt (die Ansicht funktionierte einwandfrei), in der Produktion (mit SQL Server 2005) jedoch nicht. Am Ende habe ich Ansichten erstellt, um diese Einschränkung zu vermeiden, und die neuen Ansichten als Teil der Abfrage in der Ansicht verwendet, die den Fehler ausgelöst hat.

Ein bisschen albern, wenn man bedenkt, dass die logische Ausführung dieselbe ist ...

Quelle
Translate

Hatte das gleiche Problem in SQL Server 2005 (funktionierte 2008), als ich eine Ansicht erstellen wollte. Ich habe das Problem behoben, indem ich eine gespeicherte Prozedur anstelle einer Ansicht erstellt habe.

Quelle