sp_prepexec (sp_execute) so với sp_executeSQL


8

Phần cốt lõi của câu hỏi: các thủ tục được lưu trữ thực tế có phải là cơ chế duy nhất thực hiện lưu trữ bộ đệm tạm thời hoặc làm các thủ tục lưu trữ hệ thống như sp_executeSQL/ sp_executecũng tận dụng chúng không?

Tôi không phải là một DBA, vì vậy xin vui lòng sử dụng ít từ. Ứng dụng của chúng tôi gửi qua các câu lệnh đã chuẩn bị rằng, từ trình lược tả, tôi thấy chạy tất cả SQL thông qua sp_prepexecđó là một thủ tục hệ thống cho cả chạy sp_preparesp_execute. Những gì tôi đang cố gắng làm là tìm ra nếu tôi được hưởng lợi từ bộ nhớ đệm bảng tạm thời.

Tôi đã sử dụng hướng dẫn này với object_id () để kiểm tra hành vi

https://sqlkiwi.blogspot.com/2012/08/tceed-tables-in-stored-procedures.html

Sau đó, điểm số 3 trên bài đăng trên blog này cho thấy EXEC không thể sử dụng bộ đệm ẩn bảng tạm thời, nhưng bỏ qua liệu sp_executeQuery có thể: http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx

Trong truy vấn của tôi được gửi qua máy khách, tôi đã tạo một bảng tạm thời đơn giản.

DECLARE @foo int; -- set by JDBC, unused but required to force a prepared statement

SELECT 1 AS id
    INTO #tmp

SELECT OBJECT_ID('tempdb..#tmp');

Trong hồ sơ, tôi có thể thấy:

declare @p1 int
set @p1=NULL
exec sp_prepexec @p1 output,N'@P1 int',N'declare @foo INT = @P1 

SELECT 1 as id
    into #tmp

select Object_id(''tempdb..#tmp'');
DROP TABLE #tmp;',1
select @p1

Tôi cũng nhận được một bộ nhớ cache từ điều này. Tuy nhiên, object_id của bảng tạm thời dường như đang thay đổi đối với tôi, đây không phải là hành vi tôi sẽ thấy nếu bảng tạm thời này được tạo trong một quy trình được lưu trữ thực sự. Tuy nhiên, khi tôi chạy cùng mã này sp_executeSQL, tôi cũng thấy rằng object_id của bảng tạm thời đã thay đổi. Điều này khiến tôi tin rằng chỉ những người dùng "thực" đã tạo các thủ tục được lưu trữ mới tận dụng được bộ đệm ẩn bảng tạm thời.

Câu trả lời:


9

Các thủ tục được lưu trữ thực tế có phải là cơ chế duy nhất thực hiện lưu trữ bộ đệm tạm thời hoặc làm các thủ tục được lưu trữ hệ thống như sp_executeSQL/ sp_executecũng tận dụng chúng không?

Bạn cần một thủ tục được lưu trữ thực sự ( CREATE PROCEDURE) để hưởng lợi từ bộ nhớ đệm bảng tạm thời. Điều này bao gồm các thủ tục lưu trữ tạm thời ( #procname).

Điểm # 3 trên bài đăng trên blog này cho thấy EXEC không thể sử dụng bộ đệm ẩn bảng tạm thời, nhưng không biết liệu sp_executeQuery có thể không.

Lưu ý rằng EXECUTEđược sử dụng để chạy sp_executesql.

Kiểm tra: Có nhiều cách để kiểm tra xem bộ nhớ đệm có xảy ra hay không. Một số trong số chúng được liệt kê trong bài viết gốc của tôi được tham chiếu trong câu hỏi, một số phương pháp khác được hiển thị trong bài viết tiếp theo của tôi, Giải thích về bộ nhớ đệm bảng tạm thời , ví dụ:

SELECT 
    DOMCC.name,
    DOMCC.pages_kb,
    DOMCC.pages_in_use_kb,
    DOMCC.entries_count,
    DOMCC.entries_in_use_count
FROM sys.dm_os_memory_cache_counters AS DOMCC
WHERE DOMCC.[type] = N'CACHESTORE_TEMPTABLES';

Các TVP đầu vào thủ tục được lưu trữ cũng được lưu trong bộ nhớ cache và bắt đầu với SQL Server 2012 , chúng cũng có thể được lưu trong bộ nhớ cache khi được sử dụng sp_executesql. Xem bài viết blog CSS được liên kết để biết chi tiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.