Haben Sie jemals eine Abfrage gefunden, die SQL Server nicht ausführen konnte, weil auf zu viele Tabellen verwiesen wurde?

  • Haben Sie jemals Fehlermeldungen gesehen?

    - SQL Server 2000

    Zusätzliche Tabelle für die Auflösung von Ansichten oder Funktionen konnte nicht zugewiesen werden.
    Die maximale Anzahl von Tabellen in einer Abfrage (256) wurde überschritten.

    - SQL Server 2005

    Zu viele Tabellennamen in der Abfrage. Die maximal zulässige Anzahl beträgt 256.

    Wenn ja, was haben Sie getan?

    Aufgegeben? Überzeugt den Kunden, seine Anforderungen zu vereinfachen? Denormalisiert die Datenbank?


    @ (jeder, der die Abfrage posten soll):

    1. Ich bin mir nicht sicher, ob ich 70 Kilobyte Code in das Antwortbearbeitungsfenster einfügen kann.
    2. Auch wenn ich das kann, hilft das seit diesen 70 Kilobytes nicht Code bezieht sich auf 20 oder 30 Ansichten, die ich ebenfalls posten müsste, da sonst der Code bedeutungslos ist.

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

    08 November 2013
    TarynVahag Vardanyan
8 answers
  • Für SQL Server 2005 würde ich empfehlen, Tabellenvariablen zu verwenden und die Daten teilweise zu erstellen.

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

    Dann finden Sie Ihre Primärtabelle (in Ihrem Beispiel oben die Bestellungstabelle) und ziehen Sie diese Daten sowie ein paar zusätzliche Daten, die nur einen Join enthalten (Kundenname, Produktname). Sie können SELECT INTO ausführen, um dies direkt in Ihre Tabellenvariable zu übernehmen.

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

    Wenn 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 harten Zahlen dafür, aber es gab drei verschiedene Fälle, an denen ich bisher gearbeitet habe, bei denen das Durchführen dieser kleineren Abfragen tatsächlich schneller als das Durchführen einer massiven Auswahlabfrage funktioniert hat eine Reihe von Verknüpfungen.

    05 August 2008
    Dillie-O
  • Ich bin noch nie auf eine solche Situation gestoßen, und um ehrlich zu sein, die Idee der Referenzierung & gt; 256 Tabellen in einer Abfrage befallen mich mit einer Todesangst.

    Ihre erste Frage sollte wahrscheinlich "Warum so viele?" sein, gefolgt von "Welche Informationen brauche ich NICHT ?" Ich würde mir Sorgen machen, dass die Menge an Daten, die von einer solchen Abfrage zurückgegeben werden, auch die Leistung der Anwendung stark beeinträchtigen würde.

    05 August 2008
    ZombieSheep
  • @chopeen Sie können die Berechnungsmethode für diese Statistiken ändern und stattdessen eine separate Tabelle mit allen Produktstatistiken führen. Wenn eine Bestellung aufgegeben wird, durchlaufen Sie die Produkte und aktualisieren die entsprechenden Datensätze die Statistik-Tabelle. Dies würde einen großen Teil der Rechenlast 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 werden, z. die nächsten Einkäufe von Kunden nach dem Kauf eines bestimmten Produkts verfolgen.

    05 August 2008
    pix0r
  • Dies ist beim Schreiben von Reporting Services-Berichten für Dynamics CRM-Installationen, die auf SQL Server 2000 ausgeführt werden, immer der Fall. CRM verfügt über ein normal normalisiertes Datenschema, das zu vielen Verknüpfungen führt. Es gibt einen Hotfix, der das Limit von 256 auf 260 erhöht: http://support.microsoft .com / kb / 818406 (Wir haben immer gedacht, dass dies ein großartiger Witz seitens des SQL Server-Teams ist).

    Die Lösung, wie Dillie-O dies auch tut , ist es, geeignete "Sub-Joins" (vorzugsweise solche, die mehrfach verwendet werden) zu identifizieren und in temporäre Tabellenvariablen umzuwandeln, die Sie dann in Ihren Haupt-Joins verwenden. Es ist eine wichtige PIA und bringt oft Leistung ab. Es tut mir leid für Sie.

    @Kevin, ich liebe dieses T-Stück - sagt alles: -).

    02 November 2008
    friismSam
  • Ich hatte das gleiche Problem ... In meiner Entwicklungsbox läuft SQL Server 2008 (die Ansicht funktionierte gut), aber bei der Produktion (mit SQL Server 2005) war die Ansicht nicht der Fall. Am Ende habe ich Ansichten erstellt, um diese Einschränkung zu vermeiden, indem ich die neuen Ansichten als Teil der Abfrage in der Ansicht verwendete, in der der Fehler aufgetreten ist ...

    19 August 2010
    LeRoy DeNooyer
  • Ich würde gerne diese Abfrage sehen, aber ich kann mir vorstellen, 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 eine schlechte Zeit ist / Cursor oder eine Tonne schlecht implementierte Ansichten.

    05 August 2008
    Shawn
  • Veröffentlichen Sie die Abfrage: D

    Ich habe auch das Gefühl, dass eines der möglichen Probleme darin bestehen könnte, eine Menge (Lese 200+) von Namen / Wert-Tabellen zu haben, die dazu führen könnten in einer einzigen Nachschlagetabelle zusammengefasst.

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

    07 March 2012
    Tamas Pataky