2012-09-25 24 views
10

在我們的業務線中,我們託管的是基於REST的API,由Windows Azure和SQL Azure託管爲數據庫存儲。超時在SQL Azure上超時;無法在本地複製SQL Server

Web角色(Windows 2008R2,IIS 7.5,WCF,大型實例)和SQL Azure都在北歐地區託管。

問題是,當我們進行密集的SQL工作時,我們經常會得到一個「Timeout expired。操作完成之前超時時間已到或服務器沒有響應。

這裏有什麼麻煩是,不管我們做什麼,我們都不能在我們的內部部署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> 
+0

兩個數據庫中的相同索引?是的,由於延遲問題,Azure SQL對於簡單查詢的速度可能較慢,但對於相同的數據庫模式,8-15倍聽起來非常陡峭。 –

+0

是,SSMS 2012爲SQL Azure生成腳本的「相同」模式。 「完全相同」,因爲SQL Server 2008R2生成的腳本不是1-1。我可以 - 在某種程度上 - 理解延遲,但是如果Web和SQL在同一個區域中,這不應該被「消除」嗎? –

+0

你說得對; 8-15被誇大了......它慢了4-8倍(不同的場景;因爲這只是「慢了4-5倍),但是缺少記錄會超時。 –

回答

6

如果你需要做的SQL密集的工作(例如,在一個標準化的OLTP數據庫中的很多INSERT語句),你需要有故障切換邏輯代碼。

內部部署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:427秒內179.285條記錄

SQL Azure w。故障切換邏輯:在2.247秒內記錄179.285個記錄 - 百分之五十二的慢速記錄!

我希望這可以幫助其他人與SQL Azure苦苦掙扎。積極的一面,你學習(困難的方式),你已經在你的本地內部應用程序中獲得了幸運和特權:-)

注意:我仍然想解釋如何發生這種情況..似乎容易責怪延遲,沒有?