2010-05-02 15 views
7

Ich habe an einem Projekt mit einer proprietären Nicht-SQL-DB gearbeitet, wo Abfragen unterbrochen werden konnten und in der Codebasis gab es einige Stellen, an denen diese Funktionalität sinnvoll genutzt wurde (zum Beispiel zum Stoppen) eine lange laufende Abfrage, die vom Benutzer abgebrochen wird, oder wenn eine neuere Abfrage stattfindet und die vorherige Abfrage veraltet macht usw.) und mir wurde klar, dass ich diese Art von "unterbrochenen Abfragen" vorher noch nie gesehen habe und dachte, sie könnte ein gute Frage SO (mehrere Fragen, aber sie sind alle genau die gleiche Sache bezogen):SQL: Unterbrechen einer Abfrage

  • können Abfragen unterbrochen werden SQL?

  • ist dieser Teil des SQL-Standards?

  • Wenn es nicht Teil des SQL-Standards ist, welche SQL-DBs erlauben Abfragen unterbrochen werden (jedes Beispiel sehr willkommen)?

  • ist es üblich, eine DB-Abfrage (SQL oder nicht) zu unterbrechen, von der Sie wissen, dass Sie das Ergebnis nicht mehr interessieren werden? (In der Codebasis ich gearbeitet habe, hilft es sicher, dass die Belastung des Servers zu erleichtern)

Antwort

6

Imho „unterbrochen“ durch ‚getötet‘ ersetzt werden oder ‚beendet‘. Das Konzept der Unterbrechung kann verwirrend sein, da man annehmen könnte, dass die Abfrage später wieder aufgenommen werden könnte.

Der SQL-Standard bietet keine Möglichkeit, eine laufende Abfrage zu unterbrechen oder zu beenden, aber jedes DBMS, das ich kenne, implementiert einen KILL-Befehl oder ähnliches. Zum Beispiel kann ein Benutzer in MySQL die SHOW [FULL] PROCESSLIST verwenden, um alle laufenden Abfragen (und ihre Zustände, Abfrage-IDs usw.) anzuzeigen. Benutzer mit der KILL-Berechtigung können dann eine Abfrage beenden.

Die meisten KILLs passieren, weil eine Abfrage riskiert, zu lange zu laufen oder blockiert andere Abfragen, z. Der Tabelle fehlt ein Index oder die Festplatte ist voll. Wenn Sie sich nicht um das Ergebnis kümmern (zB Benutzer abgebrochene Websitenavigation), wird oft der Webserver selbst den Prozess abbrechen und somit die Abfrage an sich (keine manuelle oder Programmiererinteraktion notwendig)

4

Alle RDBMS Zugriffsebenen I ' Wir haben schon einmal mit einer Annullierungsmethode gearbeitet, um laufende Abfragen asynchron zu löschen. Überprüfen Sie die Dokumentation für den von Ihnen verwendeten Datenzugriffstechnologie-Stack. .NET/ADO/JDBC bietet eine "Abbrechen" -Methode. ODBC - SQLCancel. Offensichtlich zugrunde liegenden RDBMS-Anbieter Datenzugriffstreiber muss auch die Methode implementieren.

In Bezug auf die Nützlichkeit der Stornierung würde ich neigen dazu, kritisch gegenüber jedem Schema, das es regelmäßig verwendet. Meiner Meinung nach würde eine bessere Koordinierung und/oder Gestaltung dazu beitragen, den nicht-administrativen Bedarf zu verringern.

Es besteht eine signifikante Abhängigkeit von den Interna des RDBMS, Art des Transaktions- und Isolationsschemas. Wenn das RDBMS ein optimistisches Parallelitätsmodell verwendet (dh Commit ist im Wesentlichen frei), kann das Abbrechen einer laufenden Abfrage einen möglicherweise kostspieligen Rollback-Vorgang beinhalten. Im schlimmsten Fall kann eine Abfrage, die für eine Stunde bis zum Abbruch läuft, sehr wohl noch eine weitere Stunde dauern.