我有这个查询:
select top 100 id, email, amount from view_orders
where email LIKE '%test%' order by created_at desc
运行时间不到一秒钟。
现在我想参数化它:
declare @m nvarchar(200)
set @m = '%test%'
SELECT TOP 100 id, email, amount FROM view_orders
WHERE email LIKE @m ORDER BY created_at DESC
5分钟后,它仍在运行。对于任何其他类型的参数测试(如果我将“like”替换为“=”),它会下降到第一个查询级别的性能。
我正在使用 SQL Server 2008 R2。
我试过了OPTION(RECOMPILE)
,它下降到 6 秒,但仍然慢得多(非参数化查询是瞬时的)。因为这是一个我希望经常运行的查询,所以这是一个问题。
表的列有索引,而视图没有,不知道能不能有所作为。
该视图连接了 5 个表:一个包含 3,154,333 行(用户),一个包含 1,536,111 行(订单),3 个最多包含几十行(订单类型等)。搜索是在“用户”表(有 3M 行)上完成的。
硬编码值:
参数 :
更新
我已经使用SET STATISTICS IO ON
. 这是结果(对不起,我不知道如何阅读):
硬编码值:
表'货币'。扫描计数 1,逻辑读取 201。
表“订单状态”。扫描计数 0,逻辑读取 200。
表“付款”。扫描计数 1,逻辑读取 100。
表'礼物'。扫描计数 202,逻辑读取 404。
表“订单”。扫描计数 95,逻辑读取 683。
表“用户”。扫描计数 1,逻辑读取 7956。
参数 :
表'货币'。扫描计数 1,逻辑读取 201。
表“订单状态”。扫描计数 1,逻辑读取 201。
表“付款”。扫描计数 1,逻辑读取 100。
表'礼物'。扫描计数 202,逻辑读取 404。
表“用户”。扫描计数 0,逻辑读取 4353067。
表“订单”。扫描计数 1,逻辑读取 4357031。
更新 2
从那以后,我看到了“强制索引使用”提示:
SELECT TOP 100 id, email, amount
FROM view_orders with (nolock, index=ix_email)
WHERE email LIKE @m
ORDER BY created_at DESC
不确定它是否会起作用,我不再在这个地方工作了。