Đối với mỗi câu lệnh chèn tôi thấy sp_executesql trong SQL Server Profiler


4

Làm việc để điều chỉnh cơ sở dữ liệu và truy vấn của chúng tôi cho một trong các sản phẩm của chúng tôi, tôi quyết định mở Profiler mở trong môi trường QA và xem nội dung hiển thị.

Tôi thấy với mỗi lần chèn tôi đã gọi, một cuộc gọi được thực hiện cho sp_executesql với văn bản của câu lệnh chèn.

Đây dường như là một cú hích lớn, có cách nào để tắt cái này không?

Môi trường:

  • Tiêu chuẩn SQL Server 2008 R2
  • Máy chủ Windows Server 2008 R2
  • RAM 32 GB
  • Xe tải 2x4
9

Tôi sẽ không lo lắng quá nhiều.

Ý tưởng là để tham số hóa các báo cáo để sử dụng lại.Đó là, tránh biên dịch

Hãy xem xét bạn có 3 khách hàng khác nhau chạy 3 câu lệnh riêng biệt:

SELECT col1, col2 FROM SomeTable WHERE col3 = 1

SELECT col1, col2 FROM SomeTable WHERE col3 = 15

SELECT col1, col2 FROM SomeTable WHERE col3 = 42

Mỗi trong số này có văn bản khác nhau do đó sẽ được biên soạn cho một kế hoạch khác nhau.Đó là, 3 biên dịch và 3 kế hoạch trong bộ nhớ cache.

Bây giờ, 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'

Gói có thể sử dụng lại ở đây là cho câu lệnh SELECT col1, col2 FROM SomeTable WHERE col3 = @p0 để bạn có một gói là bộ đệm.

Trong các hệ thống bận rộn, thời gian biên dịch này có vấn đề.Và hầu hết các truy vấn phức tạp hơn thì điều này tất nhiên: bạn thường có thể thấy điều này cho lần chạy đầu tiên so với lần chạy tiếp theo (xem Testing Query Speed)

Ngoài ra, trong các hệ thống phức tạp và bận rộn, kế hoạch kích thước bộ đệm có thể bị giới hạn hoặc lấy RAM ra khỏi bộ đệm dữ liệu (vùng đệm) có thể cản trở mọi thứ.Cực đoan có thể là 10000 gói hoặc một cho một ứng dụng web bận rộn.(Hiệu ứng phụ thuộc vào độ tinh tế 32 so với 64 bit)

Một số ORM và trình điều khiển cho phép bạn tắt tính năng này, thường là "tuyên bố đã chuẩn bị" hoặc một số tùy chọn: nhưng được cảnh báo rằng nó có thể làm mọi thứ chậm lại.Bạn nói "đây có vẻ là một cú hích lớn" ngụ ý rằng bạn lo ngại về tải ...

+2

Giải thích tuyệt vời về * tại sao * một số hệ thống làm điều này.Nó cho phép họ tham số SQL của họ mà không cần sử dụng các thủ tục được lưu trữ. 15 sep. 112011-09-15 19:06:11


4

Tôi không chắc là tôi hiểu, bạn muốn ngừng sử dụng sp_executesql?Nếu vậy, bạn chỉ cần thay đổi mã của mình để không sử dụng phương pháp này.Tôi tin rằng đối tượng SQLCommand trong .NET sẽ sử dụng sp_executsql, vì vậy nếu bạn đang sử dụng .NET thì bạn sẽ thấy cuộc gọi này.


5

Nếu bạn đang sử dụng hầu hết các ORM (Link2Query, EF, v.v.) thì chúng sẽ khiến phương thức nhỏ đáng yêu này được sử dụng.Nếu bạn đang viết một câu lệnh chèn tham số, nó cũng sẽ xuất hiện trong phương thức này.

  0

Vì vậy, tôi không thể khắc phục điều này bằng cách sử dụng các tham số chèn?Giống như ... tất cả? 15 sep. 112011-09-15 13:05:38

  0

Không.Tùy chọn duy nhất của bạn sẽ là sử dụng thủ tục lưu trữ của riêng bạn. 15 sep. 112011-09-15 17:19:53