【问题标题】:Sql Query performance for string operations?字符串操作的 Sql Query 性能?
【发布时间】:2010-11-19 18:55:10
【问题描述】:

我想在自连接条件操作中去除 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)

或者我应该使用其他方式,如果我考虑性能?

【问题讨论】:

  • 看起来你可以自己做微基准测试

标签: sql mysql sql-server database performance


【解决方案1】:

如果性能很重要,您可以将该子字符串放入其自己的字段中并为其编制索引。

比较您的选项,left(len()) 变体几乎肯定会比 substring(reverse()) 变体更快,因为reverse() 必须从原始字符串创建一个新字符串,并且比仅获取长度要慢。

right(a.link, 4) 呢?

【讨论】:

  • right(a.link, 4) 是 OP 想要忽略的表达式。
  • 右侧功能不起作用,因为我需要左侧部分。感谢您的提示。
  • 啊,错过了您想从原始值中删除最后 4 个字符的部分。
【解决方案2】:

如果您真的关心性能,那么您可以使用适当的索引。创建一个计算的持久列,索引它并加入它:

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 是一个很好的起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多