Postgres中的位图堆扫描非常慢

Tro*_*ing 6 postgresql indexing performance

我有以下包含流量测量数据的简单表:

CREATE TABLE "TrafficData"
(
  "RoadID" character varying NOT NULL,
  "DateID" numeric NOT NULL,
  "ExactDateTime" timestamp NOT NULL,
  "CarsSpeed" numeric NOT NULL,
  "CarsCount" numeric NOT NULL
)
CREATE INDEX "RoadDate_Idx" ON "TrafficData" USING btree ("RoadID", "DateID");
Run Code Online (Sandbox Code Playgroud)

列RoadID唯一标识,其数据被记录的道路,而DateID标识数据年份(1..365)的日子 - 基本上ExactDateTime的四舍五入表示.

我有大约100.000.000行; 有在列"RoadID" 1.000不同的值,并在列"DateID" 365倍不同的值.

然后我运行以下查询:

SELECT * FROM "TrafficData"
WHERE "RoadID"='Station_1'
AND "DateID">20100610 AND "DateID"<20100618;
Run Code Online (Sandbox Code Playgroud)

这需要多达三个令人难以置信秒完成了,我不能为我的生命找出原因.

EXPLAIN ANALYZE给出了以下输出:

Bitmap Heap Scan on "TrafficData"  (cost=104.84..9743.06 rows=2496 width=47) (actual time=35.112..2162.404 rows=2016 loops=1)
  Recheck Cond: ((("RoadID")::text = 'Station_1'::text) AND ("DateID" > 20100610::numeric) AND ("DateID" < 20100618::numeric))
  ->  Bitmap Index Scan on "RoadDate_Idx"  (cost=0.00..104.22 rows=2496 width=0) (actual time=1.637..1.637 rows=2016 loops=1)
        Index Cond: ((("RoadID")::text = 'Station_1'::text) AND ("DateID" > 20100610::numeric) AND ("DateID" < 20100618::numeric))
Total runtime: 2163.985 ms
Run Code Online (Sandbox Code Playgroud)

我的规格:

  • Windows 7的
  • Postgres 9.0
  • 4GB RAM

我非常感谢任何有用的指针!

vol*_*ron 0

  • 4GB RAM -> 6+ 你有 100M 记录,这并不大,但对于台式机来说内存可能很重要。如果这不是台式机,我不知道为什么你会有这么小的内存
  • AND "DateID">20100610 AND "DateID"<20100618;->DateID BETWEEN 20100611 AND 20100617;
  • 在 DateID 上创建索引
  • 去掉字段名称周围的所有双引号
  • RoadID创建一个文本字段而不是 VarChar