performance - Postgres 中的位图堆扫描非常慢

标签 performance postgresql indexing

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

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");

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;

这需要三秒钟的时间才能完成,我一辈子都想不通为什么。

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

我的规范:

  • Windows 7
  • Postgres 9.0
  • 4GB 内存

如果有任何有用的建议,我将不胜感激!

最佳答案

缓慢的部分显然是从表中获取数据,因为索引访问似乎非常快。您可以优化 RAM 使用参数(参见 http://wiki.postgresql.org/wiki/Performance_Optimizationhttp://www.varlena.com/GeneralBits/Tidbits/perf.html),或者通过发出 CLUSTER 命令优化表中数据的布局(参见 http://www.postgresql.org/docs/8.3/static/sql-cluster.html)。

CLUSTER "TrafficData" USING "RoadDate_Idx";

应该这样做。

关于performance - Postgres 中的位图堆扫描非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4009062/

相关文章:

javascript - 提高 UI 响应能力的技巧有哪些?

c# - 如何使 XML 反序列化更快?

ruby-on-rails - 为 postgresql jsonb 字段创建部分索引

postgresql - GROUP BY 时前两个值的差异

python - 你能改变python中的索引吗?

mysql - 聚集索引在SQL查询上的性能

javascript - 计算估计的页面加载时间

c++ - 一样的功能?使用 GMP(C++) 运行速度慢大约 10 倍

sql - (一张表)插入行

python - 了解 Pandas 0.8.1(和 0.11)中的索引问题