Rob*_*nik 12 t-sql comparison sql-like
我正在根据某个nvarchar
列的第一个字母而不是通常的列创建结果分页,这通常会在结果数量上进行分页.
我是否面临使用LIKE
operator或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服务器必须为每个返回的记录评估函数.
"子串"和其他类似的功能也是罪魁祸首.
您最好的选择是衡量实际生产数据的表现,而不是试图猜测(或询问我们).这是因为性能有时可能取决于您正在处理的数据,尽管在这种情况下似乎不太可能(但我不知道,因此您应该检查).
如果这是一个你会做很多的查询,你应该考虑另一个(索引的)列,它包含小写的第一个字母,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 时更快。顺便说一句,我的整体查询确实命中了一些索引。