2010-05-02 185 views
7

我在使用專有的非SQL數據庫的項目上工作過,其中查詢可能被中斷,並且在代碼庫中有相當多的地方使用了該功能,並且非常合理(例如停止一個長時間運行的查詢被用戶取消,或者當一個更近的查詢發生並且呈現先前的查詢時,等等),並且我意識到我以前從未真正地看到過那種「中斷查詢」,並認爲它可以使好SO問題(幾個問題,但他們都完全相同的東西):SQL:中斷查詢

  • SQL查詢可以中斷?

  • 這是SQL標準的一部分嗎?

  • 如果它不是SQL標準的一部分,哪個SQL DB允許查詢被中斷(最歡迎任何示例)?

  • 中斷一個數據庫查詢(SQL與否)是很常見的,你會知道你不會在乎結果嗎? (在我工作的代碼庫,它肯定有助於減輕服務器的負載)

回答

6

恕我直言「打斷」應該由「殺死」或「終止」來代替。中斷的概念可能令人困惑,因爲人們可能會認爲它會讓查詢稍後恢復。

SQL標準沒有提供中斷或終止正在運行的查詢的方法,但是我知道的每個DBMS都實現了KILL命令或類似的命令。例如,在MySQL中,用戶可以使用SHOW [FULL] PROCESSLIST查看所有正在運行的查詢(及其狀態,查詢ID等)。具有KILL特權的用戶可以終止查詢。

大多數KILL發生的原因是查詢風險太大或阻止其他查詢,例如。該表缺少索引或磁盤已滿。當您不關心結果時(例如,用戶取消網站導航),網絡服務器本身通常會中止該過程並因此中止查詢(不需要手動或程序員交互)

4

所有RDBMS訪問層I'我曾與提供取消方法異步取消正在運行的查詢。查看文檔,瞭解您正在使用的任何數據訪問技術堆棧。 .NET/ADO/JDBC提供了一個'取消'方法。 ODBC - SQLCancel。 很明顯,RDBMS廠商的數據訪問驅動程序必須實現該方法。

就取消的有用性而言,我傾向於對任何定期使用它的方案提出批評。在我看來,更好的協調和設計會減輕非管理需求。

RDBMS的內部,交易的性質和隔離方案有很大的依賴性。如果RDBMS使用樂觀併發模型(即,提交本質上是免費的),取消正在運行的查詢可能涉及潛在的昂貴的回滾操作。在最壞的情況下,運行一個小時直到取消點的查詢可能需要一個小時才能回滾。