這一切都取決於你如何執行你的查詢真的;
想象一下下面的查詢:
SqlConnection myConnection = new SqlConnection("connection_string");
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.CommandTimeout = some_long_time;
myCommand.CommandText = "database_killing_procedure_lol";
myConnection.Open() //Connection's now open
myCommand.ExecuteNonQuery();
會發生兩兩件事;一種是這種方法將排隊,直到command.ExecuteNonQuery()完成。第二個是,我們還將在該方法期間綁定來自連接池的連接。
如果我們超時會發生什麼?那麼拋出一個異常 - 一個Number屬性= -2的SqlException。但是,請記住,在上面的代碼中,沒有異常管理,因此所有將發生的事情是對象將超出範圍,我們需要等待它們被丟棄。特別是,我們的連接不會重複使用,直到發生這種情況。
這就是爲什麼以下方式是優選的,原因之一:
using(SqlConnection myConnection = new SqlConnection("connection_string"))
{
using(SqlCommand myCommand = new SqlCommand())
{
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.CommandTimeout = some_long_time;
myCommand.CommandText = "database_killing_procedure_lol";
myConnection.Open() //Connection's now open
myCommand.ExecuteNonQuery();
}
}
這意味着,一旦查詢完成,無論是自然(它運行到完成),或通過一個異常(超時或否則),資源立即返回。
在您的特定問題中,由於很多原因,執行大量查詢需要很長時間才能執行。在Web應用程序中,您可能會有許多用戶爭用有限數量的資源;內存,數據庫連接,CPU時間等等。因此,將這些與昂貴的操作綁定在一起會降低您的Web應用程序的響應能力和性能,或限制您可以同時使用的用戶數量。此外,如果數據庫操作昂貴,則可能會捆綁數據庫,從而進一步限制性能。
因爲這個原因,試圖爲數據庫查詢帶來執行時間總是值得的。如果你不能,那麼你必須小心你可以同時運行多少種類型的查詢。
編輯:
那麼,你是在什麼在SQL Server端真正感興趣...答案是...它取決於! CommandTimeout實際上是一個客戶端事件 - 你所說的是,如果查詢花費的時間超過了n秒,那麼我不想再等了。 SQL Server被告知這種情況,但它仍然需要處理它當前正在做什麼,所以在SQL Server完成查詢之前實際上可能需要一些時間。它會試圖優先考慮這一點,但就是這樣。
對於交易尤其如此;如果您正在運行包含在事務中的查詢,並且將其作爲異常管理的一部分回滾,那麼您必須等到回滾完成。
看到人們出現恐慌,並開始發出KILL命令來對照正在運行該查詢的SQL進程標識也很常見。如果命令運行一個事務,這通常是一個錯誤,但對於長時間運行的選擇通常是可以的。
SQL Server必須管理它的狀態,使其保持一致。客戶端不再監聽的事實意味着你已經浪費了工作,但SQL Server仍然必須自行清理。
所以,事物的ASP.Net一切都會好起來的,因爲它並不關心,但SQL Server仍然必須完成它開始的工作,或者達到可以放心安全工作的地步,或者回滾已打開的任何事務中的任何更改。
這顯然可能會對數據庫服務器產生性能影響,具體取決於查詢!
即使是長時間運行的SELECT或UPDATE或INSERT以外的事務也必須完成。 SQL Server會嘗試儘快放棄它,但前提是安全。顯然,對於UPDATES和INSERT尤其是,它必須達到數據庫仍然一致的地步。對於SELECT,它會嘗試儘快結束。
否;沒有辦法 - 你可以殺死SQL Server上的正在運行的進程,但是你真的只需要讓SQL Server管理它正在做的事情。與所有情況一樣,如果您選擇運行降低服務器性能的查詢,那麼您可以選擇:-) – dash 2012-03-20 10:23:25
您可以使用SQL KILL命令終止SQL Server上正在運行的進程。 KILL SPID並獲得SPID,您可以使用SELECT @@ SPID或從一個sys表中獲取所有當前進程。 – 2012-03-28 14:40:15