powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / тормоза
12 сообщений из 12, страница 1 из 1
тормоза
    #33161888
golden13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то странное твориться
Делаю:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
set enable_seqscan to off;
 1 . EXPLAIN ANALYZE SELECT res_pages2.page_id, res_pages2.resource_id, res_pages2.ex 
FROM res_pages2, pages 
WHERE pages.state= 1  AND res_pages2.page_id=pages.id AND res_pages2.word_id= 47  ORDER BY res_pages2.resource_id

 2 . EXPLAIN ANALYZE SELECT res_pages2.page_id, res_pages2.resource_id, res_pages2.ex 
FROM res_pages2, pages 
WHERE pages.state= 1  AND res_pages2.page_id=pages.id AND res_pages2.word_id= 45435  ORDER BY res_pages2.resource_id


В первом случае получаем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
"Sort  (cost=231007.70..231037.05 rows=11739 width=24) (actual time=431719.000..431749.000 rows=26566 loops=1)"
"  Sort Key: res_pages2.resource_id"
"  ->  Merge Join  (cost=151769.72..230214.21 rows=11739 width=24) (actual time=382718.000..430482.000 rows=26566 loops=1)"
"        Merge Cond: ("outer".page_id = "inner".id)"
"        ->  Sort  (cost=151769.72..151863.17 rows=37382 width=24) (actual time=382531.000..382825.000 rows=27792 loops=1)"
"              Sort Key: res_pages2.page_id"
"              ->  Index Scan using res_pages2_word_id on res_pages2  (cost=0.00..148393.38 rows=37382 width=24) (actual time=1000.000..374990.000 rows=27809 loops=1)"
"                    Index Cond: (word_id = 47)"
"        ->  Index Scan using pages_page_id_state on pages  (cost=0.00..77999.51 rows=56331 width=4) (actual time=156.000..46866.000 rows=54524 loops=1)"
"              Filter: (state = 1)"
"Total runtime: 432343.000 ms"

во втором:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
"Sort  (cost=11186.15..11187.21 rows=426 width=24) (actual time=797.000..797.000 rows=1 loops=1)"
"  Sort Key: res_pages2.resource_id"
"  ->  Nested Loop  (cost=0.00..11167.54 rows=426 width=24) (actual time=766.000..766.000 rows=1 loops=1)"
"        ->  Index Scan using res_pages2_word_id on res_pages2  (cost=0.00..5400.74 rows=1356 width=24) (actual time=516.000..516.000 rows=1 loops=1)"
"              Index Cond: (word_id = 329721)"
"        ->  Index Scan using pages_page_id_state on pages  (cost=0.00..4.24 rows=1 width=4) (actual time=250.000..250.000 rows=1 loops=1)"
"              Index Cond: ("outer".page_id = pages.id)"
"              Filter: (state = 1)"
"Total runtime: 875.000 ms"

тоесть в одном случае pages_page_id_state используется а в другом нет.
При этом в запросе меняеться только word_id=xxx

Как это понять? И вообще можно както это всё ускорить?

индексы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
pages:
CREATE UNIQUE INDEX pages_page_id ON pages USING btree (id);
CREATE UNIQUE INDEX pages_page_id_state ON pages USING btree (id) WHERE state =  1 ;

res_pages2:
CREATE INDEX res_pages2_ex ON res_pages2 USING btree (ex);
CREATE UNIQUE INDEX res_pages2_id ON res_pages2 USING btree (id);
CREATE INDEX res_pages2_page_id ON res_pages2 USING btree (page_id);
CREATE INDEX res_pages2_resource_id ON res_pages2 USING btree (resource_id);
CREATE INDEX res_pages2_word_id ON res_pages2 USING btree (word_id);

в таблице res_pages2 11 лимонов записей в pages 180000
...
Рейтинг: 0 / 0
тормоза
    #33161934
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте ..

вместо
id = xx

такую комбинацию...
id >= xx and id <= xx


на оракле такие фокусы часты. а постгресик похож :)

(круглый)
...
Рейтинг: 0 / 0
тормоза
    #33162109
golden13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тьфу ты, что-то я напутал, pages_page_id_state используется и там и там.
Проблема в joine в первом случае почему то Merge Join а во втором Nested Loop
...
Рейтинг: 0 / 0
тормоза
    #33162119
