2

現在、cognos10.1で作業しています。

「AB」、「CE」、「JA」で始まる名前を見つけたいのですが。クエリの件名(テーブル)には約1,000,000以上のレコードが含まれているため、クエリのパフォーマンスが心配です。どのフィルターを使用すればよいですか?

substring ([Participant],1,2) in ('AB', 'CE', 'JA')

また

[Participant] like 'AB%' or [Participant] like 'CE%' or [Participant] like 'JA%'

どちらがより速く実行されますか?

4

2 に答える 2

2

過去の私の経験では、特定の文字セットで始まる文字列に関心がある場合、 LIKE は SUBSTR メソッドよりも良い結果をもたらすことが示唆されていますが、一般的に、オプティマイザーが信じるのに十分な長さの文字列に対してのみ利点が現れます。インデックススキャンが有益であること。私が思い出したように、これは通常2文字以上だったので、あなたのケースではメリットが見られないかもしれません.

substr() 述語を使用し、関数ベースのインデックス (以下を参照) がない場合、期待できる最良の種類のインデックス アクセスは、通常のインデックス アクセス方法ほど良くない、高速な全インデックス スキャンです。 Likeが許可する可能性があります。

ただし、substr() 関数で使用できる Substr(participant,1,2) に関数ベースのインデックスを定義することは可能です。substr の start および length 引数 (この場合は 1 と 2) が固定されている場合にのみ価値があります。テーブル変更パターンが一般的に適している場合は、ビットマップ インデックスが適している場合があります。

于 2013-03-20T11:49:12.297 に答える
2

その列にはインデックスがありません。したがって、オプティマイザーが選択できる唯一の選択肢は、フル テーブル スキャンです。率直に言って、フィルターの正確な構文は、そのコストに何の違いももたらさないでしょう。

David が示唆するように、関数ベースのインデックスを構築すると、substr(participant,1,2)いくつかの利点が得られる可能性があります。ただし、これが頻繁に実行する種類のクエリである場合にのみ価値があります。

于 2013-03-20T12:31:06.037 に答える