powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Время выполнения запроса
14 сообщений из 14, страница 1 из 1
Время выполнения запроса
    #34492919
Lirin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 2 сервера, PostgreSQL 8.1.4, таблица tp на обоих серверах практически идентична, за исключением индексов. Есть запрос
Код: plaintext
1.
SELECT country, district, tour_nb, vilet, currency, min(price) AS price FROM tp 
WHERE(vivod <>  0 ) GROUP BY country, district, tour_nb, vilet, currency

1) в первом случае индексы по полям (count), (country), (district), (food, tour_nb), (hotel_cnt), (oper, tour_nb), (room_class), (stars), (tour_nb), (vilet).
Explain analyze:
Код: plaintext
1.
2.
3.
"HashAggregate  (cost=303904.86..312034.00 rows=650331 width=20) (actual time=36693.271..36722.198 rows=12940 loops=1)"
"  ->  Seq Scan on tp  (cost=0.00..206355.30 rows=6503304 width=20) (actual time=1.011..15802.976 rows=6286137 loops=1)"
"        Filter: (vivod <> 0)"
"Total runtime: 36747.007 ms"
2) во втором случае индексы по полям (count), (country), (days_nights), (district), (food), (hotel_cnt, price), (price), (stars), (currency), (tour_nb), (tour_nb, vilet), (tour_nb, vilet, hotel_cnt, days_nights, food, price), (vilet).
Explain analyze:
Код: plaintext
1.
2.
3.
4.
5.
"GroupAggregate  (cost=1328797.65..1451393.01 rows=653842 width=20) (actual time=1390911.489..1506019.124 rows=12940 loops=1)"
"  ->  Sort  (cost=1328797.65..1345143.70 rows=6538419 width=20) (actual time=1390911.354..1490413.182 rows=6284155 loops=1)"
"        Sort Key: country, district, tour_nb, vilet, currency"
"        ->  Seq Scan on tp  (cost=0.00..208511.94 rows=6538419 width=20) (actual time=19.984..383624.708 rows=6284155 loops=1)"
"              Filter: (vivod <> 0)"
"Total runtime: 1506438.271 ms"

Разница между 36747.007 ms и 1506438.271 ms я так понимаю из-за разных методов. Причем, даже если убрать условие WHERE(vivod <> 0), ничего не меняется ни на первом сервере, ни на втором... Что можно сделать, чтобы на втором сервере постгрес также делал через HashAggregate, а не через GroupAggregate?
...
Рейтинг: 0 / 0
Время выполнения запроса
    #34493132
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lirin1) в первом случае индексы по полям (count), (country), (district), (food, tour_nb), (hotel_cnt), (oper, tour_nb), (room_class), (stars), (tour_nb), (vilet).
2) во втором случае индексы по полям (count), (country), (days_nights), (district), (food), (hotel_cnt, price), (price), (stars), (currency), (tour_nb), (tour_nb, vilet), (tour_nb, vilet, hotel_cnt, days_nights, food, price), (vilet).Эти индексы ни при чем. Ни в первом, ни во втором планах они не используются.

Попробуйте построить индекс по комбинации "country,district,tour_nb,vilet,currency" или частичный с условием "where vivod<>0".

LirinРазница между 36747.007 ms и 1506438.271 ms я так понимаю из-за разных методов.Не только. Обратите внимание, скорость выполнения аналогичных этапов seqscan, возвращающих примерно одинаковое кол-во строк, отличается в 25 раз.

Seq Scan on tp ... (actual time=1.011..15802.976 rows=6286137 loops=1)
Seq Scan on tp ... (actual time=19.984..383624.708 rows=6284155 loops=1)

LirinЧто можно сделать, чтобы на втором сервере постгрес также делал через HashAggregate, а не через GroupAggregate?set enable_hashagg to on;
...
Рейтинг: 0 / 0
Время выполнения запроса
    #34493627
Lirin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBatПопробуйте построить индекс по комбинации "country,district,tour_nb,vilet,currency" или частичный с условием "where vivod<>0".

индекс создан, но все равно я так понимаю не используется, условие "where vivod<>0" из запроса убрано, т.к. в общем-то оно там и не нужно, в результате все равно:

