2009-11-04 3 views
2

나는 수백만 행 테이블에 대해 실행되는 특정 linq 쿼리가 실행하는 데 오래 걸리는 상황이 있습니다. linq 쿼리 출력을 해부하고 잘못된 데이터 형식을 사용하여 where 절에 대한 매개 변수를 만드는 것으로 나타났습니다. 예를 들어 한 필드는 데이터베이스에서 Char (12)로 정의되었지만 비교 대상인 매개 변수는 NVarChar (12)로 선언되었습니다. NVarChar 대신 Char를 사용하도록 쿼리를 변경 한 후에는 초 단위로 실행되었습니다. SQL에 linq을 사용하여 해당 열의 .dbml 파일에 정의 된대로 올바른 데이터 형식을 사용할 수 있습니까? 더블 체크하고 데이터 컨텍스트 .dbml 파일에서 DbType = "Char (12)"로 정의했습니다.linq에서 sql로 SQL 매개 변수에 올바른 데이터 형식을 사용하려면 어떻게해야합니까?

+0

NVARCHAR (12) 및 문자 (12)는을해서는 안 때문에 나쁜 캐시 된 실행 계획이 궁금하다 큰 차이. 적어도 나는 그들이해야한다고 생각하지 않는다. –

+0

꽤 많은 테스트를 마친 후 확실히 그랬습니다. 각 쿼리를 실행하기 전에 쿼리 캐시를 지우고 데이터 유형을 변경하여 4 초에서 20ms로 변경했습니다. 나는 심지어 멀리 내 일반 SQL 쿼리에 전화를 내 linq를 변환하고 실행하는 데이터 컨텍스트의 .ExecuteQuery() 메서드를 사용하고 번개 빠른 실행합니다. SQL에서 테이블의 인덱스를 무시하게 만드는 데이터 유형 변환 문제입니다. – Jason

답변

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)); 
관련 문제