在SQL 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;
感谢您是否可以帮助我通过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
答案 0 :(得分:1)
请阅读文章sp_create_plan_guide (Transact-SQL)注意备注:
计划指南匹配要求
对于指定@type ='SQL'或@type ='TEMPLATE'的计划指南 成功匹配查询,batch_text和的值 @parameter_name data_type [,... n] 必须完全提供 与申请提交的同行格式相同。这 意味着您必须提供与SQL Server完全相同的批处理文本 编译器接收它。要捕获实际的批处理和参数文本, 您可以使用SQL Server Profiler。有关更多信息,请参阅使用SQL Server Profiler用于创建和测试计划指南。
这意味着该语句应完全与plan guide
中写入的内容匹配,但在代码计划指南中创建的语句与java发送的语句不同:只有一行,java
代码有4行CR
和其他空格。
如果您评估来自java
语句的任何哈希以及sp_create_plan_guide
中提供的语句,您会发现它们不同。
我怀疑的另一件事可能是错误的是你如何得到一个“好的计划”。由于您只是为@xml_showplan
分配了可以产生多行的查询结果,因此我不确定您是否获得了所需的计划。你如何确保捕获“好的计划而不是java代码生成的计划?”