Schnelle Abfragen werden in SSRS langsam ausgeführt

78

Ich habe einen SSRS-Bericht, der eine gespeicherte Prozedur aufruft. Wenn ich die gespeicherte Prozedur direkt in einem Abfragefenster ausführe, wird sie in weniger als 2 Sekunden zurückgegeben. Die Ausführung derselben Abfrage aus einem SSRS-Bericht von 2005 dauert jedoch bis zu 5 Minuten. Dies geschieht nicht nur beim ersten Durchlauf, sondern jedes Mal. Außerdem sehe ich dieses Problem in anderen Umgebungen nicht.

Irgendwelche Ideen, warum der SSRS-Bericht in dieser speziellen Umgebung so langsam laufen würde?

user275554
quelle
1
Hat Ihr SP Parameter?
Irwin M. Fletcher
1
Ja, es hat ungefähr 9 Parameter. Die Berichtsparametertypen stimmen mit den Parametertypen für gespeicherte Prozeduren überein.
user275554
Sie können gerne Ihre eigene Antwort akzeptieren, damit die Frage wie bei doppelten Fragen verwendet werden kann.
Dale K

Antworten:

110

Vielen Dank für die hier gegebenen Vorschläge. Wir haben eine Lösung gefunden und es stellte sich heraus, dass sie mit den Parametern zusammenhängt. SQL Server erstellte einen komplizierten Ausführungsplan, als er aus dem SSRS-Bericht aufgrund von "Parameter-Sniffing" ausgeführt wurde. Die Problemumgehung bestand darin, Variablen innerhalb der gespeicherten Prozedur zu deklarieren und die eingehenden Parameter den Variablen zuzuweisen. Dann verwendete die Abfrage die Variablen anstelle der Parameter. Dies führte dazu, dass die Abfrage unabhängig vom Aufruf von SQL Server Manager oder über den SSRS-Bericht konsistent ausgeführt wurde.

user275554
quelle
Dies ist ein bekanntes Problem von SQL Server ... das nicht mit SSRS selbst zusammenhängt.
AlexCode
Grrr! Vielen Dank für die Veröffentlichung der Lösung und des Problems. Es wurde korrekt optimiert für, komm rein und es ist DOA, ordne Parameter neuen Variablen zu und es ist wieder normal.
Volvox
3
Anstatt alle Variablen neu zuzuweisen, können Sie auch die Abfrage OPTIMIZE FOR UNKNOWN markieren. Siehe stackoverflow.com/questions/12979493/…
Mike
1
Das hat auch bei mir funktioniert. Ich musste nur eine von vier Variablen neu zuweisen, damit es funktioniert.
Darren Griffith
16

Fügen Sie dies am Ende Ihres Prozesses hinzu: option(recompile)

Dadurch wird der Bericht fast so schnell ausgeführt wie die gespeicherte Prozedur

Brian Smedley
quelle
Dadurch wird die gespeicherte Prozedur jedes Mal neu kompiliert, wenn Sie sie ausführen. Ich bin mir nicht sicher, ob es eine gute Lösung ist, da es den Zweck gespeicherter Prozeduren irgendwie zunichte macht.
Yodacheese
6
Wenn eine einzelne Abfrage langsam ausgeführt wird, kann das Hinzufügen einer Option (Neukompilieren) auf Abfrageebene einen großen Unterschied bewirken. Denken Sie daran: Neukompilierung = Optimierung. Wenn die Abfrage in sehr kurzer Zeit ausgeführt werden muss (z. B. 100 ms oder weniger), ist die Neukompilierungszeit möglicherweise nicht akzeptabel, und das Umgehen des Parameter-Sniffing funktioniert möglicherweise besser für Sie. Bei umfangreichen Berichten, deren Fertigstellung Minuten dauert, sind die Kosten für die Neukompilierung im Vergleich zur Strafe für einen schlechten Abfrageplan vernachlässigbar.
Paul Williams
14

Ich werde hinzufügen, dass ich das gleiche Problem mit einer nicht gespeicherten Prozedurabfrage hatte - nur eine einfache select-Anweisung. Um dies zu beheben, habe ich eine Variable in der SQL-Anweisung des Datasets deklariert und sie dem SSRS-Parameter gleichgesetzt.

Was für eine nervige Problemumgehung! Trotzdem, ich danke Ihnen allen, dass Sie mich der Antwort nahe gebracht haben!

JHFB
quelle
3
Vielen Dank für das Teilen. Ich habe auch die Methode der nicht gespeicherten Prozedur durchgeführt, was mir viel Zeit gespart hat.
Bob Horn
1
Parameterschnüffeln; Besonders wenn das Frontend eine Reihe von Parametern hat. Das Zurücksetzen auf interne Parameter hat mir in der Vergangenheit geholfen, daher stimme ich für diese Antwort. Die neu kompilierte Option funktionierte in meinem Fall mit 8 Berichtsparametern nicht. 3 mit Mehrparameterwerten.
Junketsu
11

