10

私たちの事業部門では、Windows Azureによってホストされ、データベースストレージとしてSQLAzureを使用するRESTベースのAPIをホストしています。

Webロール(Windows 2008R2、IIS 7.5、WCF、ラージインスタンス)とSQL Azureの両方が、北ヨーロッパ地域でホストされています。

問題は、集中的なSQL作業を行うと、「タイムアウトが期限切れになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません」というメッセージが表示されることがよくあります。

ここで私が困っているのは、何をしても、オンプレミスのSQLサーバー(SQL Server 2008R2)でこれを引き起こすことができないということです。

どちらも北ヨーロッパにありますが、Webロールインスタンスが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>
4

1 に答える 1

6

SQLを多用する作業(たとえば、正規化されたOLTPデータベース内の多数のINSERTステートメント)を実行する必要がある場合は、コードにフェイルオーバーロジックを含める必要があります。

オンプレミスのSQLサーバーはこれに悩まされることはないため、SQLAzureに切り替える前にこれを考慮してください。

これらの2つの記事は私にインスピレーションを与えました(指導してくれたJoachim Isakssonに特に感謝します):

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/

結果を要約すると、結果が同じになった2つの結果を提供しました(前に、追加されていないいくつかのレコードが、元の質問に関して欠落しているフェイルオーバーロジックを実行します:タイムアウトが期限切れになりました):

オンプレミスSQLServer:427秒で179.285レコード

SQLAzurew。フェイルオーバーロジック:2.247秒で179.285レコード-5.2倍遅くなります!

これが、SQLAzureで苦労している他の人に役立つことを願っています。ポジティブなことに; あなたは(難しい方法で)あなたがあなたのネイティブの社内アプリケーションで幸運で特権を持っていることを学びます:-)

注:これがどのように発生するかについての説明が必要です..レイテンシーのせいにするのは簡単なようですよね?

于 2012-09-25T17:44:44.017 に答える