2017-09-20 1 views
0

データはbytea形式で、どのように私は最初の4バイトでクエリする必要がありますバイト列にインデックスがpostgresqlデータベースを照会します。私は試しました私は大規模なデータベースをフィルタリングする必要がありますPythonとSQLを使用して2億エントリ

SELECT * FROM table WHERE addr LIKE '%8ac5c320____' 

しかし、それは見つけるには時間がかかります。助言がありますか?私は文字列全体を照会すると高速に動作しますが、約20億のエントリがあり、ワイルドカードを使用することはできません。

+1

最初の4バイトが必要な場合は、最初の '%'をオフにします。 –

+0

DBクエリが "時間がかかりすぎる"かどうかを確認する最初のことは、一致するインデックスがあるかどうかです。クエリで 'EXPLAIN'を試してください。 –

+0

先行するワイルドカードは、索引の効率に大きく影響する確定的ではありません。 – Kyle

答えて

1

最初の4バイトに基づいて一致を得るには、次のクエリをお勧めします。

SELECT * FROM table WHERE substring(addr from 0 for 5) = '\x8ac5c320'::bytea; 

部分文字列のドキュメントはthe bytea functions pageにありますが、これはごくわずかですが、

書き込まれたクエリは、テーブル全体にわたって順次スキャンを実行する可能性があります。

CREATE INDEX ON table (substring(addr from 0 for 5)); 

特にあなたが頻繁に実行する必要があるクエリのために設計されたインデックスを作成します。それを解決するには、以下のインデックスを作成します。これは機能的なインデックスです。つまり、列ではなく関数の結果を索引付けしています。

これは、あなたが望むパフォーマンスを得られるはずです。

しかし、あなたのサンプルクエリは最初の4バイトを照会するのではありません。クエリの説明よりもクエリが正しい場合、この方法は機能しません。

+0

説明SELECT * FROMテーブルWHERE部分文字列(addr from 0 for 5)= '\ x8ac5c320' :: bytea; クエリプラン ---------------------------------------------- -------------------------------------------------- - Bitmapヒープ・スキャン・テーブル(コスト= 160844.32..17035395.99行= 8592999幅= 71) 再チェック・コンド:( "substring"(addr、0、5)= '\ x8ac5c320' :: bytea) - >ビットマップ・インデックスインデックスCond:( "substring"(addr、0、5)= '\ x8ac5c320' :: bytea) – Roger

+0

これは実行に時間がかかりすぎていますそこには理由がありますか? – Roger

+0

見つけるのに約30秒〜1分かかりますが、より速い方法がありますか? – Roger

関連する問題