6

文字列に対して検索するクエリがあります。

SELECT county FROM city WHERE UPPER(name) = 'SAN FRANCISCO';

さて、これは問題なく動作しますが、うまくスケーリングできず、最適化する必要があります。生成されたビューの作成などのオプションを見つけましたが、インデックスを使用したより簡単なソリューションを望んでいました。

DB2 を使用しており、実際には index で式を使用したいのですが、このオプションは z/OS でしか使用できないようですが、Linux を実行しています。とにかく式インデックスを試しました:

CREATE INDEX city_upper_name_idx
ON city UPPER(name) ALLOW REVERSE SCANS;

しかしもちろん、それは UPPER(名前) で詰まります。

既存のクエリを再構築して新しく生成されたビューを使用したり、既存の列を変更したり、その他のそのような侵入的な変更を行う必要がないように、この方法でインデックスまたは同様のものを作成できる別の方法はありますか?

編集:私は他のデータベースの解決策を聞くことにオープンです...それはDB2に引き継がれるかもしれません...

4

6 に答える 6

7

都市名の数値ハッシュキーを保持するインデックス付きの列を追加できます。(重複が許可されています)。

次に、次の場所で複数の句を実行できます。

hash = [compute hash key for 'SAN FRANCISCO']

SELECT county 
FROM city 
WHERE cityHash = hash 
  AND UPPER(name) = 'SAN FRANCISCO' ;

または、データベースのマニュアルを読み、テーブルインデックスを作成するためのオプションを確認してください。何か役立つことがあるかもしれません。

于 2008-08-15T23:28:22.687 に答える
2

これが DB2 で機能するかどうかはわかりませんが、SQL Server でこれを行う方法を説明します。特定の照合文字列は異なる場合がありますが、MSSQL がこれを行う方法は ANSI 標準だと思います。とにかく、アプリケーションの残りの部分を破棄せずにこれを行うことができれば、「名前」列で大文字と小文字を区別する必要がある他の場所はありますか? -- 照合順序を変更して列全体の大文字と小文字を区別しないようにしてから、列にインデックスを付けます。

ALTER TABLE city ALTER COLUMN name nvarchar(200) 
    COLLATE SQL_Latin1_General_CP1_CI_AS

...「nvarchar(200)」は、現在の列のデータ型を表します。照合文字列の「CI」の部分は、MSSQL で大文字と小文字を区別しないとマークするものです。

説明するには...私の理解では、インデックスはインデックス付きの列の照合順序で値を格納するということです。列の照合順序で大文字と小文字を区別しないようにすると、インデックス ストア 'San Francisco'、'SAN FRANCISCO'、および 'san francisco' がすべてまとめて作成されます。次に、クエリから「UPPER()」を削除するだけで、DB2 はインデックスを使用できることを認識する必要があります。

繰り返しますが、これは SQL Server について私が知っていることと、SQL-92 仕様を数分間調べたことにのみ基づいています。DB2 では機能する場合と機能しない場合があります。

于 2008-08-19T16:59:22.657 に答える
1

Oracleは、関数ベースのインデックスをサポートしています。彼らの標準的な例:

 create index emp_upper_idx on emp(upper(ename));  
于 2008-08-16T02:13:32.883 に答える
1

PostgreSQLは、関数の結果のインデックス作成もサポートしています。

CREATE INDEX mytable_lower_col1_idx ON mytable (lower(col1));

私が考えることができる他の唯一のオプションは、大文字のバージョン(トリガーによって更新される)を保持する別の列を作成してデータを少し非正規化し、そのインデックスを作成することです。Blech!

于 2008-08-16T12:40:25.117 に答える
1

DB2 は照合に関して強力ではありません。また、関数ベースのインデックスはありません。

Niek Sanders の提案は、アプリケーションでハッシュが発生する必要があることを受け入れることができれば機能します (私の知る限り、DB2 には SHA または MD5 関数がないため)。

ただし、私があなただったら、CREATE TABLE ASを使用してマテリアライズド ビュー (MQT == マテリアライズド クエリ テーブル、db2 用語で) を作成し、事前に計算された名前の大文字の変形を含む列を追加します。注: DB2 ではマテリアライズド ビューにインデックスを追加できます。

于 2008-09-03T23:04:09.993 に答える