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의 서비스 중단 알림도 없었습니다. 사실 문제가 지속되는 동안 데이터베이스는 완전히 액세스 할 수 있었고 유일한 문제는 큰 문자열 값을 반환하는 필드와 관련된 느린 쿼리였습니다.단점은 더 이상 문제를 재현 할 수 없다는 것입니다.
(불규칙적으로 나타납니다) 푸른에서이 문제와 다른 사람을 위해,이 문제의 진단 증상은 다음과 같습니다
- 더 푸른-SQL하지 서버 중단하지 않는 쿼리에 대한
- 건강한 응답 시간 A) 연결 시간 초과 오류 : 반환 큰 문자열은 큰 문자열이 종속 응용 프로그램에서
- 이 오류의 두 가지 유형의 연결 응용 프로그램에 의해 발생되는 값 반환하는 경우에도, 어떤 쿼리의 푸른-SQL 서버의
- 일반 리소스 사용을 값 , d b) 닫힌 연결 오류. 두 가지 유형의 오류가 발생하면 구별되는 문맥 정보는 없습니다.
- 긴 문자열을 포함하는 쿼리의 응답 시간은 반환 된 문자열의 길이에 지수 적입니다. 예를 들어, 10 문자는 순간적이며, 50000은 10 초, 500000은 분이 걸립니다. 그러나 응답 시간은 일정하지 않습니다.
- 긴 문자열 값을 반환 할 필요가없는 서버에서 전체적으로 수행되는 문자열 처리 (매우 긴 문자열에서도)는 정상적인 시간이 걸립니다.
누군가가 실제 답변을했을 경우를 대비하여이 질문을 열어 두 겠지만 해결책은 단순히 Azure가 요청 처리에 대해 수정 한 사항을 해결할 때까지 기다리는 것입니다. 이 문제는 서버에서 처리하는 것이 아니라 Azure DB에서 데이터를 전송하는 것과 관련이있는 것 같습니다. 위의 증상으로 인해 문제가 발생한 경우 개발 상자에서 완벽하게 작동하는 코드를 분해하지 않는 것이 가장 좋습니다.
실행 계획, 쿼리가 실행되는 동안 대기 유형 및 데이터베이스 계층 – TheGameiswar
과 함께 일부 샘플 데이터를 다시 작성할 수있는 예제를 제공해주십시오. 몇 가지 아이디어 : 연결 문자열의 패킷 크기를 늘리십시오. 또한 app 및 db 서버가 동일한 지역에 있는지 확인하십시오. 연결에서 암호화를 해제하십시오. 결국 네트워크와 관련된 것으로 들립니다. – leppie
Azure 테이블 저장소에 Json 데이터를 저장하는 것이 좋습니다. –