2010-11-19 15 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

+0

@@ Oded感謝します。 – ash

答えて

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

2

パフォーマンスが重要な場合は、その部分文字列を独自のフィールドに配置してインデックスを作成します。

left(len())バリアントはバリアントよりも確実に高速です。reverse()は元の文字列から新しい文字列を作成する必要があり、長さを取得するよりも遅くなるためです。

代わりにright(a.link, 4)はどうなりますか?

+0

right(a.link、4)は、OPが_ignore_したい表現です。 – Axn

+0

私は左の部分が必要なので、右の関数は動作しません。先端に感謝します。 – ash

+0

ああ、元の値から最後の4文字を取り除きたい部分を逃した。 – VVS