600万レコードのテーブルがあるとしましょう。16個の整数列といくつかのテキスト列があります。これは読み取り専用のテーブルであるため、すべての整数列にインデックスがあります。すべてのレコードは約50〜60バイトです。
テーブル名は「アイテム」
です。サーバーは、12 GB RAM、1.5 TB SATA、4コアです。postgres用のすべてのサーバー。
このデータベースにはさらに多くのテーブルがあるため、RAMがすべてのデータベースをカバーするわけではありません。
テーブル「Item」に列「a_elements」(大きな整数の配列型)を追加したいすべてのレコードは、この列に50〜60個以下の要素を持ちます。
その後、この列にインデックスGINを作成すると、一般的なクエリは次のようになります。
select * from item where ...... and '{5}' <@ a_elements;
私には、2番目のより古典的なオプションもあります。
列a_elementsをテーブルアイテムに追加せずに、2つの列を持つテーブル要素を作成します。
- id_item
- id_element
このテーブルには約200百万のレコードがあります。
このテーブルでパーティション分割を行うことができるので、レコード数はテーブル要素で20百万、テーブルアイテムで500Kに減少します。
2番目のオプションクエリは次のようになります。
select item.*
from item
left join elements on (item.id_item=elements.id_item)
where ....
and 5 = elements.id_element
パフォーマンスの観点から、どのオプションが優れているのだろうか。postgresは、単一のクエリでインデックスGIN(オプション1)を使用して多くの異なるインデックスを使用できますか?
このデータのインポートには20日かかるため、適切な決定を下す必要があります。