0

次のような値を保持するテーブルがあります。

id  | prefix         | name 
----+----------------+--------------------------
1   | record1        | name for record 1
2   | record2        | name for record 2
3   | record         | name for record 3
4   | another rec    | name for record 4

指定されたテキストの最長のプレフィックスを選択して名前を返すために、次のSQLを使用します。

select top 1 name from prefixes where :text like prefix + '%' order by prefix desc

そして、これはまさに私が必要としているものです。テキストを与えると、それが私をrecord1返すname for record 2ときrecord1に私を返します。私がそれname for record 1を与えると、私をa返しますname for record 4

しかし、問題は、これが数回実行され、テーブルが頻繁に更新されることです。したがって、私の場合(210000行しかないテーブル)のパフォーマンスは約300ミリ秒です。これを減らしたいのですが、何か改善できることがありますかクエリまたはデータベース上でさえ?

4

1 に答える 1

1

Sybaseの内部についてはよくわかりません。ただし、プランを見て、インデックスを使用しているかどうかを確認してください。もしそうなら、それはインデックスのフルスキャンを実行していますか、それとも「いいね」を理解するのに十分スマートなエンジンですか。

私の推測では、エンジンはフルスキャンを実行しています。クエリを変更することで、正しい開始位置を探すように仕向けることができる場合があります。

where prefix >= :text and :text like prefix + '%'

ただし、おそらくその時点からフルスキャンを実行します。検索する場所を最大にすることで、これを修正できます。

where prefix >= :text and prefix <= :text + 'zzz'

(プレフィックスに英数字の値を使用していると仮定すると、これは問題ありません。ASCII照合を使用していると仮定すると、'}'のASCII値は非常に高いため、:text+'}'のようなものを使用することもできます。順序。)

プレフィックスは事前にわかっていますか?つまり、「record1」のプレフィックスは常に「record」ですか?または、「r」、「re」などを検討していますか。

前者の場合は、プレフィックスの「ベース」部分を含む新しい列を追加します。この列にインデックスを作成し、結合を等式に変更します。エンジンは、インデックスからレコードのみをフェッチします。

インデックスに「name」列を含めることの問題は、テーブルのデータページで名前を検索する追加の手順を防ぐことです。繰り返しますが、これはSybaseがクエリを最適化する方法によって異なります。インデックスのみを使用して適切なレコード検索し、を適用した後にフィールドを検索する必要がありますtop 1。ただし、すべての値をフェッチしてから適用する場合はtop 1、インデックスに「名前」が含まれていると便利です。

于 2012-12-01T17:43:12.810 に答える