7

ID とタイムスタンプを持つデータを含む大きなテーブル (> 50m 行) があります。

id, timestamp, data1, ..., dataN

...上に複数列のインデックスがあり(id, timestamp)ます。

タイムスタンプが2つの日付の間にある特定のIDを持つすべての行を選択するには、テーブルをクエリする必要があります。これは現在使用しています:

SELECT * FROM mytable WHERE id = x AND timestamp BETWEEN y AND z

これは現在、ハイエンドマシン (2x 3Ghz デュアルコア Xeons、HT、16GB RAM、RAID 0 の 2x 1TB ドライブ) で 2 分以上かかります。

空間インデックスの使用を推奨するこのヒントを見つけましたが、その例は IP アドレス用です。ただし、速度の向上 (436 秒から 3 秒) は印象的です。

これをタイムスタンプで使用するにはどうすればよいですか?

4

3 に答える 3

6

このヒントは、2 つの列 A と B があり、次のようなクエリを使用する場合にのみ適しています。

where 'a' between A and B

そうではありません:

where A between 'a' and 'b'

index on を使用するのでdate(column)はなくcolumn、少し高速化できます。

于 2010-03-17T15:17:54.500 に答える
1

クエリを説明していただけますか? 次に、データベースがクエリをどのように実行するかがわかります。そして、構成はどうですか?shared_buffers と work_mem の設定は何ですか? また、あなた (またはあなたのシステム) が最後にバキュームと分析を行ったのはいつですか? 最後に、使用している OS と pgSQL のバージョンを教えてください。

すばらしいインデックスを作成できますが、適切な設定がないと、データベースはそれらを非常に効率的に使用できません。

于 2010-03-17T17:43:23.850 に答える
0

インデックスが TableID+TableTimestamp であることを確認し、次のようなクエリを実行します。

SELECT
    ....
    FROM YourTable
    WHERE TableID=..YourID.. 
        AND TableTimestamp>=..startrange.. 
        AND TableTimestamp<=..endrange..

WHERE でテーブルの TableTimestamp 列に関数を適用すると、インデックスを完全には使用できなくなります。

すでにこれらすべてを行っている場合は、ハードウェアがそのタスクに対応していない可能性があります。

バージョン 8.2 以降を使用している場合は、次を試してください。

WHERE (TableID, TableTimestamp) >= (..YourID.., ..startrange.. ) 
    and (TableID, TableTimestamp) <= (..YourID.., ..endrange..)
于 2010-03-17T12:06:06.327 に答える