2011-03-25 14 views
2

나는 여기에 대한 짜증나 무엇 SQL 프로파일 러에서 LINQ에 의해 만들어진 SQL 쿼리를 복사 .. 그것은에서 선택 ..columnNames .. 접두사Linq 쿼리가 너무 느립니다?

  1. (..columnNames을 선택에서 (보기에서 CNAMES을 선택) 댓글 : 2 SELECT 문 여기가 불필요

  2. 이 쿼리 내가 @p_ LINQ _0처럼 모든 PARAMS을 포함, 마지막 줄을 제거 할 때

  3. 을 실행 14 초 정도 걸립니다. .. 그리고 조건에서 param 값을 채우고 1 초 이하의 매우 동일한 동적 쿼리를 실행합니다. 그렇지 않은 경우에도이 쿼리는 SQL Studio에서 수행 할 때 0 초가 걸립니다. 이것은 linq의 절름발이입니다.

나는 저장된 프로 시저이 이동할 수도 있지만 난 내가 발견 추가 연구 후 LINQ 지금

를 사용 무서워 :

쿼리 1 :

exec sp_executesql N'SELECT * from TableView WHERE Id = @Id', N'@Id int', @Id = 1 

쿼리 2 :

exec sp_executesql N'SELECT * from TableView WHERE Id = 1' 

쿼리 1은 12 초, 쿼리 2는 0 초가 걸립니다. 이것은 왜 linq 쿼리가 느린지를 설명합니다. 이제는 저장 프로 시저를 항상 사용해야한다는 의미입니까 아니면 놓친 것입니까?

왜 마이크로 소프트는 해당 문자열을 구문 분석하고 대신 난 당신과 함께

+2

어떤 쿼리를 말하고 있습니까? – Joren

+2

여기에 질문이 있습니까? – forsvarir

+6

LINQ 쿼리 나 생성 된 SQL을 보지 않고도 어떤 도움도 제공하기가 어렵습니다. –

답변

6

을에서 sp_executesql에 인수로 그 PARAMS을 전달하는 PARAM 값을 대체하는 것이 얼마나 어려운 LINQ 쿼리 건물을 수정할 수 없습니다. 내 말은, 당신이 발견 한 치명적인 성과에 대한 이유를 밝혀 내고 치료법을 찾아 낼 수있을 것입니다. 그러나 실제로 이러한 종류의 일은 Linq에서 SQL로 발생하고 Linq 문을 최적화하기 위해이 여분의 시간을 소비하므로 SQL 쿼리가 백엔드에서 목적을 달성하는 데 더 효과적입니다. Linq는 일을 쉽게하기로되어 있습니다.

개인적으로 저는 단일 레코드에서 CRUD 작업을 수행하기 위해 Linq-to-SQL 또는 Entity Framework를 사용합니다. 그리고 나서 큰 SELECT 문을 사용하면 항상 수행 한 것처럼 저장 프로 시저를 작성합니다. 이것은 생산성과 성능 사이에서 좋은 절충안으로 생각됩니다.

편집 : 실제로 Entity Framework 사람들이이를 예상했습니다. 그리고 Entity Framework는 저장 프로 시저와 잘 작동합니다. add a stored proc to your Entity Framework model을 입력하고 강력하게 입력 된 장점을 모두 얻을 수 있습니다. 그런 다음 코드에서 저장된 proc를 호출 할 수 있습니다. 술어가 동적으로 작동하기 때문에

var query = from v in tableView 
      where v.Id == Id 
      orderby v.RDate descending 
      select v; 

if(!daysRange.Equals("All")) 
{ 
    query = query.Where(v => v.RdDate >= fromDate && v.RDate <= toDate); 
} 

query.ToList(); 
+1

Linq에 저장 프로 시저를 SQL에 추가 할 수도 있습니다. http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx 및 http : //weblogs.asp를 참조하십시오. .net/scottgu/archive/2007/08/23/linq-to-sql-part-7-updates-our-database-using-stored-procedures.aspx –

0

당신은을 구축해야한다.

ParameterExpression parameterExpression = Expression.Parameter(typeof(TableView), "v"); 
Expression equalsExpression = Expression.Equal(Expression.Property(parameterExpression, "Id"), Expression.Constant(Id)); 
Expression<Func<TableView, bool>> predicate = Expression.Lamda<Func<TableView, bool>>(equalsExpression, parameter); 

var query = from v in tableView 
      orderby v.RDate descending 
      select v; 

if(!daysRange.Equals("All")) 
{ 
    query = query.Where(v => v.RdDate >= fromDate && v.RDate <= toDate); 
} 

query.Where(predicate).ToList(); 
+0

차이점이 없을 것입니다. 선생님, 시도했습니다. 모두. 질문은 "앞으로의 연구를 통해"내 질문에 업데이트 된 내용으로 요약됩니다. – WhoIsNinja

0

같은 응용 프로그램 특정 daysRange 을 밖으로 데리고 어디

관련 문제