2012-09-25 24 views
10

Trong dòng kinh doanh của chúng tôi, chúng tôi đang lưu trữ một API dựa trên REST được lưu trữ bởi Windows Azure và với SQL Azure làm cơ sở dữ liệu lưu trữ.Hết giờ hết hạn trên SQL Azure; không thể sao chép tại chỗ tiền đề SQL Server

Cả Vai trò web (Windows 2008R2, IIS 7.5, WCF, Ví dụ lớn) và SQL Azure được lưu trữ ở khu vực Bắc Âu.

Vấn đề là, khi chúng tôi thực hiện công việc SQL chuyên sâu, chúng tôi thường bị hết thời gian chờ là . Thời gian hết hạn trước khi hoàn thành thao tác hoặc máy chủ không phản hồi "..

Điều phiền hà tôi ở đây là, bất kể chúng tôi làm gì, chúng tôi không thể kích động điều này trên các máy chủ SQL tại chỗ của chúng tôi (SQL Server 2008R2).

Bất kỳ trợ giúp nào trong việc làm rõ bí ẩn này được đánh giá cao vì có vẻ như cá thể Vai trò Web không trực tiếp nói đến cá thể SQL Azure mặc dù cả hai đều nằm ở Bắc Âu.

Một ngoại lệ chi tiết hơn:

<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

Chỉ mục giống nhau trong hai cơ sở dữ liệu? Có, Azure SQL có nhiều khả năng chậm hơn cho các truy vấn đơn giản do độ trễ, nhưng 8-15 lần âm thanh khá dốc cho cùng một lược đồ cơ sở dữ liệu. –

+0

Yep, lược đồ "giống hệt" trong đó SSMS 2012 tạo tập lệnh cho SQL Azure. "Giống hệt" bởi vì tập lệnh được tạo không phải là 1-1 với SQL Server 2008R2. Tôi có thể - đến một thời điểm nào đó - hiểu được độ trễ, nhưng điều này không nên "loại bỏ" khi cả Web và SQL ở cùng một vùng? –

+0

Và bạn đúng; các 8-15 đã phóng đại .. nó nhiều hơn 4-8 lần chậm hơn (kịch bản khác nhau, cho điều này nó "chỉ" 4-5 lần chậm hơn), nhưng với các bản ghi thiếu làm thời gian chờ. –

Trả lời

6

Nếu bạn cần phải làm công việc chuyên sâu SQL (ví dụ, rất nhiều câu lệnh INSERT trong một cơ sở dữ liệu OLTP bình thường), bạn cần phải có fail-over logic trong mã của bạn .

Máy chủ SQL tại chỗ sẽ không bị điều này, vì vậy hãy cân nhắc điều này trước khi chuyển sang SQL Azure.

Hai bài viết cảm hứng cho tôi (đặc biệt nhờ Joachim Isaksson để được hướng dẫn):

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/

Tổng hợp các kết quả, tôi đã cung cấp hai kết quả mà bây giờ là giống hệt nhau trong kết quả (trước khi một số bản ghi không được thêm vào để thiếu logic không vượt quá liên quan đến câu hỏi gốc: Hết giờ hết hạn):

Máy chủ SQL tại chỗ: 179.285 bản ghi trong 427 giây

SQL Azure w. logic không thành công: 179.285 bản ghi trong 2.247 giây - chậm hơn gấp 5 lần so với con số 5,2 lần!

Tôi hy vọng điều này có thể giúp người khác đấu tranh với SQL Azure. Trên một lưu ý tích cực; bạn học (theo cách khó) mà bạn đã may mắn và được ưu tiên trên các ứng dụng nội bộ của bạn :-)

Lưu ý: tôi vẫn muốn giải thích cách điều này có thể xảy ra ... có vẻ dễ đổ lỗi về độ trễ, Không?