Hyper-V에서 SQL Server를 실행할 때 “대기 작업 시간이 초과되었습니다” 있으며 VHD는 빠른 응답

Hyper-V 인스턴스에서 SQL Server (2012)를 실행하고 있습니다. 리소스가 많고 총 리소스를 25 % 보유하고 있으며 VHD는 빠른 응답 시간을 위해 매우 빠른 SSD 드라이브에 배치됩니다.

때때로 SQL Server를 사용하는 응용 프로그램에 잠시 동안 액세스하지 않은 경우 “대기 작업 시간이 초과되었습니다”라는 오류가 발생합니다. 데이터베이스를 다시로드하거나 다시 액세스 할 때 데이터베이스가 “깨어 난”것처럼 보이며 그 어느 때보 다 빠릅니다.

이런 종류의 환경에서이 소프트 슬립 모드가 발생하지 않도록하는 방법이 있습니까?

추가

예외 정보 : System.ComponentModel.Win32Exception : 대기 작업 시간이 초과되었습니다.



답변

이 명령을 실행하십시오 :

exec sp_updatestats

믿을 수 없을 정도로 문제를 해결했습니다.

명령이 실행되기 전에 오류 위의 코드입니다.

[Win32Exception (0x80004005): The wait operation timed out]

[SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +1742110
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5279619
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +242
   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1434
   System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +61
   System.Data.SqlClient.SqlDataReader.get_MetaData() +90
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +365
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite) +1355
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +175
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +134
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +41
   System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10
   System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +140
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +316
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable) +86
   System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +1482
   System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +21
   System.Web.UI.WebControls.DataBoundControl.PerformSelect() +138
   System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +30
   System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +79
   System.Web.UI.WebControls.BaseDataBoundControl.OnPreRender(EventArgs e) +22
   System.Web.UI.Control.PreRenderRecursiveInternal() +83
   System.Web.UI.Control.PreRenderRecursiveInternal() +155
   System.Web.UI.Control.PreRenderRecursiveInternal() +155
   System.Web.UI.Control.PreRenderRecursiveInternal() +155
   System.Web.UI.Control.PreRenderRecursiveInternal() +155
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +974

답변

나는 같은 문제가 있었다. 달리기 exec sp_updatestats는 때때로 효과가 있었지만 항상 그런 것은 아닙니다. NOLOCK쿼리 속도를 높이기 위해 쿼리에서 명령문 을 사용하기로 결정했습니다 . NOLOCKFROM 절 뒤에 추가 하십시오. 예 :

SELECT clicks.entryURL, clicks.entryTime, sessions.userID
FROM sessions, clicks WITH (NOLOCK)
WHERE sessions.sessionID = clicks.sessionID AND clicks.entryTime > DATEADD(day, -1, GETDATE())

여기 에서 전체 기사를 읽으 십시오 .


답변

나는 똑같은 문제를 겪었고 Hyper-V VM에서 메모리 할당이 충분하지 않기 때문에 발생했습니다. 메모리를 동적으로 설정했지만 필요에 따라 확장하지 못했습니다. 필자의 경우 32GB의 고정 메모리로 전환하면 문제가 해결되었습니다. SqlBulkCopy와 Sql Server 간의 상호 작용으로 필요할 때 더 많은 메모리를 확보 할 수 없습니다.