SQL Server sp_create_plan_guide和LIKE子句参数

时间:2017-01-11 16:15:18

标签: sql-server parameters sql-like sql-execution-plan

在创建计划指南时,我无法处理LIKE子句。我遇到麻烦的真实查询是巨大的,所以我只是为了描述我的问题而制作了一个小问题。以下是我的麻烦总结:

我正在尝试为is创建计划:

SELECT ID, Name FROM Company WHERE Addres LIKE '%somestring%' AND Site = 'whateversite'

所以我运行了sp_get_query_template来获取查询模板,它看起来像这样:

DECLARE @my_templatetext nvarchar(max)
DECLARE @my_parameters nvarchar(max)
EXEC sp_get_query_template
@templatetext = N'SELECT ID, Name FROM Company WHERE Addres
LIKE ''%somestring%'' AND Site = ''whateversite''',
@templatetext = @my_templatetext OUTPUT,
@parameters = @my_parameters OUTPUT
SELECT @my_templatetext
SELECT @my_parameters

回归是:

参数化查询:

SELECT ID, Name FROM Company WHERE Addres LIKE '%somestring%' AND Site = @0

参数:

@0 nvarchar(4000)

然后我将最终运行sp_create_plan_guide过程,如下所示:

EXEC sp_create_plan_guide
@name = N'TSY_PLAN2',
@stmt = N'SELECT ID, Name FROM Company WHERE Addres LIKE ''%somestring%''
AND Site = @0',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@0 nvarchar(4000)'

当我运行第一个块中发布的查询时,它完美运行!但是,当我提交不同的地址然后'%Somestring%'时,它就无法工作。这肯定是因为LIKE'%somestring%''查询模板的一部分...但我无法弄清楚如何使它与LIKE clausule中的参数一起使用。

我尝试使用LIKE clausule的参数创建查询计划,它看起来像这样:

EXEC sp_create_plan_guide
@name = N'TSY_PLAN2',
@stmt = N'SELECT ID, Name FROM Company WHERE Addres LIKE @1like
AND Site = @0',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@1like nvarchar(4000),@0 nvarchar(4000)'

但它根本不起作用......我甚至使用了很多百分比,昏迷和段落的组合,但根本没有运气。

经过多次绝望的试验和失败后,我通过实际的执行计划功能发现,该优化器没有看到LIKE"参数"作为参数...它看到真实的'%somestring%'值。优化工具将查询视为:

SELECT ID, Name FROM Company WHERE Addres LIKE '%somestring%'
AND Site = @0'

如果我填写不同的'%somestring%'我需要不同的计划指南吗?这有点会使计划指南变得毫无用处,因为%#some somestring%'经常变化。我拒绝相信这是不可能的!我需要我的优化器每次都不使用LIKE子句中的特定字符串来使用散列连接...

在现实生活的最后,我通过摆弄索引来解决这个问题...但是花了很多时间!作为一个快速的工作,我想做计划指南。

能否请您帮我创建"参数"的计划指南?在LIKE条款?它甚至可能吗?我是否需要以某种方式设置我的数据库"参数化LIKE clausules"?

0 个答案:

没有答案