2016-08-23 2 views
4

Azure 데이터베이스에 쿼리에 느리게 응답하는 테이블이 있습니다. I 쿼리의 [JSON] 항목을 포함 할 때SQL Azure의 큰 NVARCHAR 값을 가진 열을 포함하는 쿼리가 느림

SELECT [Id] --nvarchar(128), PrimaryKey 
     ,[Name] --nvarchar(max) 
     ,[Description] --nvarchar(max) 
     ,[Modified] --datetime2(7) 
     ,[LastModifiedBy] --nvarchar(max) 
     ,[Opened] --datetime2(7) 
     ,[Editor] --nvarchar(max) 
     ,[Json] --nvarchar(max) <--THIS IS GIVING ME PROBLEMS 
     ,[IsActive] --bit 
    FROM [dbo].[TableName] 

구체적으로, 상기 SQL 쿼리 성능 분 초 미만에서 진행 : 같이 쿼리 보인다. [Json] 열이 포함되어 있으면 단 하나의 레코드 만 요청할 수도 있습니다. 이 열은 긴 json 형식 문자열 (~ 500000 자)을 포함합니다. 이 열이 포함되어있을 때만 성능이 저하됩니다. 더 작은 문자열을 포함하는 다른 NVARCHAR (최대) 열은 문제가되지 않습니다.

var model=await db.TableName.FirstOrDefaultAsync(s => s.Id == id); 

위처럼 찾고 SQL 쿼리를 생성 :

내가 엔티티 프레임 워크 LINQ - 투 - 엔티티 쿼리를 사용하여 MVC5 애플리케이션의 성능 문제를 통해이 문제를 발견했다. 로컬 개발 컴퓨터에서 문제없이 실행 된 단일 사례에 대한 Edit 메서드는 서버에서로드하는 데 분 단위가 걸렸습니다. 그런 다음 직접 db 쿼리를 조사하여 문제가 무엇인지 파악하고 긴 쿼리 시간을 발견했습니다.

이 성능 문제는 다른 쿼리 방법에 따라 일관성이 없습니다.

나는 다음 쿼리로 3 분 소요 시간이 있습니다

SELECT Json FROM [dbo].[TableName] WHERE [Id]=<id> 

처리 시간이 반환 된 문자열 길이 기하 급수적으로 비례한다. 예를 들어,이 쿼리는 약 10 초 소요 :

는 다음과 같은 서버에서
SELECT SUBSTRING(Json,1,50000) FROM [dbo].[TableName] WHERE [Id]=<id> 

쿼리가 두 번째 :

DECLARE @variable nvarchar(max); 
SELECT @variable=Json FROM [dbo].[TableName] where Id='<id>'; 
SELECT LENGTH(@variable); 

보다 걸릴을 실제로 다음과 같이 데이터를 검색하는 날 다시한다 몇 분까지 :

DECLARE @variable nvarchar(max); 
SELECT @variable=Json FROM [dbo].[TableName] where Id='<id>'; 
SELECT @variable; 

내 궁극적 인 목표는, 엔티티 프레임 워크의 LINQ - 투 - 엔티티 그래서 C#으로 데이터를 사용할 수있는 합리적인 속도로 수행 할 쿼리 얻는 방법을 파악한다 나는 EF가 그러한 쿼리를 동적으로 생성하도록 강요 할 수 있다고 생각하지 않습니다.

큰 문자열을 저장하는 다른 테이블에서는이 어려움을 경험하지 못했습니다. 실수로 잘못 설정 한 설정이 있습니까? 아니면이 상황에서 EF linq-to-SQL 문을 작성하는 것이 가장 좋습니다.

같은 데이터베이스 복사본을 사용하여 SQL Server의 로컬 인스턴스에서 쿼리를 실행할 때 성능 문제는 없습니다. 모든 쿼리는 1 초 이내에 반환됩니다.

-UPDATE-

나는 모니터링되었으며,이 문제는 코드 변경없이 사라졌다. 모든 쿼리 응답 시간은 1 초 미만입니다. 그러나 Azure의 서비스 중단 알림도 없었습니다. 사실 문제가 지속되는 동안 데이터베이스는 완전히 액세스 할 수 있었고 유일한 문제는 큰 문자열 값을 반환하는 필드와 관련된 느린 쿼리였습니다.

단점은 더 이상 문제를 재현 할 수 없다는 것입니다.

(불규칙적으로 나타납니다) 푸른에서이 문제와 다른 사람을 위해

,이 문제의 진단 증상은 다음과 같습니다

  1. 더 푸른-SQL하지 서버 중단하지 않는 쿼리에 대한
  2. 건강한 응답 시간 A) 연결 시간 초과 오류 : 반환 큰 문자열은 큰 문자열이 종속 응용 프로그램에서
  3. 이 오류의 두 가지 유형의 연결 응용 프로그램에 의해 발생되는 값 반환하는 경우에도, 어떤 쿼리의 푸른-SQL 서버의
  4. 일반 리소스 사용을 값 , d b) 닫힌 연결 오류. 두 가지 유형의 오류가 발생하면 구별되는 문맥 정보는 없습니다.
  5. 긴 문자열을 포함하는 쿼리의 응답 시간은 반환 된 문자열의 길이에 지수 적입니다. 예를 들어, 10 문자는 순간적이며, 50000은 10 초, 500000은 분이 걸립니다. 그러나 응답 시간은 일정하지 않습니다.
  6. 긴 문자열 값을 반환 할 필요가없는 서버에서 전체적으로 수행되는 문자열 처리 (매우 긴 문자열에서도)는 정상적인 시간이 걸립니다.

