Время ожидания истекает на SQL Azure; не может быть воспроизведен на сервере SQL Server

В нашей сфере деятельности мы размещаем API на основе REST, который размещается в Windows Azure и с SQL Azure в качестве хранилища баз данных.

Как веб-роль (Windows 2008R2, IIS 7.5, WCF, Большой экземпляр), так и SQL Azure размещаются в регионе Северной Европы.

Проблема заключается в том, что при интенсивной работе SQL мы часто получаем "Истекло время ожидания". Период ожидания истекает до завершения операции или сервер не отвечает. ".

Меня беспокоит то, что независимо от того, что мы делаем, мы не можем это спровоцировать на наших локальных серверах SQL (SQL Server 2008R2).

Любая помощь в разъяснении этой тайны оценивается, поскольку кажется, что экземпляр веб-роли напрямую не разговаривает с экземпляром SQL Azure, хотя оба они расположены в Северной Европе.

Более подробное исключение:

<SqlException>
    <Message>Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.</Message>
    <StackTrace>
        <Line>at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)</Line>
        <Line>at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()</Line>
        <Line>at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)</Line>
        <Line>at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()</Line>
        <Line>at System.Data.SqlClient.SqlDataReader.get_MetaData()</Line>
        <Line>at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)</Line>
        <Line>at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)</Line>
        <Line>at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)</Line>
        <Line>at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)</Line>
        <Line>at System.Data.SqlClient.SqlCommand.ExecuteScalar()</Line>
        <Line>at SyncInvokeAddCollaboratorFieldInstance(Object , Object[] , Object[] )</Line>
        <Line>at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)</Line>
        <Line>at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)</Line>
        <Line>at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)</Line>
        <Line>at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&amp; rpc)</Line>
        <Line>at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</Line>
    </StackTrace>
    <UserDefinedInformation>
        <HelpLink.ProdName><![CDATA[Microsoft SQL Server]]></HelpLink.ProdName>
        <HelpLink.ProdVer><![CDATA[11.00.2065]]></HelpLink.ProdVer>
        <HelpLink.EvtSrc><![CDATA[MSSQLServer]]></HelpLink.EvtSrc>
        <HelpLink.EvtID><![CDATA[-2]]></HelpLink.EvtID>
        <HelpLink.BaseHelpUrl><![CDATA[http://go.microsoft.com/fwlink]]></HelpLink.BaseHelpUrl>
        <HelpLink.LinkId><![CDATA[20476]]></HelpLink.LinkId>
    </UserDefinedInformation>
</SqlException>

Ответ 1

Если вам нужно выполнить интенсивную работу SQL (например, множество инструкций INSERT в нормализованной базе данных OLTP), вам необходимо иметь в своем коде логику сбоя.

Внутрисердечный SQL-сервер не пострадает от этого, поэтому учтите это перед переходом на SQL Azure.

Эти две статьи вдохновили меня (особая благодарность Иоахим Исакссон за руководство):

http://blogs.msdn.com/b/sqlazure/archive/2010/05/11/10011247.aspx

http://social.msdn.microsoft.com/Forums/en-US/ssdsgetstarted/thread/7a50985d-92c2-472f-9464-a6591efec4b3/

В сумме результата я представил два результата, которые теперь идентичны в результате (где перед некоторыми записями, где не добавлено, к отсутствующей логике с ошибкой в ​​отношении исходного вопроса: Timeout Expired):

Внутренний SQL Server: 179.285 записей за 427 секунд

SQL Azure w. логика с ошибкой: 179,285 записей за 2,247 секунды - в 5,2 раза медленнее!

Надеюсь, это поможет другим, кто борется с SQL Azure. На положительной ноте; вы учитесь (трудный путь), что вам повезло и привилегировано в ваших собственных внутренних приложениях: -)

Примечание: мне все равно хотелось бы объяснить, как это может случиться. Кажется, легко обвинять в латентности, нет?