엔티티 프레임 워크 Arithabort 에,하지만 여전히 쿼리가 느리

0

질문

내가 있는 간단한 쿼리

var count =  await _context.ExchangeRate.AsNoTracking().CountAsync(u => u.Currency == "GBP");

테이블에 있는 3 열과 10 행 데이터입니다.

가 쿼리를 실행합에서 순 5 프로젝트 그것은 약 2.3 초간 500ms(+-100)이후에 요청합니다. When I hit 같은 요청 또는 카탈로그 뷰 쿼 그것은 반환에서 시간도 거의 없(45ms 에서 볼 수 있듯이 sql 프로파일러).

를 구현하고 있습니다 ARITHABORT 에서 EF 에서 여기

내가 볼 때에 SQL 프로파일 설정 ARITHABORT 에만 여전히 쿼리에는 동일한 시간에 대해 첫번째 요청과 이후 요청합니다.

sql profiler screen shot

을 어떻게 달성 속도와 같은 SSMS 쿼리 속도입니다. 내가 필요한 쿼리를 실행 속도 정말로 프로젝트 요구 사항을 반환 응답에서는 1 초(을 만들 필요가 적어도 5 개의 간단한 DB 를 호출하면...1 전화를 걸리는 500ms 그것은 횡단 1 두 번째 요구 사항)

편집

려와도 ADO.Net. 실행 시간이 걸렸에서 볼 수 있듯이 SQL 프로파일은 40ms 어디로 때 그것은 도달하는 코드는것은 거의 400ms. 그래서 많은 차이

        using (var conn = new SqlConnection(connectionString))
        {
            var sql = "select count(ExchangeRate) as cnt from ExchangeRate  where Currency = 'GBP'";

            SqlCommand cmd = new SqlCommand();

            cmd.CommandText = "SET ARITHABORT ON; " + sql;
            cmd.CommandType = CommandType.Text;
            cmd.Connection = conn;
            conn.Open();
            var t1 = DateTime.Now;
            var rd =  cmd.ExecuteReader();
            var t2 = DateTime.Now;
            TimeSpan diff = t2 - t1;

           Console.WriteLine((int)diff.TotalMilliseconds);
          
          while (rd.Read())
          {
               Console.WriteLine(rd["cnt"].ToString());
          }
            conn.Close();
        }
1

최고의 응답

0

"너의 처음 실행"시나리오가 일반적으로 하는 정적의 초기화 DbContext. 이것은 어디 DbContext 작품으로 맵핑한 것이다 발생할 때 첫 번째 쿼리가 실행됩니다. 일반적인 접근 방식이 발생하고 사용자는 간단한"따뜻"쿼리가 실행하는 경우 서비스가 시작됩니다.예를 들면 후의 서비스는 초기화,단순히 넣은 다음과 같습니다.

// Warm up the DbContext
using (var context = new AppDbContext())
{
    var hasUser = context.Users.Any();
}

이것은 또한 제공으로 빠른 시작을 확인하는 데이터베이스에 접근할 수 있고 응답하지 않습니다. 쿼리 자신을 할 것입니다 아주 빠른 작업을,하지만 DbContext 해결됩니다 그 매핑에서 이 시간 그래서 어떤 새로 생성된 DbContext 경우 응답을 들이지 않고 그 비용을 요청하는 동안.

로 raw 성과,그렇지 않은 경우 쿼리를 걸릴 것으로 예상된다면 묶어,요청 하지 않async. 비동기 요청이 있는 빠르게,그들은 실제로 조금 느려집니다. 용 async 에 대한 요청을 DbContext 은 보장에 대해 귀하의 웹 서버/스레드 응용 프로그램은 반응하는 동안 잠재적으로 많은 비용이 드는 데이터베이스 작업을 처리합니다. 고 싶은 경우 응답 가능한 한 빨리,사용하는 동기식 전화입니다.

다음 확인된 필드를 필터링에 대하여,이 경우에는 통화,인덱싱되어 있습니다. 데 필드 통화에서 당신의 엔티티로 문자열이 아닌 CurrencyId FK(int)을 가리키는 통화 기록은 이미 추가 인덱싱 비용으로 인덱스에 정수 작/것보다 더 빨리 그에 문자열입니다.

당신은 또한 귀찮게 할 필요가 없으로 AsNoTracking 사용하는 경우 Count 쿼리가 있습니다. AsNoTracking 에게만 적용된 경우 반환하는 단체(ToList/ToArray/Single/First등.) 는 것을 방지하기 위해 DbContext 들고에 대한 참조는 반환된다. 을 사용할 때 Count/Any 또는 프로젝션을 반환성요소에서 사용하는 Select 이 없는 엔티티에 반환합니다.

또한 고려한 네트워크 대기 시간이 어디에의 응용 프로그램 코드를 실행하고 데이터베이스 서버입니다. 그들은 같은 컴퓨터 또는 네트워크 연결을 해야 할까요? 이것은 어떻게 비교할을 수행할 때 SSMS query? 를 사용하여 프로파일 당신이 볼 수있는 어떤 SQL EF 실제로 보내는 데이터베이스에 있습니다. 다른 모든 측면에서의 시간의 비용으로 받고:이 요청을 DB 을 받고,결과 데이터를 요청자,구문 분석하는 응답이다. (경우에는 경우에는 반품은 엔터티를 할당하기기,검사에 대해 기존의 참조,등등....의 경우에는 계산 etc. 검사는 기존 참조)

마지막으로,을 보장 받고 있는 최고의 성능하는지 확인 DbContexts 수명은 짧습니다. 는 경우 DbContext 유지 열리고 있었의 번호를 추적하는 쿼리 실행에 대하여서(선체 없이 AsNoTracking의)추적 실체 참조를 축적하고 있을 수 있는 부정적인 성능에 영향을 미래의 쿼리가 사용하는 경우에도 AsNoTracking 로 EF 보이는지 확인을 통해 그것의 추적 참조를 위한 엔티티가 적용될 수 있/과 관련된 새로운 쿼리를 처리합니다. 많은 시간을 내가 보는 개발자들이 DbContexts 는"비싸다"그래서 그들이 선택를 인스턴스화하는 가능한 한 작은 피하는 그 비용을 끝까지만 만드는 작업이 더 비싸다.

과 함께 모든 것으로 간주,EF 것 으로 빠른 원 SQL. It is an ORM 디자인에 대한 편의를 제공하기 위해.Net 응용 프로그램에 올 때 일이터를 활용하고 있습니다. 는 것에서 모든 작업은 엔터티 클래스 오히려 살균와 쓰기에 자신의 원 SQL 시간 비용으로 온다.

2021-11-23 21:59:24

마찬가지로 지금까지 귀하의 의견에 대한 네트워크는 대기 시간을 모두 SSMS&Net 코드는 내 컴퓨터에..db 서버에 있고 다른 것이 내가 하나만 있을 쿼리(이 POC). 그래서 동일한 네트워크는 대기 시간 SSMS 이 가져올 수 있에 40ms 곳으로는 코드가 500ms.....도와 함께 ADO.NET 에서 볼 수 있듯이,질문에 모두는 500ms
CrazyMonk

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................