2

テキスト検索に関連して速度が低下しているため、クエリをより高速に実行する方法を見つけるために、Ingres Vectorwise データベースをテストしています。

char() 列に基づいて約 5000 項目を検索する場合、以下の実装 #1 は非常に高速です。残念ながら、50 項目を検索するのに、5000 項目を検索するのとほぼ同じ時間がかかります。

一方、実装 #2 は 50 アイテムに対しては非常に高速ですが、5000 アイテムに対してはまったくスケーリングしません。

実装 #3 は明らかに #1 よりも悪くなりますが、私が試したことの例を提供しただけです。

私の質問は次のとおりです。私のテーブルには q = bigint、r = char() フィールドの 2 つの列しかないと仮定すると、基本的な SQL を使用してこのクエリを記述し、より多くの選択肢を選択できるようにする他の方法を考えてもらえますか? 50 と 5000 (データベースで期待されるようにスケーリングするもの) で合理的に機能するオプションがあることを願っています。

同じ機能を実行する代替クエリを使用して、すべての回答を受け入れることに注意してください。多ければ多いほど良いです。私が望んでいる方法でスケールすることは期待していませんが、もっと試してみるまでわかりません.


実装 #1:

select q
from test_table
where r in ('a', 'b', 'c', 'd', 'e')

実装 #2:

select q
from test_table
where r = 'a' or r = 'b' or r = 'c' or r ='d' or r = 'e'

実装 #3:

select q
from test_table a
where exists (
    select r
    from testtable
    where r in ('a', 'b', 'c', 'd', 'e')
    and a.r = r)
4

2 に答える 2

2

Vectorwiseは、Bツリーインデックスがないため、「期待どおりにスケーリング」しません。ほとんどの列分析DBMSと同様に、ブロックごとの高い値と低い値のメタデータを使用して、代わりに読み取るブロックを選択します。これにより、非常に大きなテーブルから多くの行を引き出すときに優れたパフォーマンスが得られますが、いくつかの行を引き出すと、多くの不要な行を通過するため、パフォーマンスが低下します。

手動で、または「create index」コマンドを使用して、「r」でテーブルを並べ替えることで最適化できます(これにより、最初のロード後の一括ロードが防止されます)。これにより、メタデータがより正確になり、読み取られるブロックが少なくなります。

この例では、列が2つだけで、結合と集計関数がないことに注意してください。列型データベースは本当に必要なものですか、それともLuceneの方が適切ですか?

于 2013-03-01T16:05:59.767 に答える
1

ユニオンはORよりも速い可能性があるため、実装#2でユニオン/ユニオンをすべて提案することしかできません。実装#1は、私がより気に入っているものです。インデックスを使用する必要があり、十分に高速である必要があります。たとえば、Oracle 10g 以降では、EXISTS を使用するように IN サブクエリを自動的に書き換えます。

select q
from test_table
where r = 'a' 
UNION ALL
select q
from test_table
where r = 'b' 
....

UNION 演算子は個別の行を選択します。UNION ALL は、重複を含むすべての行を選択します。通常、UNION ALL は UNION よりも高速です。

于 2013-03-01T15:28:36.147 に答える