我想在自连接条件操作中去掉varchar(255)字符串的最后4个字符。 这些字符串操作中的哪一个更快。
Example: link field
1, '100-200-300-'
2, '100-200-400-'
3, '100-200-300-400-'
1. left(a.link, len(a.link)-4) = left(b.link, len(b.link)-4)
// OR
2. substring(reverse(a.link), 4, 255) = substring(reverse(b.link), 4, 255)
或者我应该用其他方式,如果我考虑表现?
答案 0 :(得分:2)
如果性能很重要,则将该子字符串放入其自己的字段中并将其编入索引。
比较您的选项,left(len())
变体几乎肯定会比substring(reverse())
变体更快,因为reverse()
必须从原始变体创建一个新字符串,并且速度比获取长度。
而不是right(a.link, 4)
呢?
答案 1 :(得分:0)
如果您真的关心性能,那么您使用适当的索引。创建一个计算的持久化列,将其编入索引并加入其中:
alter table tablename add sublink = left(a.link, len(a.link)-4) persisted;
create index indexname on tablename(sublink);
...
select...
from...
join... on a.sublink = b.sublink;
这只是一个例子。在实际情况中,必须正确分析索引的正确形状和组成(例如,确定需要哪些其他列作为键,包括或过滤索引)。它的好处必须与增加的更新成本相平衡。
Designing Indexes是一个很好的起点。