【问题标题】:sql like query slow if using declare parameter but fast if not如果使用声明参数,则类似查询的 sql 慢,但如果不使用,则速度快
【发布时间】:2011-08-25 04:47:24
【问题描述】:

SQL 2008: 这很慢(需要 1 1/2 分钟):

声明@p1 varchar(50) 设置@p1 = '976j%' select * from invsearch_query where comparepnfwd like @p1

这需要不到一秒钟的时间:

select * from invsearch_query where comparepnfwd like '976j%'

为什么???

【问题讨论】:

  • 查看查询执行计划(或在此处发布)
  • 尝试转换你的文字,看看是否有什么不同(CAST('976j%' AS VARCHAR(50)))。另外,请查看执行计划以了解差异。
  • comparepnfwd 是一个 varchar(50)
  • 花费不到一秒钟:从 invsearch_query 中选择 * where comparepnfwd like cast('976j%' as varchar(50))
  • @Martin,是的,你是对的,慢的是在主表上进行聚集索引扫描(是的,invsearch_query 是一个视图),而快的是索引查找和键查找。跨度>

标签: sql sql-server-2008 sql-like performance


【解决方案1】:

我想你必须有一个带有前导列 comparepnfwd 的非覆盖索引,它被文字查询使用,但不被带有变量的查询使用。

您可以使用OPTION (RECOMPILE) 让 SQL Server 重新编译计划并考虑实际变量值。

【讨论】:

  • 选项(重新编译)使第一个查询与第二个查询一样快。谢谢。
猜你喜欢
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多