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_execute
cũ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_prepare
và sp_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.