powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса
4 сообщений из 4, страница 1 из 1
Оптимизация запроса
    #34284795
Lirin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть запрос:
Код: plaintext
explain analyze SELECT vilet, hotel_cnt, days_nights, food, min(price) AS price FROM tp WHERE((tour_nb = '16') AND (vilet >= '2007-01-26')) GROUP BY vilet, hotel_cnt, days_nights, food ORDER BY vilet, price
в таблице tp 4 млн. записей, если из них условию WHERE удовлетворяет 2,5 млн., то запрос выполняется очень долгое время:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
QUERY PLAN
Sort  (cost= 679621 . 74 .. 680333 . 37  rows= 284654  width= 16 ) (actual time= 206917 . 334 .. 207497 . 849  rows= 327707  loops= 1 )
  Sort Key: vilet, min(price)
  ->  GroupAggregate  (cost= 601432 . 49 .. 647688 . 72  rows= 284654  width= 16 ) (actual time= 191543 . 087 .. 204127 . 293  rows= 327707  loops= 1 )
        ->  Sort  (cost= 601432 . 49 .. 608548 . 83  rows= 2846537  width= 16 ) (actual time= 191543 . 062 .. 197496 . 533  rows= 2496225  loops= 1 )
              Sort Key: vilet, hotel_cnt, days_nights, food
              ->  Bitmap Heap Scan on tp  (cost= 16559 . 21 .. 146372 . 68  rows= 2846537  width= 16 ) (actual time= 9862 . 352 .. 38508 . 660  rows= 2496225  loops= 1 )
                    Recheck Cond: (tour_nb =  16 )
                    Filter: (vilet >= '2007-01-26'::date)
                    ->  Bitmap Index Scan on tp_tour_nb  (cost= 0 . 00 .. 16559 . 21  rows= 2870631  width= 0 ) (actual time= 9795 . 128 .. 9795 . 128  rows= 2941451  loops= 1 )
                          Index Cond: (tour_nb =  16 )
Total runtime:  208108 . 157  ms
если из них условию WHERE удовлетворяет 600 тыс. записей., то быстрее
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
QUERY PLAN
Sort  (cost= 105024 . 41 .. 105132 . 15  rows= 43094  width= 16 ) (actual time= 6506 . 731 .. 6739 . 428  rows= 133903  loops= 1 )
  Sort Key: vilet, min(price)
  ->  HashAggregate  (cost= 101168 . 53 .. 101707 . 21  rows= 43094  width= 16 ) (actual time= 5047 . 583 .. 5412 . 908  rows= 133903  loops= 1 )
        ->  Bitmap Heap Scan on tp  (cost= 2508 . 05 .. 95781 . 82  rows= 430937  width= 16 ) (actual time= 104 . 977 .. 1467 . 080  rows= 378773  loops= 1 )
              Recheck Cond: (tour_nb =  21 )
              Filter: (vilet >= '2007-01-26'::date)
              ->  Bitmap Index Scan on tp_tour_nb  (cost= 0 . 00 .. 2508 . 05  rows= 434585  width= 0 ) (actual time= 100 . 814 .. 100 . 814  rows= 387773  loops= 1 )
                    Index Cond: (tour_nb =  21 )
Total runtime:  6934 . 708  ms
в таблице существуют индексы по полям: count, country, days_nights, district, food, stars, tour_nb, vilet, а также (tour_nb, vilet) и (hotel_cnt, price).
что можно сделать для увеличения скорости обработки первого запроса?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #34284910
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
explain
 analyze
select
 vilet, hotel_cnt, days_nights, food, price
from
 (
  select
   distinct on ( vilet, hotel_cnt, days_nights, food )
   vilet, hotel_cnt, days_nights, food, price
  from
   tp
  where
   tour_nb = '16' and vilet >= '2007-01-26'
  order by
   vilet, hotel_cnt, days_nights, food, price
 ) as a
order by
 vilet, price
;
при наличии индекса по tp (tour_nb, vilet, hotel_cnt, days_nights, food, price)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
                                                      QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
 Sort  (cost= 4 . 71 .. 4 . 71  rows= 1  width= 24 ) (actual time= 0 . 017 .. 0 . 017  rows= 0  loops= 1 )
   Sort Key: a.vilet, a.price
   ->  Unique  (cost= 0 . 00 .. 4 . 69  rows= 1  width= 24 ) (actual time= 0 . 009 .. 0 . 009  rows= 0  loops= 1 )
         ->  Index Scan using tp_1 on tp  (cost= 0 . 00 .. 4 . 67  rows= 2  width= 24 ) (actual time= 0 . 009 .. 0 . 009  rows= 0  loops= 1 )
               Index Cond: ((tour_nb =  16 ) AND (vilet >= '2007-01-26 00:00:00'::timestamp without time zone))
 Total runtime:  0 . 060  ms
( 6  rows)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #34285679
Lirin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в таком случае в explain получается
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
QUERY PLAN
Sort  (cost= 602455 . 83 .. 603085 . 07  rows= 251697  width= 16 ) (actual time= 63184 . 415 .. 63721 . 658  rows= 327707  loops= 1 )
  Sort Key: a.vilet, a.price
  ->  Unique  (cost= 540637 . 85 .. 572099 . 96  rows= 251697  width= 16 ) (actual time= 51014 . 412 .. 60940 . 157  rows= 327707  loops= 1 )
        ->  Sort  (cost= 540637 . 85 .. 546930 . 27  rows= 2516969  width= 16 ) (actual time= 51014 . 408 .. 56074 . 086  rows= 2496225  loops= 1 )
              Sort Key: tp.vilet, tp.hotel_cnt, tp.days_nights, tp.food, tp.price
              ->  Bitmap Heap Scan on tp  (cost= 15453 . 96 .. 140853 . 07  rows= 2516969  width= 16 ) (actual time= 1185 . 116 .. 12490 . 403  rows= 2496225  loops= 1 )
                    Recheck Cond: (tour_nb =  16 )
                    Filter: (vilet >= '2007-01-26'::date)
                    ->  Bitmap Index Scan on tp_tour_nb  (cost= 0 . 00 .. 15453 . 96  rows= 2538274  width= 0 ) (actual time= 1118 . 713 .. 1118 . 713  rows= 2941521  loops= 1 )
                          Index Cond: (tour_nb =  16 )
Total runtime:  64228 . 753  ms
но реально на веб-сервере запрос может выполняться и 100 и 150 секунд, поэтому улучшения практически не заметны...
что еще можно придумать?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #34285793
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lirinчто еще можно придумать?Постарайтесь получить план, который я привел. С помощью команд "set enable_* to off/on". Сначала отключите enable_bitmapscan.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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