[Lug-bg] PgSQL table optimization.
- Subject: [Lug-bg] PgSQL table optimization.
- From: Marian Marinov <mm@xxxxxxxx>
- Date: Thu, 26 Jun 2008 21:42:21 +0300
Здравейте колеги,
днес цял ден се мъча с една табличка на Postgre.
таблицата е следната:
cpustats=> \d stats
Table "public.stats"
Column | Type | Modifiers
----------+-----------------------------+-----------------------------------------------------
id | integer | not null default
nextval('stats_id_seq'::text)
date | timestamp without time zone |
username | character varying(10) | not null
realtime | double precision | default 0
usertime | double precision | default 0
systime | double precision | default 0
Индексите с които съм пробвал са:
Indexes:
"stats_id" unique, btree (id)
"stats_24hour" btree (date) WHERE (date > '2008-06-25 13:09:33'::timestamp
without time zone)
"stats_24hourt" btree (date_trunc('hour'::text, date)) WHERE ((date
> '2008-06-25 13:09:33'::timestamp without time zone) AND (date < '2008-06-26
13:10:57'::timestamp without time zone))
"stats_date" btree (date)
"stats_datetrunc" btree (date_trunc('hour'::text, date))
"stats_dateuser" btree (date_trunc('hour'::text, date), username)
"stats_realtime" btree (realtime)
"stats_systime" btree (systime)
"stats_usertime" btree (usertime)
А заявките са тези:
cpustats-> \d exec2
View "public.exec2"
Column | Type | Modifiers
--------+-----------------------------+-----------
date | timestamp without time zone |
count | bigint |
View definition:
SELECT date_trunc('hour'::text, stats.date) AS date, count(stats.date) AS
count
FROM stats
WHERE stats.date::timestamp with time zone > (now() - '1 day'::interval)
GROUP BY stats.date
ORDER BY date;
cpustats-> \d daily_cpu_stats
View "public.daily_cpu_stats"
Column | Type | Modifiers
--------+-----------------------------+-----------
hours | timestamp without time zone |
rt | double precision |
ut | double precision |
st | double precision |
count | bigint |
View definition:
SELECT date_trunc('hour'::text, stats.date) AS hours, sum(stats.realtime) AS
rt, sum(stats.usertime) AS ut, sum(stats.systime) AS st, count(stats.systime)
AS count
FROM stats
WHERE stats.date::timestamp with time zone > (now() - '1 day'::interval)
GROUP BY date_trunc('hour'::text, stats.date)
ORDER BY date_trunc('hour'::text, stats.date);
проблемът ми е че тези заявки ми отнемат повече от 15сек всяка и товарят
ужастно. Независимо какви комбинации от индекси използвах.
Таблицата към момента има 1,400,000 записа и на ден ми ръсте със средно
400,000.
Аааа да и едно ограничение, говорим си за Postgres 7.4. Аз сериозно си мисля
да си направя експеримент с partitioning на по-нов postgres.
Моля ако някой има някаква идея как това може да се оптимизира да се обади.
Приемам всякакви предложения, промяна на таблицата и каквото и да е.
Бирата е от мен.
Поздрави
Marian Marinov
System Architect at Siteground.com
_______________________________________________
Lug-bg mailing list
Lug-bg@xxxxxxxxxxxxxxxxxx
http://linux-bulgaria.org/mailman/listinfo/lug-bg
|