Код: plaintext
1.
2.
3.
4.
"GroupAggregate  (cost=1266182.15..1384156.91 rows=629199 width=20) (actual time=1885757.945..2010626.806 rows=12916 loops=1)"
"  ->  Sort  (cost=1266182.15..1281912.12 rows=6291987 width=20) (actual time=1885741.047..1996114.434 rows=6284157 loops=1)"
"        Sort Key: country, district, tour_nb, vilet, currency"
"        ->  Seq Scan on tour_price  (cost=0.00..189976.87 rows=6291987 width=20) (actual time=18.462..580584.254 rows=6284157 loops=1)"
"Total runtime: 2011208.509 ms"

LeXa NalBatset enable_hashagg to on;

изначально было на "on", но постгрес почему-то упорно предпочитает GroupAggregate
...
Рейтинг: 0 / 0
Время выполнения запроса
    #34494600
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
set enable_sort to off;
set enable_seqscan to off;
...
Рейтинг: 0 / 0
Время выполнения запроса
    #34513471
Lirin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBatset enable_sort to off;
set enable_seqscan to off;

не помогло, все равно GroupAggregate, с незначительным изменением времени выполнения. на что еще можно посмотреть?
...
Рейтинг: 0 / 0
Время выполнения запроса
    #34515292
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lirin LeXa NalBatset enable_sort to off;
set enable_seqscan to off;не помогло, все равно GroupAggregateпокажите explain analyze. и еще \d tp
...
Рейтинг: 0 / 0
Время выполнения запроса
    #34516207
Lirin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблица, 6,5 миллионов записей:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
CREATE TABLE tp
(
  count int4 DEFAULT nextval(('tp_count_seq'::text)::regclass),
  tour int4,
  pack int4,
  category int2,
  hotel int4,
  room_class int2,
  food int2,
  days int2,
  stars int2,
  days_nights int2,
  quantity int2,
  "1" int4,
  price int4,
  "3" int4,
  "4" int4,
  "5" int4,
  "6" int4,
  "7" int4,
  "8" int4,
  "9" int4,
  "10" int4,
  oper int2,
  spo int4,
  vivod int2,
  hot int2,
  userlast int2,
  datelast date,
  vilet date,
  h_class int2,
  avia int2 DEFAULT  0 ,
  country int2,
  doplata int4,
  doplata_flag int2,
  district int4,
  currency int2,
  date_time_last timestamp,
  discount int2,
  reis int2
) 
WITH OIDS;
Индексы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
CREATE UNIQUE INDEX count_tp_ukey
  ON tp
  USING btree
  (count);
CREATE INDEX country_tp_key
  ON tp
  USING btree
  (country);
CREATE INDEX days_nights_tp_key
  ON tp
  USING btree
  (days_nights);
CREATE INDEX district_tp_key
  ON tp
  USING btree
  (district);
CREATE INDEX food_tp_key
  ON tp
  USING btree
  (food);
CREATE INDEX price_hot
  ON tp
  USING btree
  (hotel, price);
CREATE INDEX price_tp_key
  ON tp
  USING btree
  (price);
CREATE INDEX stars_tp_key
  ON tp
  USING btree
  (stars);
CREATE INDEX tp_currency
  ON tp
  USING btree
  (currency);
CREATE INDEX tp_tour
  ON tp
  USING btree
  (tour);
CREATE INDEX tp_tour_vilet
  ON tp
  USING btree
  (tour, vilet);
CREATE INDEX tp1
  ON tp
  USING btree
  (tour, vilet, hotel, days_nights, food, price);
CREATE INDEX tp2
  ON tp
  USING btree
  (country, district, tour, vilet, currency);
CREATE INDEX vilet_tp_key
  ON tp
  USING btree
  (vilet);
И в результате:
Код: plaintext
1.
2.
"GroupAggregate  (cost=0.00..24547251.92 rows=637497 width=20) (actual time=549.776..842178.413 rows=14612 loops=1)"
"  ->  Index Scan using tp2 on tp  (cost=0.00..24443658.78 rows=6374962 width=20) (actual time=13.170..818496.131 rows=6352345 loops=1)"
"Total runtime: 842213.238 ms"
Меньше, чем без использвания индекса, но все-таки не дает покоя прелесть HashAggregate с 36 секундами выполнения....
...
Рейтинг: 0 / 0
Время выполнения запроса
    #34516372
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LirinИ в результате:
GroupAggregate
-> Index Scanсделайте "set enable_indexscan to off", "set enable_sort to off" и покажите explain analyze
Lirinне дает покоя прелесть HashAggregate с 36 секундами выполнения....так ведь это на другом сервере и базе, где seqscan в 25 раз быстрее. тут надо не с hash/group разбираться, а искать различия межде этими серверами/базами
...
Рейтинг: 0 / 0
Время выполнения запроса
    #34516522
