Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация / 6 сообщений из 6, страница 1 из 1
07.02.2008, 14:04
    #35116960
mwolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация
Дано:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE dbmail_messages
(
  message_idnr int8 NOT NULL DEFAULT nextval('dbmail_message_idnr_seq'::text),
...
);

CREATE INDEX dbmail_messages_idx
  ON dbmail_messages
  USING btree
  (message_idnr);

Запросы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
explain 
select COUNT(*)
from dbmail_messages
WHERE message_idnr =  1109589 

"Aggregate  (cost=4119.34..4119.34 rows=1 width=0)"
"  ->  Index Scan using dbmail_messages_idx on dbmail_messages  (cost=0.00..4116.43 rows=1160 width=0)"
"        Index Cond: (message_idnr = 1109589)"

Тут всё ок

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
explain 
select COUNT(*)
from dbmail_messages
WHERE message_idnr =  1109589  OR  message_idnr =  1109243 

"Aggregate  (cost=7860.32..7860.32 rows=1 width=0)"
"  ->  Seq Scan on dbmail_messages  (cost=0.00..7854.54 rows=2313 width=0)"
"        Filter: ((message_idnr = 1109589) OR (message_idnr = 1109243))"
Индекс исчез - начался сек скан.

Полный запрос имеет вид
Код: plaintext
1.
2.
...
WHERE message_idnr IN ( 1109589 , 1109243 , 1108982 , 1108678 , ...порядка  90  констант)
но запрос с двумя константами тоже не жаждит работать

Кол-во записей в таблице - 232020
Полный запрос вытягивает ровно 100
Приведённый выше запрос с сек сканом - 2

Версия сервака по прежнему PostgreSQL 8.0.15

Чо можно делать с этой сранью кроме апгрейда?
...
Рейтинг: 0 / 0
07.02.2008, 14:17
    #35117002
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация
mwolfкроме апгрейдав 8.1 появились битмапсканы, они должны помочь
...
Рейтинг: 0 / 0
07.02.2008, 14:33
    #35117062
mwolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация
LeXa NalBat mwolfкроме апгрейдав 8.1 появились битмапсканы, они должны помочь

Что за битмап сканы?

В Оракле слышал что-то подобное
Но смутно представляю как это мне поможет

Постгрес, насколько я помню, подобные OR неплохо отрабатывал
Или я что-то путаю?
...
Рейтинг: 0 / 0
07.02.2008, 14:41
    #35117101
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация
mwolfЧто за битмап сканы? indexes-bitmap-scans.html

mwolfНо смутно представляю как это мне поможетFor example, a query like WHERE x = 42 OR x = 47 OR x = 53 OR x = 99 could be broken down into four separate scans of an index on x, each scan using one of the query clauses. The results of these scans are then ORed together to produce the result.

должно помочь

mwolfПостгрес, насколько я помню, подобные OR неплохо отрабатывалвроде бы нет. только через bitmapscan или seqscan.
...
Рейтинг: 0 / 0
07.02.2008, 21:43
    #35118292
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация
другой вариант. если условия попарно непересекающиеся.

select *
from dbmail_messages
WHERE message_idnr = 1109589
UNION ALL
select *
from dbmail_messages
WHERE message_idnr = 1109243

должен быстро работать через indexscan на вашей версии постгреса
...
Рейтинг: 0 / 0
08.02.2008, 11:01
    #35119020
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация
в специфическом случае, когда все константы в наборе IN(...) лежат в относительно узком диапазоне
$message_idnr_min..$message_idnr_max
, можно ускорить запрос добавив условие
AND message_idnr BETWEEN $message_idnr_min AND $message_idnr_max
- будет взят индексскан по диапазону, а на него наложен фильтр
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]