WHERE 節での OR 演算子の使用

パフォーマンスを最適化するには、CONTAINS 関数または SCORE 関数の最初のパラメーターが同じである場合に、OR 演算子を使用して、WHERE 節の 1 つの CONTAINS 関数または SCORE 関数内で 2 番目のパラメータを結合する照会を作成してみてください。

次のように、2 つの別個の CONTAINS 関数を持つ照会について考えてみます。
SELECT C2 FROM T1 WHERE CONTAINS(C2, 'fence') = 1 OR CONTAINS(C2, 'horse') = 1;

これら 2 つの CONTAINS 関数の最初のパラメーターは同じであり、2 番目のパラメーターが異なります。

OR 演算子を使用して 2 つの CONTAINS 関数を 1 つに結合することで、この照会を再作成してパフォーマンスを最適化することができます。 更新された照会は、以下のようになります。
SELECT C2 FROM T1 WHERE CONTAINS(C2, ' (fence) OR (horse) ') = 1;

場合によっては、WHERE 節内での OR 演算子の使用を回避することはできません。 例えば、照会に CONTAINS 関数と SCORE 関数といくつかの異なるテキスト検索索引が含まれている場合などです。

テーブルが、 C2 と C3® の2つのカラムにフルテキストインデックスを作成して作成されたと仮定します。以下のように:
CREATE TABLE T1(RID ROWID NOT NULL GENERATED BY DEFAULT, C2 VARCHAR(20),  
C3 VARCHAR(20));

スカラー検索関数を使用する以下の 2 つの照会のパフォーマンスを向上させるには、2 つのアプローチを使用できます。

Query 1:
SELECT C2, C3 FROM T1 WHERE CONTAINS(C2, 'fence') = 1 OR CONTAINS(C3, 'horse') = 1;
Query 2:
SELECT C2, C3 FROM T1 WHERE CONTAINS(C2, 'fence') = 1 OR C3='horse';

これらの照会のパフォーマンスを向上させる 1 つの方法は、次のように、表関数として照会を再作成することです。

Query 1:
WITH CONTAINS1 (RID) AS (SELECT RID FROM T1 WHERE CONTAINS (C2, 'fence') = 1),
     CONTAINS2 (RID) AS (SELECT RID FROM T1 WHERE CONTAINS (C3, 'horse') = 1)
SELECT DISTINCT C2, C3 FROM T1 T, CONTAINS1, CONTAINS2 WHERE 
T.RID=CONTAINS1.RID OR T.RID=CONTAINS2.RID;
Query 2:
WITH CONTAINS1 (RID) AS (SELECT RID FROM T1 WHERE CONTAINS (C2, 'fence') = 1)
SELECT DISTINCT C2, C3 FROM T1 T, CONTAINS1 WHERE 
T.RID=CONTAINS1.RID OR C3='horse';

パフォーマンスを向上させるために使用できる 2 番目の方法は、OR 演算子の代わりに UNION を使用して照会を再作成することです。 以下に例を示します。

Query 1:
SELECT C2, C3 FROM T1 WHERE CONTAINS(C2, 'fence') = 1 
UNION
SELECT C2, C3 FROM T1 WHERE CONTAINS(C3, 'horse') = 1;
Query 2:
SELECT C2, C3 FROM T1 WHERE CONTAINS(C2, 'fence') = 1 
UNION
SELECT C2, C3 FROM T1 WHERE C3='horse';