Ich hatte das gleiche Problem, hier ist meine Beschreibung des Problems

"Ich habe eine Speicherprozedur erstellt, die 2200 Zeilen generiert und in fast 2 Sekunden ausgeführt wird. Nachdem ich jedoch die Speicherprozedur von SSRS 2008 aufgerufen und den Bericht ausgeführt habe, der tatsächlich nie ausgeführt wurde, muss ich letztendlich die BIDS (Business Intelligence Development Studio) beenden." vom Task-Manager ".

Was ich versucht habe: Ich habe versucht, den SP über den Reportuser Login auszuführen, aber SP lief auch für diesen Benutzer normal. Ich habe den Profiler überprüft, aber nichts hat funktioniert.

Lösung:

Tatsächlich besteht das Problem darin, dass SP zwar das Ergebnis generiert, die SSRS-Engine jedoch Zeit benötigt, um diese vielen Zeilen zu lesen und wiederzugeben. Also habe ich die Option WITH RECOMPILE in SP hinzugefügt und den Bericht ausgeführt. In diesem Moment geschah ein Wunder und mein Problem wurde gelöst.

Redroidmator
quelle
5

Ich hatte das gleiche Szenario. Sehr einfacher Bericht, der SP (der nur 1 Parameter benötigt) brauchte 5 Sekunden, um 10.000 Datensätze zurückzubringen, aber der Bericht würde 6 Minuten dauern, um ausgeführt zu werden. Laut Profiler und der RS ​​ExecutionLogStorage-Tabelle verbrachte der Bericht seine ganze Zeit mit der Abfrage. Der Kommentar von Brian S. führte mich zu der Lösung. Ich habe einfach WITH RECOMPILE vor der AS-Anweisung im SP hinzugefügt, und jetzt entspricht die Berichtszeit ziemlich genau der SP-Ausführungszeit.

Rod C.
quelle
5

Ich habe in den Tablix-Eigenschaften einfach die Option "Kopfzeilenspalten auf jeder Seite wiederholen" deaktiviert.

Antonius
quelle
Ja, bevor Sie die Auswahl meines in ungefähr 10 Sekunden gerenderten Berichts aufheben, wird er in 2 Sekunden gerendert.
Antony
5

Wenn Ihre gespeicherte Prozedur Verbindungsserver oder OpenQuery verwendet , können diese schnell von selbst ausgeführt werden, das Rendern in SSRS dauert jedoch lange. Einige allgemeine Vorschläge:

  • Rufen Sie die Daten direkt von dem Server ab, auf dem die Daten gespeichert sind, indem Sie eine andere Datenquelle verwenden, anstatt den Verbindungsserver zum Abrufen der Daten zu verwenden.
  • Laden Sie die Daten vom Remoteserver in eine lokale Tabelle, bevor Sie den Bericht ausführen, und halten Sie die Berichtsabfrage einfach.
  • Verwenden Sie eine Tabellenvariable, um zuerst die Daten vom Remoteserver abzurufen und dann mit Ihren lokalen Tabellen zu verknüpfen, anstatt einen Join mit einem Verbindungsserver direkt zurückzugeben.

Ich sehe, dass die Frage beantwortet wurde. Ich füge dies nur hinzu, falls jemand das gleiche Problem hat.

Bubbassauro
quelle
5

Ich hatte Probleme mit der HTML-Ausgabe des Berichts beim Abrufen von 32000 Zeilen. Die Abfrage lief schnell, aber die Ausgabe in den Webbrowser war sehr langsam. In meinem Fall musste ich "Interaktives Paging" aktivieren, damit der Benutzer die erste Seite sehen und eine Excel-Datei generieren konnte. Der Vorteil dieser Lösung ist, dass die erste Seite schnell angezeigt wird und der Benutzer einen Export nach Excel oder PDF generieren kann. Der Nachteil ist, dass der Benutzer nur die aktuelle Seite scrollen kann. Wenn der Benutzer mehr Inhalt sehen möchte, muss er Navigationsschaltflächen über dem Raster verwenden. In meinem Fall akzeptierte der Benutzer dieses Verhalten, da der Export nach Excel wichtiger war.

