LEFT()与LIKE运算符之间的T-SQL速度比较

Rob*_*nik 12 t-sql comparison sql-like

我正在根据某个nvarchar列的第一个字母而不是通常的列创建结果分页,这通常会在结果数量上进行分页.

我是否面临使用LIKEoperator或equality(=)运算符过滤结果的挑战.

select *
from table
where name like @firstletter + '%'
Run Code Online (Sandbox Code Playgroud)

select *
from table
where left(name, 1) = @firstletter
Run Code Online (Sandbox Code Playgroud)

我已经尝试在网上搜索两者之间的速度比较,但是很难找到任何结果,因为大多数搜索结果与功能有关LEFT JOINs而不是LEFT功能.

小智 13

"Left"vs"Like" - 在执行索引时,应始终使用"Like",因为"Like" 不是函数,因此可以利用您对数据可能具有的任何索引.

另一方面,"左"是功能,因此不能使用索引.此网页通过一些示例描述了使用差异.这意味着SQL服务器必须为每个返回的记录评估函数.

"子串"和其他类似的功能也是罪魁祸首.

  • 虽然我理解并同意,但我认为 MySQL 代码库应该足够智能,可以将简单的 LEFT() 调用转换为 LIKE 语句,或者利用 LEFT() 第一个操作数上的索引。就像OP一样,我刚刚偶然发现代码中的 LEFT() 速度很慢,并且很惊讶它没有经过优化以在性能上与 LIKE 类似。 (3认同)

pax*_*blo 8

您最好的选择是衡量实际生产数据的表现,而不是试图猜测(或询问我们).这是因为性能有时可能取决于您正在处理的数据,尽管在这种情况下似乎不太可能(但我不知道,因此您应该检查).

如果这是一个你会做很多的查询,你应该考虑另一个(索引的)列,它包含小写的第一个字母,name并由插入/更新触发器设置.

这将以最小的存储增加为代价,使这个查询非常快速:

select * from table where name_first_char_lower = @firstletter
Run Code Online (Sandbox Code Playgroud)

这是因为大多数数据库的读取频率远高于写入数据库,这将在所有读取中分摊计算成本(仅对写入执行).

它引入了冗余数据,但只要您了解(并缓解,如此建议)后果并需要额外的性能,就可以为性能做到这一点.


小智 6

我有一个类似的问题,并对两者进行了测试。这是我的代码。

where (VOUCHER like 'PCNSF%'
    or voucher like 'PCLTF%'
    or VOUCHER like 'PCACH%'
    or VOUCHER like 'PCWP%'
    or voucher like 'PCINT%')
Run Code Online (Sandbox Code Playgroud)

在 1 分 51 秒内返回了 1434 行。

对比

where (LEFT(VOUCHER,5) = 'PCNSF'
    or LEFT(VOUCHER,5)='PCLTF'
    or LEFT(VOUCHER,5) = 'PCACH'
    or LEFT(VOUCHER,4)='PCWP'
    or LEFT (VOUCHER,5) ='PCINT')
Run Code Online (Sandbox Code Playgroud)

1 分 27 秒返回 1434 行

我的数据在左边 5 时更快。顺便说一句,我的整体查询确实命中了一些索引。

  • 其他人也有同样的想法并编写了自己的 [针对 LEFT、RIGHT、LIKE、SUBSTRING 和 CHARINDEX 的基准测试](http://cc.davelozinski.com/sql/like-vs-substring-vs-leftright-vs-字符索引)。 (6认同)