7

我有一个大表(> 50m 行),其中包含一些带有 ID 和时间戳的数据:

id, timestamp, data1, ..., dataN

...在 . 上有一个多列索引(id, timestamp)

我需要查询表以选择时间戳在两个日期之间的具有特定 ID 的所有行,我目前正在使用:

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

目前,这在高端机器上需要 2 多分钟(2x 3Ghz 双核 Xeons w/HT,16GB RAM,RAID 0 中的 2x 1TB 驱动器),我真的很想加快速度。

我发现了这个建议使用空间索引的技巧,但它给出的示例是针对 IP 地址的。然而,速度提升(436s 到 3s)令人印象深刻。

如何将它与时间戳一起使用?

4

3 回答 3

6

只有当您有两列 A 和 B 并使用以下查询时,该提示才适用:

where 'a' between A and B

那不是:

where A between 'a' and 'b'

使用 index ondate(column)而不是column可以加快一点速度。

于 2010-03-17T15:17:54.500 回答
1

你能为我们解释一下查询吗?然后我们知道数据库如何执行您的查询。那么配置呢?shared_buffers 和 work_mem 的设置是什么?您(或您的系统)最后一次抽真空和分析是什么时候?最后一件事,您使用的是什么操作系统和 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 回答