7

私は、クエリが中断される可能性のある独自の非 SQL DB を使用するプロジェクトに取り組んできました。コードベースには、その機能が使用され、完全に理にかなっている場所がかなりありました (たとえば、実行時間の長いクエリを停止するためにキャンセルされます)。ユーザー、またはより最近のクエリが実行されて以前のクエリが廃止されたときなど)、以前はそのような「中断されたクエリ」を実際に見たことがないことに気付き、良い SO の質問になる可能性があると考えました (いくつかの質問ですが、それらはすべてまったく同じものに関連しています):

  • SQL クエリを中断できますか?

  • これは SQL 標準の一部ですか?

  • それがSQL標準の一部でない場合、どのSQL DBがクエリの中断を許可していますか(どんな例でも大歓迎です)?

  • DB クエリ (SQL であろうとなかろうと) を中断することは一般的ですか? (私が取り組んだコードベースでは、サーバーの負荷を軽減するのに役立ちます)

4

2 に答える 2

6

私見の「中断」は、「殺害」または「終了」に置き換える必要があります。割り込みの概念は、クエリを後で再開できると推測する可能性があるため、混乱を招く可能性があります。

SQL 標準では、実行中のクエリを中断または終了する方法は提供されていませんが、私が知っているすべての DBMS は KILL コマンドなどを実装しています。たとえば、MySQL では、ユーザーは SHOW [FULL] PROCESSLIST を使用して、実行中のすべてのクエリ (およびその状態、クエリ ID など) を表示できます。その後、KILL 権限を持つユーザーはクエリを終了できます。

ほとんどの KILL は、クエリが長時間実行されるリスクがあるか、他のクエリをブロックしているために発生します。テーブルにインデックスがないか、ディスクがいっぱいです。結果を気にしない場合 (例: ユーザーがサイト ナビゲーションをキャンセルした場合)、多くの場合、Web サーバー自体がプロセスを中止するため、クエリ自体が中止されます (手動またはプログラマーの操作は必要ありません)。

于 2010-05-02T21:34:15.143 に答える
5

私がこれまで扱ってきたすべての RDBMS アクセス レイヤーは、実行中のクエリを非同期的にキャンセルするためのキャンセル メソッドを提供します。使用しているデータ アクセス テクノロジ スタックについては、ドキュメントを確認してください。.NET/ADO/JDBC は「キャンセル」メソッドを提供します。ODBC - SQL キャンセル。明らかに、基盤となる RDBMS ベンダーのデータ アクセス ドライバーもメソッドを実装する必要があります。

キャンセルの有用性という点では、キャンセルを定期的に使用するスキームには批判的になりがちです。私の意見では、より良い調整や設計は、管理以外の必要性を軽減する傾向があります.

RDBMS の内部構造、トランザクションの性質、および分離スキームに大きく依存します。RDBMS が楽観的同時実行モデルを使用している場合 (つまり、コミットは基本的に無料)、実行中のクエリをキャンセルすると、コストのかかるロールバック操作が必要になる可能性があります。最悪の場合、キャンセルの時点まで 1 時間実行されているクエリは、ロールバックにさらに 1 時間かかる可能性があります。

于 2010-05-02T22:12:09.363 に答える