나는 수백만 행 테이블에 대해 실행되는 특정 linq 쿼리가 실행하는 데 오래 걸리는 상황이 있습니다. linq 쿼리 출력을 해부하고 잘못된 데이터 형식을 사용하여 where 절에 대한 매개 변수를 만드는 것으로 나타났습니다. 예를 들어 한 필드는 데이터베이스에서 Char (12)로 정의되었지만 비교 대상인 매개 변수는 NVarChar (12)로 선언되었습니다. NVarChar 대신 Char를 사용하도록 쿼리를 변경 한 후에는 초 단위로 실행되었습니다. SQL에 linq을 사용하여 해당 열의 .dbml 파일에 정의 된대로 올바른 데이터 형식을 사용할 수 있습니까? 더블 체크하고 데이터 컨텍스트 .dbml 파일에서 DbType = "Char (12)"로 정의했습니다.linq에서 sql로 SQL 매개 변수에 올바른 데이터 형식을 사용하려면 어떻게해야합니까?
2
A
답변
2
명령을 가져 와서 매개 변수의 유형을 직접 (케이스의 ansi-string으로) 재설정 할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.data.dbtype.aspx
http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.getcommand.aspx
그런 다음 당신은 DbDataReader에서 항복, 그 명령에가 ExecuteReader를 호출 할 수 있습니다. 이 DbDataReader를 datacontext의 Translate 메서드에 전달하면 linq에서 기대할 수있는IEnumerable<T>
을 얻을 수 있습니다.
http://msdn.microsoft.com/en-us/library/bb534213.aspx
성능 문제가 질의 최적화에 의해 선택된 인덱스에 다른 타입을 가지는 쿼리 파라미터에 의해 발생
. 다음은 전체 색인이 유형으로 변환 된 입니다. 이는 쿼리가 발행 될 때마다 수행됩니다. 변환은 나중에 쿼리하기 위해 중단되지 않습니다. 데이터베이스에 문자열의 컬렉션을 보낼 때 나는 보통이 동작을 볼 수:
//this query will get correct parameter type
db.Customers.Where(c => c.Name == "Bob")
//this query can get incorrect parameter type
List<string> names = new List<string>(){"Amy", "Bob"};
db.Customers.Where(c => names.Contains(c.Name));
관련 문제
- 1. 왼쪽 SQL로 LINQ에서 조인
- 2. Linq에서 SQL로 SQL 뷰를 쿼리하는 방법은 무엇입니까?
- 3. Linq에서 SQL로 서브 쿼리
- 4. Linq에서 SQL로 ChangeConflictException이 발생했습니다.
- 5. F # : ByRef 의미론을 선언하고 매개 변수에 사용하려면 어떻게해야합니까?
- 6. Linq에서 조인에 복합 조건을 사용하려면 어떻게해야합니까?
- 7. .NET : LINQ에서 SQL로 Entity Framework로 변환
- 8. 내부 클래스에서 paramertized 제네릭 형식을 사용하려면 어떻게해야합니까?
- 9. Maven에 올바른 저장소를 사용하려면 어떻게해야합니까?
- 10. Linq에서 여러 열을 Sql로 반환 하시겠습니까?
- 11. Excel 외부 데이터 요청에서 매개 변수를 사용하려면 어떻게해야합니까?
- 12. 로그 LINQ에서 SQL로 생성 된 SQL을 NLog로
- 13. Linq에서 SQL로 데이터베이스에서 이미지 가져 오기
- 14. REST/WCF 서비스에서 LINQ에서 SQL로 데이터 집합을 반환
- 15. Linq에서 SQL로 큰 XML RAW를 읽는 방법?
- 16. Linq에서 외부 표현식을 EF4 (및 LINQKit)와 함께 사용하려면 어떻게해야합니까?
- 17. Objective-C에서 십진수 형식을 사용하려면 어떻게해야합니까?
- 18. 최종 변수에 생성자 대신 setter를 사용하려면 어떻게해야합니까?
- 19. LINQ에서 SQL로 Entity Framework로, 어떤 기능을 원하십니까?
- 20. Linq에서 SQL로 웹 서비스를 사용하는 이유는 무엇입니까?
- 21. LINQ에서 SQL로 레코드를 업데이트 할 수 없습니다.
- 22. 반복되는 레코드의 결과를 linq에서 SQL로 제거하는 방법
- 23. Linq에서 SQL로 DeleteAllOnSubmit을 수행하는 방법은 무엇입니까?
- 24. 생성 된 클래스를 LINQ에서 SQL로 serialize
- 25. Linq에서 SQL로 업데이트를 처리하는 방법은 무엇입니까?
- 26. LINQ에서 SQL로 생성 된 SQL을 재정의 하시겠습니까?
- 27. VaryByParam을 여러 매개 변수와 함께 사용하려면 어떻게해야합니까?
- 28. Automapper에서 데이터 세트를 사용하려면 어떻게해야합니까?
- 29. 어떻게 LINQ에서 SQL로 시계열의 데이터를 서브 샘플링 할 수 있습니까?
- 30. Linq에서 SQL로 전체 텍스트 검색 쿼리에서 순위를 얻는 방법은 무엇입니까?
NVARCHAR (12) 및 문자 (12)는을해서는 안 때문에 나쁜 캐시 된 실행 계획이 궁금하다 큰 차이. 적어도 나는 그들이해야한다고 생각하지 않는다. –
꽤 많은 테스트를 마친 후 확실히 그랬습니다. 각 쿼리를 실행하기 전에 쿼리 캐시를 지우고 데이터 유형을 변경하여 4 초에서 20ms로 변경했습니다. 나는 심지어 멀리 내 일반 SQL 쿼리에 전화를 내 linq를 변환하고 실행하는 데이터 컨텍스트의 .ExecuteQuery() 메서드를 사용하고 번개 빠른 실행합니다. SQL에서 테이블의 인덱스를 무시하게 만드는 데이터 유형 변환 문제입니다. – Jason