首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建计划指南

创建计划指南
EN

Stack Overflow用户
提问于 2018-02-22 00:05:20
回答 1查看 1.1K关注 0票数 1

在Server上,我正在测试创建一个计划指南,以强制Java的查询始终使用特定的最佳执行计划。一些不使用本计划指南的SQL查询

我跟着你,https://technet.microsoft.com/en-us/library/ms190772%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396

SQL来自Java,

代码语言:javascript
复制
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

我创建的计划指南,

代码语言:javascript
复制
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创建计划指南,

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 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代码生成的相同计划?”

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48917564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档