2009-03-05 5 views
5

Ich habe in Oracle 10g eine Funktion gesehen, die die verbleibende Zeit für eine lange laufende Abfrage schätzt und ich frage mich, ob dies auch in SQL Server möglich ist (zumindest in 2008?)?Anfrage Dauer Schätzung in SQL Server

Angenommen, ich habe eine sehr große Tabelle mit Dutzenden von Millionen Zeilen (gut indiziert usw.) und ich muss nach bestimmten Zeilen suchen. Ich weiß, dass es viel Zeit in Anspruch nehmen wird und ich bin damit einverstanden, aber ich möchte dem Benutzer eine Art Fortschrittsbalken präsentieren.

Wie kann ich Fortschritte anzeigen?

+0

Wenn die Tabelle (eine) gut indiziert ist und Sie nach "einigen" bestimmten Zeilen suchen (ich meine einige), muss sie sofort Zeilen zurückgeben. Wie auch immer, nette Frage!;-) – FerranB

+1

selbst bei guten Indizes in DataWarehouses können einige reportgenerierende Abfragen deutlich über 1 Minute dauern. –

Antwort

5

Ich würde es vergessen und nur einen Kreis drehen!

Im Ernst, um MrTellys Idee weiter zu verfolgen, gibt es dynamische Verwaltungsansichten, die Ihnen durchschnittliche Ausführungszeiten für bestimmte Abfragen geben können - vielleicht kann das Sie irgendwo hinbringen.

http://msdn.microsoft.com/en-us/library/ms188754.aspx

edit: I Prozent abgeschlossen im sp_whoisactive Verfahren von Adam Machanic gesehen haben. Vielleicht ist das ein anderer Ort, an den man sich wenden kann. SQL 2016 verfügt über den Abfragespeicher, der Plancachespeicherinformationen speichert - ein Ersatz für den dmv-Plancache, der beim Neustart gelöscht wird.

+0

Großartige Idee. Sie können den geschätzten Abfrageplan basierend auf der Abfrage des Benutzers abrufen und dann den Plan-Cache überprüfen, um festzustellen, ob dieser Plan bereits existiert und wie lang die durchschnittliche Dauer ist. Es ist unordentlich und es wird Last auf dem Server hinzufügen, aber es würde funktionieren. –

1

Ich bin mir nicht bewusst, ein Werkzeug, das dies automatisch tun wird, aber es gibt ein paar Alternativen. Brechen Sie Ihre Abfrage in Blöcke ...

select blah from table where IdRange between (1 and 100000) 

select blah from table where IdRange between (100001 and 200000) 

als jede SQL so vervollständigt den Fortschrittsbalken aktualisieren.

Oder Sie könnten die Länge der Zeit für jede Ihrer Selektionen aufzeichnen, speichern Sie diese Werte möglicherweise pro Benutzer. Verwenden Sie dann diese Informationen, um eine Fortschrittsbalkenlänge zurückzugeben.

Beide Ansätze sind ziemlich kludgy, hoffentlich kennt jemand einen besseren Ansatz.

Natürlich könnten Sie versuchen, den Abfrageplan zu entschlüsseln und darauf basierend ein Urteil zu fällen, aber im Code wäre das schwer.

2

Verwandte:

Heutige Datenbanksysteme bieten wenig Rückmeldung an den Benutzer/DBA auf , wie viel von einer Ausführung des SQL-Abfrage abgeschlossen ist. Für lange laufende Abfragen kann eine solche Rückmeldung sehr nützlich sein, zum Beispiel zu Hilfe entscheiden, ob die Abfrage beendet werden oder zum Abschluss ausgeführt werden soll. Obwohl die obige Anforderung leicht auszudrücken ist, ist eine robuste Anzeige des Fortschritts für die Abfrageausführung zu entwickeln, ist herausfordernd. In dieser Arbeit untersuchen wir das obige Problem und präsentieren Techniken, die die Grundlage für eine effektive Fortschrittsschätzung bilden können. Die Ergebnisse der experimentellen Validierung unserer Techniken in Microsoft SQL Server sind vielversprechend.