4

[编辑:根据 Leigh 的建议编辑

我一直对使用位置有疑问

 column like <cfqueryparam cfsqltype="cf_sql_varchar" value="abc%" />

比大约 30ms 慢。

column like 'abc%'

在计划被缓存之前,两个查询大约同时运行约 60 毫秒。对于没有 cfqueryparam 的查询,后续命中会导致 1 毫秒,而使用 cfqueryparam 的查询会导致 30 毫秒。DSN 正在发送 unicode,列类型为 nvarchar。我没有注意到“=”的这种行为,只是 LIKE 运算符。此特定列未编入索引。

有谁知道为什么会发生这种行为?

4

1 回答 1

1

在使用非参数化参数进行查询时,我已经看到 sql server 的类似行为。据我所知查询

select x from y where x.a like 'dog'

只要表y数据没有被修改,就永远不会改变计划、统计数据或输出。SQL Server 可以而且确实可以检测到这一点,并将计划/统计信息/输出与此查询相比存储更长的时间:

select x from y where x.a like @p1

任何可能的参数值之间没有共同点。您实际上说,在计划被缓存后,您会看到性能差异,这是因为不仅计划被缓存。

我还看到了查询优化器从未对参数化查询使用有效索引的情况——对于非参数化查询,它使用它——并且必须使用索引查询提示。

于 2012-08-22T08:41:00.100 回答