2010-11-19 45 views
0

我想要在自連接條件操作中帶一個varchar(255)字符串的最後4個字符。 哪些字符串操作更快。Sql查詢字符串操作的性能?

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) 

或者我應該使用其他方式,如果我考慮性能?

+5

看起來像你可以微小的基準你自己 – Oded 2010-11-19 18:59:19

+0

@@ Oded謝謝,我會做到這一點。 – ash 2010-11-19 19:43:45

回答

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是一個很好的開始。

+0

@@ Remus謝謝。 – ash 2010-11-19 21:10:56

2

如果性能很重要,則將該子字符串放入其自己的字段並對其進行索引。

比較你的選項left(len())變種幾乎肯定會比substring(reverse())變異更快,因爲reverse()具有創建從原來的一個新的字符串,將不僅僅是獲得長慢。

那麼right(a.link, 4)呢?

+0

right(a.link,4)是OP想要_ignore_的表達式。 – Axn 2010-11-19 19:23:53

+0

正確的功能將無法正常工作,因爲我需要左邊的部分。謝謝你的提示。 – ash 2010-11-19 19:25:06

+0

啊,錯過了你想從原始值中刪除最後4個字符的部分。 – VVS 2010-11-20 08:01:22