답변

4

아담과 동의하십시오. 엔티티 프레임 워크/ADO.net에서 sp_executesql을 사용하는 것은 의도적입니다. 그런 다음 쿼리는 매개 변수화 된 저장 프로 시저와 유사하게 실행되고 SQL 최적화 프로그램은 쿼리 계획을 다시 사용할 수 있습니다.

DB를 조정하려는 경우 이러한 쿼리도 고려해야합니다. 난 당신의 DB를 백업 받아 (SQL 프로파일 러에서) 재생 추적 템플릿을 사용하여 쿼리를 캡처, 귀하의 DB를 복원, 튜닝 어드바이저 설정을 실행이 추적에 작업을 수행

+0

감사합니다.이 방법을 사용해보세요. –

2

sp_executesql의 사용법은 ADO.NET 효과이며 Entity Framework와 관련이 없습니다. 내가 아는 한, 저장 프로 시저를 사용하지 않도록 지시 할 방법이 없습니다.

3

그것은 단지 어떻게의 유물입니다 RPC 호출은 프로파일 러에 표시됩니다. 클라이언트 요청에는 두 가지 주요 유형이 있습니다. Free TDS protocol documentation에 설명되어있는 언어 (유형 0x01)와 RPC (유형 0x03)입니다. 호출이 매개 변수가있는 SQL 일괄 처리 일 경우 RPC 호출은 sp_executesql의 바로 가기 인 길이 0x0A의 0x03 유형이됩니다.

클라이언트가 이면 클라이언트가 일 때 매개 변수가 포함 된 일괄 처리를 제출하면 sp_executesql이 호출되는 것처럼 보입니다. 이것은 OleDB, SqlClient, Sql Native Client가있는 ODBC에서 마찬가지입니다. 클라이언트입니다. 실제로 Entity Framework 나 ADO.Net은 실제로 sp_executesql을 호출하지 않습니다 (사실 요청이 호출 된 것처럼 실행되지만 실제로는 프로 시저가 호출되지 않습니다 ... 복잡합니다 ...). 요청에 @parameter을 추가 할 때마다 발생하는 프로토콜의 아티팩트입니다.

+0

설명 주셔서 감사합니다 - 그것은 꽤 많은 것들을 명확히합니다 .. 지금 나는 무슨 일이 일어나고 있는지 이해합니다! –

5

LINQ/.NET은 sp_executesql SQL 서버 호출로 SQL 쿼리를 실행합니다. 그러나 데이터베이스 엔진 튜닝 관리자은 캡처 한 문을 SQL Server 프로파일 러로 파싱 할 수 없으므로 튜닝 세션의 결과가 좋지 않습니다.

sp_executesql 문을 데이터베이스 엔진 튜닝 관리자에게 제공하기 전에 문을 열어서 올바르게 분석 할 수 있습니다.

  1. 는 사용자가 실행 한 후 저장 파일> 내보내기> 추출 SQL 서버 이벤트> 추출 거래-SQL 이벤트 ...를 사용하여 프로파일SQL Server의 튜닝 세션 (또는 기존 오픈). 모든 SQL 문을 포함하는 SQL 파일.
  2. 열고 .SQL 파일 (의 예를 들어 메모장 ++ 6-http://notepad-plus-plus.org/)와 다음은 & 교체를 일반 TSQL 모든 sp_executesql 문을 언 박싱하는 정규 표현식을 찾아 실행합니다. 찾기 : ^EXEC[\s]+SP_EXECUTESQL[\s]+[N]*'((''|[^'])*)'[\s]*,[\s]*[N]*'((''|[^'])*)'[\s]*,[\s]*([^\n]+)$ 바꾸기 : BEGIN\nDECLARE \3\nSELECT \5\n\1\nEND
  3. 다음의 '언 박싱'.SQL은 우리가 추가 neeed 어떤 인덱스를 찾아 데이터베이스 엔진 튜닝 관리자에 건설 한 것을 제출하십시오.

해피 튜닝! Notepad ++ 6 (또는 그 이상)을 선택한 이유는 정규 표현식 구현이 매우 잘되어 있기 때문입니다. 위의 표현식을 실행할 때 다른 텍스트 편집기가 실패 할 수 있습니다.

+1

왜 당신은 정상에 있지 않습니까? 이 간단한 찾기 및 바꾸기가 실제로 트릭을 수행했습니다. EF는 모든 프로 시저 호출에 대해 동일한 변수 이름을 사용합니다. 하지만 이건 정말 도움이 됐어. 고마워! – Giri

관련 문제