У меня есть следующая простая таблица, которая содержит данные измерения трафика:
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» имеется 1000 различных значений, а в столбце «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
- 4 ГБ ОЗУ
Буду очень признателен за полезные советы!