홈>
EF Core 3.1은 열별로 필터링 할 때 성능이 저하 된 쿼리 (인덱스 누락으로 인해)를 생성합니다.
문제를 일으키는 열은 다음과 같습니다.
builder.Property(p => p.Id)
.HasConversion(
value => value.Value,
dbValue => new LocationId(dbValue)
)
.HasMaxLength(50);
LocationId는 값 객체입니다
쿼리는 다음 코드에서 생성됩니다.
_repository.Query.FirstOrDefaultAsync(l => l.Id == "DD212334234");
여기서 _repository.Query는 기본적으로 DbSet of Locations입니다.
생성 된 쿼리는 다음과 같습니다.
SELECT TOP 1 * FROM [locations] as [l] WHERE CAST([l].[Id] AS nvarchar(max)) = 'DD212334234'
CAST 대 nvarchar (max)에 유의하십시오. 열 ID는 nvarchar (50)이며 색인이 있습니다. 2.5M 레코드에 대한 위의 쿼리는 약 1.2 초 동안 실행됩니다. CAST를 제거하고 쿼리를 실행하면 100ms 동안 완료됩니다.
이것을 분류하는 데 도움이 될 것입니다.
업데이트 : 내 DbContext는 다음으로 빌드됩니다.
builder.UseSqlServer(options.ConnectionString, x =>
{
x.MigrationsAssembly(assemblyName);
x.MigrationsHistoryTable($"__migrations_{contextName}");
x.UseNetTopologySuite();
});
또 다른 업데이트 :
.HasConversion (...)을 주석 처리하면 CAST없이 쿼리가 생성됩니다. LocationId는 다음과 같습니다.
public class LocationId : ValueObject
{
private LocationId(string value)
{
Value = value.ToUpperInvariant();
}
public string Value { get; }
public static implicit operator string(LocationId c) => c.Value;
public static explicit operator LocationId(string s) => new LocationId(s);
...
}
- 답변 # 1
관련 자료
- c++ - c ++ 20 개념이 관련되어있을 때 gcc와 clang간에 일관되지 않은 동작
- pdfBox로 만든 PDF에서 일치하지 않는 부모 트리 매핑을 치료하는 방법
- Eclipse에서 Java Maven 모듈의 일관되지 않은 동작
- react native - createdrawernavigator - 일관성없는 닫기 동작?
- C # 8 널 입력 가능 참조 유형 처리에서 일관되지 않은 동작
- youtube api - iframe에서 loop = 1과 일치하지 않는 동작
- XDEL 이후 XREAD를 차단하는 Redis 스트림의 일관성없는 동작
- python - 팬더가 목록에 대해 일관되지 않은 동작을 변환
- 파이썬 3을 나열하기 위해 바이트를 연결하는 일관되지 않은 동작
- SignalR | SSHNET | 일관되지 않은 행동
- c++ - glDrawElementsInstanced를 사용하여 인스턴스 렌더링에서 일관되지 않은 동작, 오류없이 렌더링 없음
- Apache Camel에서 Quartz2 스케줄러의 일관되지 않은 동작
- c++ - libc ++ 및 glibc에서 double을 구문 분석 할 때 일치하지 않는 문자열 스트림 동작
- c++ - 사용하지 않는 문자열의 컴파일러 최적화 동작이 일치하지 않습니다
- cqrs - 일관되지 않은 이벤트 동작으로 이벤트 소싱
- 파이썬 슬라이스 [ - ] 일치하지 않는 동작
- binary tree - Go에서 일관성없는 추가 동작?
- scala - 데이터 흐름 템플릿 기능이 일관되지 않습니까?
문제는 운영자에 의해 발생합니다
표정을 강조하다
실제로
번역 된 SQL에서 CAST로 연결됩니다.
처음에는 테스트에서 두 가지 변환이 모두 암시 되었기 때문에 재현 할 수 없었습니다.
위의 표현은 실제로
생성 된 SQL에 CAST를 도입하지 않습니다.
해결책은 운영자를
LocationId
암시 적 또는 명시 적 캐스트 사용또는
LocationId
건설자또는
LocationId
변하기 쉬운.또는 일반적으로 클라이언트 유형 비교.