누군가가 실제 답변을했을 경우를 대비하여이 질문을 열어 두 겠지만 해결책은 단순히 Azure가 요청 처리에 대해 수정 한 사항을 해결할 때까지 기다리는 것입니다. 이 문제는 서버에서 처리하는 것이 아니라 Azure DB에서 데이터를 전송하는 것과 관련이있는 것 같습니다. 위의 증상으로 인해 문제가 발생한 경우 개발 상자에서 완벽하게 작동하는 코드를 분해하지 않는 것이 가장 좋습니다.

+0

실행 계획, 쿼리가 실행되는 동안 대기 유형 및 데이터베이스 계층 – TheGameiswar

+0

과 함께 일부 샘플 데이터를 다시 작성할 수있는 예제를 제공해주십시오. 몇 가지 아이디어 : 연결 문자열의 패킷 크기를 늘리십시오. 또한 app 및 db 서버가 동일한 지역에 있는지 확인하십시오. 연결에서 암호화를 해제하십시오. 결국 네트워크와 관련된 것으로 들립니다. – leppie

+0

Azure 테이블 저장소에 Json 데이터를 저장하는 것이 좋습니다. –

답변

0

이 NVARCHAR (최대) 반환과 일반적인 문제 같은 소리 그래서 아마이 푸른 지원팀에 문의하는 것이 좋습니다 것 : https://feedback.azure.com/forums/217321-sql-database/category/129652-bugs : 푸른는 SQL DB 피드백 사이트에서 버그로

  • 신고를 트위터에
  • 연락 @AzureSupport
  • 푸른 포털을 통해
  • 보내기 지원 요청 : 데이터베이스/진단 및 해결 문제
  • 확인 서비스 건강 푸른 포털을 통해

이 문제는 재현 될 수 없으며 코드에 수정 사항이 없으므로 Azure 지원 팀 이외의 다른 사람이 어떻게 도움을 줄지 알 수 없습니다.

1

쿼리에 [Json] 열을 포함하면 문제가 무엇인지 생각하고 있기 때문에이 오류를 재현 할 수 없다는 것이 정말 잘못되었습니다. 쿼리 성능은 1 초도 채 걸리지 않습니다. " 또한 나에게 단서 주었다

는 다음과 같은 서버에서

쿼리보다 덜 걸릴을 두 번째 :

데이터를 검색하는 것은 문제가, 당신은 대기 유형의 문제를 가지고있다
DECLARE @variable nvarchar(max); 
SELECT @variable=Json FROM [dbo].[TableName] where Id='<id>'; 
SELECT LENGTH(@variable); 

: ASYNC_NETWORK_IO. 기본적으로 SQL Server에서 데이터를 보내고 대기중인 응용 프로그램에 문제가 있습니다.

나는 응용 프로그램이 어디에서 실행 중인지 물어볼 것입니다. 응용 프로그램은 푸른 하늘에 데이터베이스와 동일한 데이터 센터에 있거나 데이터 센터 외부에서 실행 중입니까? 응용 프로그램을 데이터에 더 가깝게 만들수록이 대기 유형이 줄어 듭니다.

내가 물어볼 다른 질문은 응용 프로그램을 실행하는 하드웨어에 관한 것이고, 모든 데이터를 수신하고 유용한 방식으로 처리 할 수있는 충분한 메모리가 있는지 여부입니다. 때때로 네트워크 대기는 실제로 응용 프로그램 쪽의 전원이 켜진 하드웨어에서 문제가됩니다.

공유 할만한 또 다른 생각이 있습니다. 매우 큰 JSON 개체를 다룰 계획이라면 Azure SQL 데이터베이스 대신 DocumentDB를 사용하여 저장해 보았습니까? 이러한 종류의 작업로드에 최적화되어 있으며 T-SQL을 작성하여 DocumentDB에 저장된 JSON 파일을 쿼리 할 수 ​​있습니다.

대하여 : 의존 애플리케이션에서

를 오류 두 가지 유형의 연결 응용 프로그램에 의해 발생된다 : a) 접속 시간 초과 오류, 및 B) 연결 오류를 닫았다. 두 가지 유형의 오류가 발생하면 구별되는 문맥 정보는 없습니다.

데이터베이스를 사용하는 모든 응용 프로그램에서 일종의 재시도 정책이 필요합니다. Azure SQL 데이터베이스를 다룰 때 매우 중요합니다. 특정 시점에 데이터베이스 사본이 세 개 있기 때문에 하루 중 언제라도 장애 조치가 필요할 수 있습니다. 재시도 정책이있는 경우 최종 사용자는 2 차 사본을 1 초 내에 사용할 수 있으므로 문제가 있다는 것을 결코 알 수 없습니다.

도움이 되었기를 바랍니다.

+0

위의 내용은 모두 모범 사례이며이 문제가 발생하기 전에 있었던 모범 사례입니다. 응용 프로그램과 데이터베이스는 모두 Azure에 있고 모든 db 호출은 비동기였으며 재시도 정책을 사용한 10 번의 시도 후에 오류가 최종 예외가되었습니다. 안타깝게도 응용 프로그램의 최종 목적지는 개인 서버이므로 DocumentDb는 옵션이 아닙니다. 자체적으로 해결 된 코드 자체가 변경 되었기 때문에 문제가 다시 발생하지 않았습니다. – longestwayround

+0

DocumentDB에서 결과를 통해 파일 전송을 통해 JSON 객체를 효과적으로 검색 할 수 있습니다. DocumentDB는 BLOB 저장소의 특수 구현물 일뿐입니다. . 제 점이 다시 _ 생하면 대기 유형의 ASYNC_NETWORK_IO에주의하십시오. 나는 그때 도움을 줄 수 있을지도 모른다. 잘만되면 문제는 결코 되돌아 오지 않을 것이다. 그리고 당신은 명백하다! –

관련 문제