문제의 핵심 : 실제 저장 프로시 저는 임시 테이블 캐싱을 구현하는 유일한 메커니즘이거나 시스템 저장 프로 시저 (예 : sp_executeSQL
/) sp_execute
를 활용 하는 유일한 메커니즘 입니까?
나는 DBA가 아니므로 작은 단어를 사용하십시오. 우리의 응용 프로그램은 프로파일에서, 내가 통해 모든 SQL 실행을 참조하십시오 이상 준비된 문 보냅니다 sp_prepexec
실행 모두를위한 시스템 프로 시저 인 sp_prepare
과 sp_execute
. 내가하려고하는 것은 임시 테이블 캐싱의 이점이 있는지 알아내는 것입니다.
이 안내서를 object_id ()와 함께 사용하여 동작을 조사했습니다.
https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html
그런 다음이 블로그 게시물의 3 번 포인트는 EXEC가 임시 테이블 캐싱을 사용할 수 없지만 sp_executeSQL이 다음을 수행 할 수 있는지 여부를 생략합니다. http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx
클라이언트를 통해 보낸 쿼리에서 간단한 임시 테이블을 만들었습니다.
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');
프로파일 러에서 다음을 볼 수 있습니다.
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
나는 또한 이것으로부터 캐시 히트를 얻는다. 그러나 임시 테이블의 object_id가 나에게 변경되는 것처럼 보입니다.이 임시 테이블이 실제 저장 프로 시저에서 생성되었는지는 알 수 없습니다. 그러나를 통해 동일한 코드를 실행 sp_executeSQL
하면 임시 테이블의 object_id가 변경되었음을 알 수 있습니다. 이것은 "실제"사용자 생성 저장 프로시 저만이 임시 테이블 캐싱을 이용한다고 믿게합니다.