Lirin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBatсделайте "set enable_indexscan to off", "set enable_sort to off" и покажите explain analyze
Код: plaintext
1.
2.
"GroupAggregate  (cost=100000000.00..124780094.99 rows=643491 width=20) (actual time=360.265..838193.620 rows=14644 loops=1)"
"  ->  Index Scan using tp2 on tp  (cost=100000000.00..124675527.77 rows=6434906 width=20) (actual time=5.775..819053.614 rows=6356186 loops=1)"
"Total runtime: 838223.841 ms"

LeXa NalBatтак ведь это на другом сервере и базе, где seqscan в 25 раз быстрее. тут надо не с hash/group разбираться, а искать различия межде этими серверами/базами

базы одинаковые, за исключением индексов
основная разница пожалуй только в том, что один вебсервер, другой локальный.
...
Рейтинг: 0 / 0
Время выполнения запроса
    #34517264
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lirin LeXa NalBatсделайте "set enable_indexscan to off", "set enable_sort to off" и покажите explain analyzeGroupAggregate (cost=100000000.00
-> Index Scan using tp2 on tp (cost=100000000.00не понятно. сделайте пожалуйста select version(); и show enable_hashagg;

Lirin LeXa NalBatтак ведь это на другом сервере и базе, где seqscan в 25 раз быстрее. тут надо не с hash/group разбираться, а искать различия межде этими серверами/базамибазы одинаковые, за исключением индексов
основная разница пожалуй только в том, что один вебсервер, другой локальный.тем не менее. при том что они кажутся одинаковыми, на одном простой seqscan работает в 25 раз быстрее, чем на другом. наверное надо понять причину.
...
Рейтинг: 0 / 0
Время выполнения запроса
    #34517386
Lirin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot LeXa NalBatсделайте пожалуйста select version(); и show enable_hashagg;[/quot]

enable_hashagg = on
версия "PostgreSQL 8.1.4 on i386-unknown-freebsd5.4, compiled by GCC gcc (GCC) 3.4.2 [FreeBSD] 20040728"

LeXa NalBatтем не менее. при том что они кажутся одинаковыми, на одном простой seqscan работает в 25 раз быстрее, чем на другом. наверное надо понять причину.

а в какую сторону лучше копать? железо (проц, память) или настройки (фрибсд, постгрес)?
...
Рейтинг: 0 / 0
Время выполнения запроса
    #34517506
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lirinenable_hashagg = on
версия "PostgreSQL 8.1.4 on i386-unknown-freebsd5.4, compiled by GCC gcc (GCC) 3.4.2 [FreeBSD] 20040728"спасибо, все правильно. я вам ошибочно советовал выключить seqscan. попробуйте плиз так:
set enable_seqscan to on;
set enable_hashagg to on;
set enable_indexscan to off;
set enable_sort to off;

Lirin LeXa NalBatтем не менее. при том что они кажутся одинаковыми, на одном простой seqscan работает в 25 раз быстрее, чем на другом. наверное надо понять причину.а в какую сторону лучше копать? железо (проц, память) или настройки (фрибсд, постгрес)?причина наверное может быть в чем угодно
- железо (частота проца, перегрев, объем памяти,..?)
- ось (сборка,..?)
- постгрес (конфиг,..?)
- база (разрослась, закэшировалась,..?)

для того чтобы проверить, что база не разрослась, я бы на обоих серверах одинаковым образом создал новую тестовую таблицу, залил в нее одинаковые данные, сравнил скорость выполнения seqscan.

для того, чтобы кэширование не внесло ошибку в сравнение, я смотрю на время выполнения второго подряд запроса.
...
Рейтинг: 0 / 0
Время выполнения запроса
    #34519430
Sad Spirit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lirin[quot LeXa NalBatсделайте пожалуйста select version(); и show enable_hashagg;
а в какую сторону лучше копать? железо (проц, память) или настройки (фрибсд, постгрес)?[/quot]
Я бы начал с дисков --- hdparm'ом проверил скорость чтения и посмотрел настройки dma и т.п.
...
Рейтинг: 0 / 0
Время выполнения запроса
    #34520261
Lirin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем огромное спасибо! Попробую разобраться.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Время выполнения запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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