Meta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
golden13тьфу ты, что-то я напутал, pages_page_id_state используется и там и там.
Проблема в joine в первом случае почему то Merge Join а во втором Nested Loop

Забавно :)
Могу лишь посоветовать изменить запрос :-)

А версия сервера какая?
...
Рейтинг: 0 / 0
тормоза
    #33162133
golden13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PostgreSQL 8.0
Изменить запрос ? На что?
Помоему он простой до нельзя. Непонятно почему отрабатывается по разному.
...
Рейтинг: 0 / 0
тормоза
    #33162207
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй

FROM res_pages2, pages
WHERE pages.state=1 AND res_pages2.page_id=pages.id

заменить на

FROM res_pages2, (select * from pages where state=1) as pages
WHERE res_pages2.page_id=pages.id

и покажи explain
...
Рейтинг: 0 / 0
тормоза
    #33162238
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведи результаты запросов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT count(*)
FROM res_pages2
WHERE word_id= 47 

SELECT count(*)
FROM res_pages2
WHERE word_id= 45435 

SELECT count(*)
FROM res_pages2

Думается будет 37382, 1356, а вот общее число строк как раз и интересно
...
Рейтинг: 0 / 0
тормоза
    #33162247
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ээээ
Секундочку, попробуй 2 индекса:
res_pages2(word_id, page_id)
pages(id, state)

Кажется так.
Если не напутал ничего.
Хотя конечно знать хоть что-то о селективность данных не помешало б.
...
Рейтинг: 0 / 0
тормоза
    #33162464
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё, если план запроса от изменения одного параметра прыгает, можно попробовать гистограмму расширить (см. ALTER TABLE .. SET STATISTICS).
IMHO умолчальное значение (default_statistics_target=10) маловато, во всяком случае по опыту работы с другим сервером (Sybase). Там число шагов по-умолчанию = 20, да и то иногда приходится расширять.
...
Рейтинг: 0 / 0
тормоза
    #33162752
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golden13Что-то странное творитьсяНичего странного. Оптимизатор постгреса предполагает, что word_id=47 соответствует 37382 строк, а word_id=45435 - 1356 строк. Из-за этого он и выбирает разные планы. И он прав, потому что на самом деле для word_id=47 - 27809 строк, а для word_id=45435 - 1 строка.

golden13И вообще можно както это всё ускорить?Ускорить первый запрос, который, обратите внимание, возвращает 26566 строк? Индексы word_id,page_id (избавит от сортировки) и state,id (избавит от Filter) немного помогут, но этот запрос все равно не будет выполняться быстрее 374990 миллисекунд, которые выполняется Index Scan по word_id=47.
...
Рейтинг: 0 / 0
тормоза
    #33163106
golden13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо. Действительно не обратил внимание что запрос с word_id=47 вовращает гораздо больше записей чем с word_id=45435

Создал индексы
Код: plaintext
1.
2.
CREATE INDEX res_pages2_word_page ON res_pages2 USING btree (word_id, page_id);
CREATE INDEX pages_state_id ON pages USING btree (state, id);

Немного всё убыстрилось, в запросе №1, и вместо Merge Join берётся Nested Loop

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
"Sort  (cost=10781.67..10782.77 rows=440 width=24) (actual time=397922.000..397970.000 rows=26566 loops=1)"
"  Sort Key: res_pages2.resource_id"
"  ->  Nested Loop  (cost=0.00..10762.35 rows=440 width=24) (actual time=344.000..395807.000 rows=26566 loops=1)"
"        ->  Index Scan using res_pages2_word_id on res_pages2  (cost=0.00..5359.77 rows=1345 width=24) (actual time=94.000..359463.000 rows=27809 loops=1)"
"              Index Cond: (word_id = 47)"
"        ->  Index Scan using pages_page_id_state on pages  (cost=0.00..4.00 rows=1 width=4) (actual time=1.234..1.241 rows=1 loops=27809)"
"              Index Cond: ("outer".page_id = pages.id)"
"              Filter: (state = 1)"
"Total runtime: 398641.000 ms"

Буду дальше думать, как убыстрить всё это.
...
Рейтинг: 0 / 0
тормоза
    #33163212
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golden13Буду дальше думать, как убыстрить всё это.Избавиться от внешней сортировки: сделать ORDER BY word_id,resource_id и создать индекс word_id,resource_id. И выдавать результат постранично используя limit и offset.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / тормоза
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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