Um "Interaktives Paging" zu aktivieren, müssen Sie auf den freien Bereich im Berichtsbereich klicken und die Eigenschaft "InteractiveSize" \ "Höhe" auf Berichtsebene im Eigenschaftenbereich ändern. Setzen Sie diese Eigenschaft auf einen anderen Wert als 0. In meinem Fall habe ich 8,5 Zoll festgelegt. Stellen Sie außerdem sicher, dass Sie die Eigenschaft "Wenn möglich auf einer Seite zusammenhalten" auf Tablix-Ebene deaktiviert haben (klicken Sie mit der rechten Maustaste auf Tablix, dann auf "Tablix-Eigenschaften" und dann auf "Allgemein" \ "Seitenumbruchoptionen").

Geben Sie hier die Bildbeschreibung ein

Alexey Sukhanov
quelle
Das hat es für mich behoben!
Unter
4

Ich bin auf ein ähnliches Problem gestoßen, bei dem meine gespeicherte Prozedur schnell aus Management Studio ausgeführt wurde, aber sehr langsam aus SSRS. Nach einem langen Kampf löste ich dieses Problem, indem ich die gespeicherte Prozedur physisch löschte und neu erstellte. Ich bin mir der Logik dahinter nicht sicher, aber ich gehe davon aus, dass dies an der Änderung der Tabellenstruktur liegt, die in der gespeicherten Prozedur verwendet wird.

Jay
quelle
3

Ich stand vor dem gleichen Problem. Für mich war es nur, die Option zu deaktivieren:

Tablix-Eigenschaften => Seitenumbruchoption => Wenn möglich auf einer Seite zusammenhalten

Des SSRS-Berichts. Es wurde versucht, alle Datensätze auf derselben Seite zu platzieren, anstatt viele Seiten zu erstellen.

Joanne
quelle
3

Abgesehen von dem Problem des Parameter-Sniffing habe ich festgestellt, dass SSRS bei der clientseitigen Verarbeitung im Allgemeinen langsamer ist als (in meinem Fall) Crystal Reports-Berichte. Die SSRS-Engine scheint einfach nicht so leistungsfähig zu sein, wenn viele Zeilen lokal gefiltert oder aggregiert werden müssen. Zugegeben, dies sind Probleme beim Entwurf von Ergebnismengen, die häufig behoben werden können (allerdings nicht immer, wenn die Details für einen Drilldown erforderlich sind), aber die ausgereiftere ... Berichts-Engine ist verzeihender.

Steve
quelle
3

In meinem Fall musste ich nur das SSMS trennen und verbinden. Ich habe die Abfrage profiliert und die Ausführungsdauer betrug 1 Minute, obwohl die Abfrage selbst weniger als 2 Sekunden dauert. Die Verbindung wurde neu gestartet und erneut ausgeführt. Diesmal zeigte die Dauer die korrekte Ausführungszeit an.

Ranjan
quelle
1

Einige Dinge, die Sie tun können, ohne den eigentlichen Bericht auszuführen, führen Sie den Sproc einfach auf der Registerkarte "Daten" der Berichtsdienste aus. Dauert es noch zeit Eine andere Möglichkeit besteht darin, SQL Profiler zu verwenden und zu bestimmen, was in das Datenbanksystem ein- und ausgeht.

Sie können es auch testen, um einen einfachen Bericht ohne Parameter neu zu erstellen. Führen Sie den Bericht aus und prüfen Sie, ob er einen Unterschied macht. Es kann sein, dass Ihr RS-Bericht beschädigt oder schlecht geformt ist, was dazu führen kann, dass das Rendern sehr langsam ist.

JonH
quelle
1

Hatte das gleiche Problem und behebt es, indem dem freigegebenen Dataset ein Standardparameter zugewiesen und dieses Dataset auf dem Berichtsserver aktualisiert wird.

Solomon
quelle
1

Verwenden Sie "Gruppieren nach" in der SSRS-Tabelle?

Ich hatte einen Bericht mit 3 nach Feldern gruppierten Berichten und bemerkte, dass der Bericht trotz einer leichten Abfrage sehr langsam lief, bis zu dem Punkt, an dem ich nicht einmal Werte im Suchfeld wählen kann.

Dann habe ich die Gruppierungen entfernt und jetzt wird der Bericht in Sekundenschnelle angezeigt und alles funktioniert sofort.

mRätsel
quelle
1

Ich konnte dies lösen, indem ich das eingebaute Feld [& TotalPages] von unten entfernte. Die Zeit, in der von Minuten auf weniger als eine Sekunde gesunken ist.

Etwas Seltsames, das ich nicht feststellen konnte, hatte Auswirkungen auf die Berechnung der Gesamtseiten.

Ich habe SSRS 2012 verwendet.

MiguelSlv
quelle
-1

In unserem Fall war kein Code erforderlich.

Hinweis von unserem Helpdesk: "Durch Löschen Ihrer Interneteinstellungen wird dieses Problem behoben."

Vielleicht bedeutet das "Cache leeren".

user7788038
quelle