在Server上,我正在测试创建一个计划指南,以强制Java的查询始终使用特定的最佳执行计划。一些不使用本计划指南的SQL查询
我跟着你,https://technet.microsoft.com/en-us/library/ms190772%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396
SQL来自Java,
declare @p1 int
set @p1=1986
exec sp_prepexec @p1 output,N'@P0 nvarchar(4000)',N'SELECT Top 1 Amount,col2 from dbo.table1
where ExId=@P0
order by id
',N'0a8e8e31-2a05-0000-8ece-0003fd69e692'
select @p1我创建的计划指南,
DECLARE @xml_showplan nvarchar(max);
SET @xml_showplan = (select cast(query_plan as nvarchar(max)) from sys.dm_exec_cached_plans cp
cross apply sys.dm_exec_sql_text (cp.plan_handle) st
cross apply sys.dm_exec_query_plan (cp.plan_handle) qp
where st.text like '%Top 1 Amount%'
and objtype='Prepared')
--select (@xml_showplan)
EXEC sp_create_plan_guide
@name = N'ForceuserLoanAmountRequests',
@stmt = N'SELECT Top 1 Amount,col2 from dbo.table1 where ExId=@P0 order by id',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@P0 nvarchar(4000)',
@hints = @xml_showplan;如果您能帮助我了解SQL查询从java中使用的计划指南,非常感谢。
使用从SQL收集的SQL创建计划指南,
EXEC sp_create_plan_guide
@name = N'ForceuserLoanAmountRequests',
@stmt = N'SELECT Top 1 Amount,col2 from table1
where ExId=@P0
order by ID
',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@P0 nvarchar(4000)',
@hints = @xml_showplan;
GO发布于 2018-02-22 10:34:12
请阅读指南(Transact-SQL)的文章,注意备注:
计划指南匹配要求 对于指定@type = ' SQL‘或@type = 'TEMPLATE’以成功匹配查询的计划指南,batch_text和@parameter_name data_type的值必须以与应用程序提交的格式完全相同的格式提供。意味着必须提供与Server编译器接收到的批处理文本完全相同的格式。要捕获实际的批处理和参数文本,可以使用Server事件探查器。有关更多信息,请参见使用Server探查器创建和测试计划指南。
这意味着语句应该与中的完全匹配,但是在代码计划指南中创建的语句与java发送的语句不同:它只有一行,而java代码有4行CR和其他空格。
如果您计算来自java语句和sp_create_plan_guide中提供的语句的任何散列,您会发现它们是不同的。
另一件我怀疑可能是错误的事情是你如何得到一个“好的计划”。因为您只是为@xml_showplan分配一个可以生成多行的查询的结果,所以我不确定您是否得到了所需的计划。如何确保捕获“良好的do计划而不是java代码生成的相同计划?”
https://stackoverflow.com/questions/48917564
复制相似问题