모든 insert 문에 대해 SQL Server 프로파일 러에서 sp_executesql을 참조하십시오.


4

우리 제품의 데이터베이스와 쿼리를 튜닝하는 과정에서 QA 환경에서 공개 프로파일 러를 시작하고 그 내용을 확인하기로 결정했습니다.

호출 한 모든 삽입에 대해 보았습니다. sp_executesql에 insert 문 텍스트가 호출되었습니다.

이것은 큰 타격이 될 것 같습니다, 이것을 끌 수있는 방법이 있습니까?

환경:

  • SQL Server 2008 R2 표준
  • Windows Server 2008 R2 엔터프라이즈
  • 32GB RAM
  • 2x4 제온
9

나는 너무 걱정하지 않을 것이다.

개념은 재사용을 위해 명령문을 매개 변수화하는 것입니다.즉, 컴파일을 피하십시오.

3 개의 서로 다른 클라이언트가 3 개의 별도 명령문을 실행한다고 가정 해보십시오.

SELECT col1, col2 FROM SomeTable WHERE col3 = 1

SELECT col1, col2 FROM SomeTable WHERE col3 = 15

SELECT col1, col2 FROM SomeTable WHERE col3 = 42

이들 각각은 다른 텍스트를 가지고 있으므로 다른 계획으로 컴파일됩니다.즉, 캐시 된 3 개의 컴파일 및 3 개의 계획입니다.

자,이 3

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '1'

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '15'

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '42'

여기 재사용 가능한 계획은 명세서 SELECT col1, col2 FROM SomeTable WHERE col3 = @p0 것이므로 하나의 계획은 캐시입니다.

바쁜 시스템에서는이 컴파일 시간이 중요합니다.그리고 대부분의 쿼리는 당연히 더 복잡합니다. 첫 번째 실행 대 후속 실행 시간에 대해 자주 볼 수 있습니다 (Testing Query Speed 참조)

또한 복잡하고 바쁜 시스템에서 계획 캐시 크기가 제한되거나 RAM 캐시를 데이터 캐시 (버퍼 풀)로부터 멀리하여 작업을 방해 할 수 있습니다.극단적 인 상황은 바쁜 웹 앱을위한 것이거나 10000 개의 계획 일 수 있습니다.(효과는 32 대 64 비트 미묘함에 달려 있음)

일부 ORM 및 드라이버를 사용하면 일반적으로 "준비된 명령문"또는 일부 옵션을 해제 할 수 있지만 상황이 느려질 수 있다는 경고를받습니다.너는 "이것은 대히트 인 것 같다"는 말은 당신이 짐을 염려하고 있다는 것을 의미합니다 ...

+2

왜 어떤 시스템이 이것을하는지에 대한 훌륭한 설명.저장 프로 시저를 사용하지 않고 SQL을 매개 변수화 할 수 있습니다. 15 sep. 112011-09-15 19:06:11


4

이해가 안가요, 당신 sp_executesql 사용을 중지하려면?그렇다면이 방법을 사용하지 않도록 코드를 변경하기 만하면됩니다.나는 .NET의 SQLCommand 객체가 sp_executsql을 사용할 것이라고 믿는다. 따라서 .NET을 사용한다면이 호출을 볼 것으로 예상해야한다.


5

대부분의 ORM (Link2SQL, EF 등)을 사용하고 있다면이 작은 방법을 사용하게됩니다.매개 변수화 된 삽입 문을 작성하는 경우이 방법에서도 사용할 수 있습니다.

  0

그래서 매개 변수화 된 삽입을 사용하여이 문제를 해결할 수 없습니까?마치 ... 전혀? 15 sep. 112011-09-15 13:05:38

  0

아니.유일한 옵션은 자체 저장 프로 시저를 사용하는 것입니다. 15 sep. 112011-09-15 17:19:53