回答:
ソリューションに関係なく、product_idのインデックスが必要になります。
updated_at列にインデックスがあり、必要なのは、指定した「特定の製品」をフェッチすることだけである場合は、次のようにします。
select *
from Prices
where product_id = ?
order by updated_at desc
limit 1
しかし、希望する結果が得られなかった場合、または多くの製品の現在の価格を取得する必要がある場合は、アクティブな列を追加し、新しい列以外のすべての価格でNに設定するオプションを試してみます。価格の更新、そしてa_horse_with_no_nameで提案されているようにアクティブな部分インデックスを作成します。以前の価格行をアクティブにしないように更新するという複雑なレイヤーを追加するので、必要な場合にのみそこに行きます。
(product_id, updated_at)
またはオンの インデックスが必要(product_id, updated_at DESC)
です。だけでなく (updated_at)
。
データベースの残りの部分の知識がなければ、製品の価格のフェッチを高速化するために少しの非標準形式を用意できます(各アイテムに1つの価格があると仮定します)。
ただ、名前の新しい列を作成last_price
タイプのprice
あなたにproduct
テーブルを作成し、トリガーAFTER INSERT ON EACH ROW
、あなたのprice
テーブルを。新しい価格が作成されるたびに、関連する製品が最新の価格で更新されます。この方法では、製品をフェッチするたびに、その最終価格もフェッチします。
バージョン9.3以降、PostgreSQLはマテリアライズドビューをサポートしています。これは、データを非正規化して、書き込み用の通常の形式と読み取り用の非正規化されたビューを維持するための良い方法です。ビューの更新は、PostgresのLISTEN / NOTIFYメカニズムによってトリガーできます。
where active
おそらく最新の製品を取得するのにさらに役立ちます。