2012-09-25 11 views
10

W naszej branży hostujemy API oparte na REST, które jest hostowane przez Windows Azure i SQL Azure jako pamięć bazy danych.Limit czasu wygasł na SQL Azure; nie można odtworzyć w siedzibie SQL Server

Zarówno rola internetowa (Windows 2008R2, IIS 7.5, WCF, duża instancja), jak i SQL Azure są hostowane w regionie Europy Północnej.

Problem polega na tym, że kiedy wykonujemy intensywną pracę SQL, często dostajemy "Upłynął limit czasu, który upłynął przed zakończeniem operacji lub serwer nie odpowiada.".

To, co mnie tu niepokoi, to że bez względu na to, co robimy, nie możemy tego sprowokować na naszych lokalnych serwerach SQL (SQL Server 2008R2).

Każda pomoc w wyjaśnieniu tej tajemnicy jest doceniana, ponieważ wydaje się, że instancja roli sieciowej nie jest bezpośrednio rozmowna z instancją SQL Azure, chociaż oba znajdują się w Europie Północnej.

Bardziej szczegółowy wyjątek:

<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

Identyczne indeksy w dwóch bazach danych? Tak, usługa Azure SQL jest najprawdopodobniej wolniejsza w przypadku prostych zapytań z powodu opóźnień, ale 8-15 razy brzmi dość stromo dla tego samego schematu bazy danych. –

+0

Tak, "identyczne" schematy, w których SSMS 2012 generuje skrypt dla SQL Azure. "Identyczny", ponieważ wygenerowany skrypt nie jest równy 1-1 z SQL Server 2008R2. Mogę - do pewnego momentu - zrozumieć opóźnienie, ale czy nie powinno to zostać "wyeliminowane", gdy zarówno Internet, jak i SQL są w tym samym regionie? –

+0

I masz rację; 8-15 było przesadzone ... jest to więcej 4-8 razy wolniej (różne scenariusze, bo to jest "tylko" 4-5 razy wolniejsze), ale z brakującymi rekordami do przekroczenia limitu czasu. –

Odpowiedz

6

Jeśli trzeba zrobić SQL intensywne prace (na przykład, wiele INSERT w znormalizowanej bazy danych OLTP) trzeba mieć fail-over logiki w kodzie .

Lokalny serwer SQL nie ucierpi z powodu tego, więc należy wziąć to pod uwagę przed przejściem do SQL Azure.

Te dwa artykuły zainspirowały mnie (specjalne podziękowania do Joachim Isaksson orientacyjna):

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/

Podsumowując wyniku, mam pod warunkiem, że dwa wyniki, które jest teraz identyczne w wyniku (gdzie przed niektórymi rekordami, które nie zostały dodane, do brakującej logiki fail-over w odniesieniu do pierwotnego pytania: Limit czasu wygasł):

Lokalny serwer SQL: 179 285 rekordów w 427 sekundach

SQL Azure w. logika fail-over: 179,285 rekordów w 2,2447 sekundy - krztuszenie 5,2 razy wolniej!

Mam nadzieję, że pomoże to innym osobom zmagającym się z SQL Azure. Na plusie; dowiadujesz się (na własnej skórze), że masz szczęście i że jesteś uprzywilejowany w swoich wewnętrznych aplikacjach :-)

Uwaga: nadal chciałbym wyjaśnić, jak to się może zdarzyć ... wydaje się, że łatwo jest obwiniać opóźnienie, Nie?

Powiązane problemy