powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация представления
10 сообщений из 10, страница 1 из 1
Оптимизация представления
    #38705847
Прошу помощи в оптимизации представления, данной представление с условием формируется 4-6 секунд на 107 строк, долго, можно ли как то оптимизировать?
Код: sql
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.
 SELECT pbf.date, pbf.id_class, pbf.category, pbf.id_uch, pbf.half1, pbf.half2, 
    pbf.fact_half1, pbf.fact_half2, pbf.plan_half1, pbf.plan_half2, 
    pbf.food_view, class.time_to_close, class.date_open_for_food
   FROM ( SELECT COALESCE(t.date, z.date) AS date, 
            COALESCE(t.id_class, z.id_class) AS id_class, 
            COALESCE(t.category, z.category) AS category, 
            COALESCE(t.id_uch, z.id_uch) AS id_uch, 
            COALESCE(t.half1, 0::bigint) AS half1, 
            COALESCE(t.half2, 0::bigint) AS half2, 
            COALESCE(t.fact_half1, 0::bigint) AS fact_half1, 
            COALESCE(t.fact_half2, 0::bigint) AS fact_half2, 
            COALESCE(z.plan_half1, 0::bigint) AS plan_half1, 
            COALESCE(z.plan_half2, 0::bigint) AS plan_half2, 
            COALESCE(z.food_view::smallint, 0::smallint) AS food_view
           FROM ( SELECT COALESCE(b.date, f.date) AS date, 
                    COALESCE(b.id_class, f.id_class) AS id_class, 
                    COALESCE(b.id_uch, f.id_uch) AS id_uch, 
                    COALESCE(b.category, f.category) AS category, 
                    COALESCE(b.half1, 0::bigint) AS half1, 
                    COALESCE(b.half2, 0::bigint) AS half2, 
                    COALESCE(f.fact_half1, 0::bigint) AS fact_half1, 
                    COALESCE(f.fact_half2, 0::bigint) AS fact_half2
                   FROM schemefood.bid_itog_view b
              FULL JOIN schemefood.fact_itog_view f ON b.date = f.date AND b.id_class = f.id_class AND b.category = f.category AND b.id_uch = f.id_uch) t
      FULL JOIN schemefood.plan_itog_view z ON t.date = z.date AND t.id_class = z.id_class AND t.category = z.category) pbf, 
    schemefood.class
...
Рейтинг: 0 / 0
Оптимизация представления
    #38705876
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Человек Дрища,

такие вопросы задавать надо приводя для начала результат

explain analyze запрос;

тогда и подумать можно будет.

PS: FULL JOIN скорее всего мешает... он никогда не был особо быстрым...
...
Рейтинг: 0 / 0
Оптимизация представления
    #38705894
Maxim Boguk, ok ну вот explain analyze:
Код: sql
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.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
"Nested Loop  (cost=83401.49..84436.88 rows=23 width=100) (actual time=5258.782..5286.378 rows=107 loops=1)"
"  ->  Merge Full Join  (cost=83401.49..84436.20 rows=23 width=88) (actual time=5258.747..5286.045 rows=107 loops=1)"
"        Merge Cond: (((COALESCE(schemefood.filing.date, schemefood.filing.date)) = schemefood.filing.date) AND ((COALESCE(schemefood.filing.id_class, schemefood.filing.id_class)) = schemefood.student.id_class) AND ((COALESCE(schemefood.filing.id_category,  (...)"
"        Filter: ((COALESCE((COALESCE(schemefood.filing.date, schemefood.filing.date)), schemefood.filing.date) = '2014-04-04'::date) AND (COALESCE((COALESCE(schemefood.filing.id_uch, schemefood.filing.id_uch)), schemefood.filing.id_uch) = 4))"
"        Rows Removed by Filter: 89493"
"        ->  Sort  (cost=51871.03..51891.68 rows=82611 width=72) (actual time=3559.785..3565.856 rows=85308 loops=1)"
"              Sort Key: (COALESCE(schemefood.filing.date, schemefood.filing.date)), (COALESCE(schemefood.filing.id_class, schemefood.filing.id_class)), (COALESCE(schemefood.filing.id_category, schemefood.filing.fact_id_category))"
"              Sort Method: quicksort  Memory: 15069kB"
"              ->  Merge Full Join  (cost=50989.81..51196.34 rows=82611 width=72) (actual time=3398.309..3515.410 rows=85308 loops=1)"
"                    Merge Cond: ((schemefood.filing.date = schemefood.filing.date) AND (schemefood.filing.id_class = schemefood.filing.id_class) AND (schemefood.filing.id_category = schemefood.filing.fact_id_category) AND (schemefood.filing.id_uch = scheme (...)"
"                    ->  Sort  (cost=25492.51..25513.17 rows=82611 width=32) (actual time=1699.006..1711.142 rows=83788 loops=1)"
"                          Sort Key: schemefood.filing.date, schemefood.filing.id_class, schemefood.filing.id_category, schemefood.filing.id_uch"
"                          Sort Method: quicksort  Memory: 9618kB"
"                          ->  HashAggregate  (cost=24652.61..24735.22 rows=82611 width=20) (actual time=1609.504..1636.985 rows=83788 loops=1)"
"                                ->  Hash Join  (cost=19504.72..23309.78 rows=895220 width=20) (actual time=556.203..1199.716 rows=791312 loops=1)"
"                                      Hash Cond: (schemefood.filing.id_student = schemefood.student.id)"
"                                      ->  Merge Join  (cost=19155.46..20946.27 rows=895220 width=24) (actual time=549.850..876.432 rows=791312 loops=1)"
"                                            Merge Cond: ((schemefood.conformity.id_uch = schemefood.filing.id_uch) AND (schemefood.conformity.id_staff = schemefood.filing.id_category) AND (schemefood.conformity.id_flags = schemefood.filing.id_flag))"
"                                            ->  Sort  (cost=11.35..11.58 rows=905 width=16) (actual time=0.628..0.706 rows=905 loops=1)"
"                                                  Sort Key: schemefood.conformity.id_uch, schemefood.conformity.id_staff, schemefood.conformity.id_flags"
"                                                  Sort Method: quicksort  Memory: 67kB"
"                                                  ->  Seq Scan on conformity  (cost=0.00..6.91 rows=905 width=16) (actual time=0.006..0.192 rows=905 loops=1)"
"                                            ->  Sort  (cost=19144.11..19350.64 rows=826110 width=24) (actual time=548.724..646.535 rows=825163 loops=1)"
"                                                  Sort Key: schemefood.filing.id_uch, schemefood.filing.id_category, schemefood.filing.id_flag"
"                                                  Sort Method: quicksort  Memory: 89106kB"
"                                                  ->  Seq Scan on filing  (cost=0.00..11025.11 rows=826110 width=24) (actual time=0.005..215.857 rows=825975 loops=1)"
"                                      ->  Hash  (cost=329.12..329.12 rows=16118 width=4) (actual time=6.336..6.336 rows=16118 loops=1)"
"                                            Buckets: 2048  Batches: 1  Memory Usage: 567kB"
"                                            ->  Seq Scan on student  (cost=0.00..329.12 rows=16118 width=4) (actual time=0.016..3.209 rows=16118 loops=1)"
"                    ->  Sort  (cost=25497.30..25517.95 rows=82611 width=32) (actual time=1699.291..1711.756 rows=82429 loops=1)"
"                          Sort Key: schemefood.filing.date, schemefood.filing.id_class, schemefood.filing.fact_id_category, schemefood.filing.id_uch"
"                          Sort Method: quicksort  Memory: 9512kB"
"                          ->  HashAggregate  (cost=24657.39..24740.00 rows=82611 width=20) (actual time=1612.152..1638.641 rows=82429 loops=1)"
"                                ->  Hash Join  (cost=19504.72..23313.31 rows=896052 width=20) (actual time=550.553..1204.203 rows=791641 loops=1)"
"                                      Hash Cond: (schemefood.filing.id_student = schemefood.student.id)"
"                                      ->  Merge Join  (cost=19155.46..20947.93 rows=896052 width=24) (actual time=544.843..871.164 rows=791641 loops=1)"
"                                            Merge Cond: ((schemefood.conformity.id_uch = schemefood.filing.id_uch) AND (schemefood.conformity.id_staff = schemefood.filing.fact_id_category) AND (schemefood.conformity.id_flags = schemefood.filing.fact_id_fla (...)"
"                                            ->  Sort  (cost=11.35..11.58 rows=905 width=16) (actual time=0.636..0.720 rows=905 loops=1)"
"                                                  Sort Key: schemefood.conformity.id_uch, schemefood.conformity.id_staff, schemefood.conformity.id_flags"
"                                                  Sort Method: quicksort  Memory: 67kB"
"                                                  ->  Seq Scan on conformity  (cost=0.00..6.91 rows=905 width=16) (actual time=0.006..0.182 rows=905 loops=1)"
"                                            ->  Sort  (cost=19144.11..19350.64 rows=826110 width=24) (actual time=543.695..640.375 rows=825168 loops=1)"
"                                                  Sort Key: schemefood.filing.id_uch, schemefood.filing.fact_id_category, schemefood.filing.fact_id_flag"
"                                                  Sort Method: quicksort  Memory: 89106kB"
"                                                  ->  Seq Scan on filing  (cost=0.00..11025.11 rows=826110 width=24) (actual time=0.005..214.242 rows=825975 loops=1)"
"                                      ->  Hash  (cost=329.12..329.12 rows=16118 width=4) (actual time=5.691..5.691 rows=16118 loops=1)"
"                                            Buckets: 2048  Batches: 1  Memory Usage: 567kB"
"                                            ->  Seq Scan on student  (cost=0.00..329.12 rows=16118 width=4) (actual time=0.012..3.023 rows=16118 loops=1)"
"        ->  Sort  (cost=31530.46..31764.86 rows=937578 width=40) (actual time=1651.691..1662.910 rows=85674 loops=1)"
"              Sort Key: schemefood.filing.date, schemefood.student.id_class, schemefood.filing.plan_id_category"
"              Sort Method: quicksort  Memory: 9766kB"
"              ->  HashAggregate  (cost=20355.20..21292.78 rows=937578 width=22) (actual time=1549.690..1583.993 rows=85674 loops=1)"
"                    ->  Hash Join  (cost=14472.29..18714.44 rows=937578 width=22) (actual time=851.674..1115.699 rows=824943 loops=1)"
"                          Hash Cond: ((schemefood.conformity.id_uch = schemefood.filing.id_uch) AND (schemefood.conformity.id_staff = schemefood.filing.fact_id_category))"
"                          ->  Seq Scan on conformity  (cost=0.00..7.13 rows=79 width=12) (actual time=0.015..0.248 rows=79 loops=1)"
"                                Filter: (id_flags = 1)"
"                                Rows Removed by Filter: 826"
"                          ->  Hash  (cost=13233.12..13233.12 rows=826110 width=22) (actual time=851.533..851.533 rows=825975 loops=1)"
"                                Buckets: 131072  Batches: 1  Memory Usage: 45171kB"
"                                ->  Hash Join  (cost=349.27..13233.12 rows=826110 width=22) (actual time=5.987..634.229 rows=825975 loops=1)"
"                                      Hash Cond: (schemefood.filing.id_student = schemefood.student.id)"
"                                      ->  Seq Scan on filing  (cost=0.00..11025.11 rows=826110 width=22) (actual time=0.006..239.227 rows=825975 loops=1)"
"                                      ->  Hash  (cost=329.12..329.12 rows=16118 width=8) (actual time=5.972..5.972 rows=16118 loops=1)"
"                                            Buckets: 2048  Batches: 1  Memory Usage: 630kB"
"                                            ->  Seq Scan on student  (cost=0.00..329.12 rows=16118 width=8) (actual time=0.005..3.210 rows=16118 loops=1)"
"  ->  Index Scan using "CLASS_ID" on class  (cost=0.00..0.03 rows=1 width=16) (actual time=0.002..0.002 rows=1 loops=107)"
"        Index Cond: (id = COALESCE((COALESCE(schemefood.filing.id_class, schemefood.filing.id_class)), schemefood.student.id_class))"
"Total runtime: 5288.217 ms"
...
Рейтинг: 0 / 0
Оптимизация представления
    #38705897
Я и рад бы без Full Join обойтись, да не могу, когда джойнятся две таблицы, я не могу знать в какой из них может быть запись которой по условию нет в другой, по этому и использую фулл.
...
Рейтинг: 0 / 0
Оптимизация представления
    #38705988
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Человек Дрища,

мнда....
а как у вас эти самые schemefood.bid_itog_view и т.д. определены?
...
Рейтинг: 0 / 0
Оптимизация представления
    #38705992
Как представления, они вычисляют колонки, на основе заполненных таблиц учреждениями.
...
Рейтинг: 0 / 0
Оптимизация представления
    #38705993
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Человек ДрищаЯ и рад бы без Full Join обойтись, да не могу, когда джойнятся две таблицы, я не могу знать в какой из них может быть запись которой по условию нет в другой, по этому и использую фулл.

вы теряете время не на фулл-джойне, а на предварительной агрегации всего и вся, что потом, во время фулл-джойна, ремуваите


засуньте условия фильтра в отбор до аггрегирований (вместо вьюх используйте table-returned ф-ии с параметрами) -- должно полегчать.
...
Рейтинг: 0 / 0
Оптимизация представления
    #38706020
qwwqвы теряете время не на фулл-джойне, а на предварительной агрегации всего и вся, что потом, во время фулл-джойна, ремуваите


засуньте условия фильтра в отбор до аггрегирований (вместо вьюх используйте table-returned ф-ии с параметрами) -- должно полегчать.

я согласен что если засунуть фильтр в отбор до агрегирований полегчает, но к себе применить не знаю как, дело в том что пользователи работающие через программу, для них условия отбора разные.
Та вьюха что я привел в первом посте собирается из други небольших 3 представлений, по сути я должен буду выставлять фильтр в этих трёх вьюхах, не знаю как то пугающе представляю код в программе, потому как выход вижу один, выписать все представления в один единый запрос, расставив в них условия фильтра и сжойнить уже выбраные на подобие первого поста.
...
Рейтинг: 0 / 0
Оптимизация представления
    #38706189
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Человек Дрища <> как то пугающе представляю код в программе , потому как выход вижу один, выписать все представления в один единый запрос, расставив в них условия фильтра и сжойнить уже выбраные на подобие первого поста.

человек, дрища залезьте на сервер, напишите там всё то, что вас так пугает представить "в коде программы", в виде функции, RETURNS TABLE [, language sql на первый раз]

и "в коде программы" у вас будет кратенький вызов ф-ии с параметрами. Точка.
...
Рейтинг: 0 / 0
Оптимизация представления
    #38706223
Asdtrjvtdr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Прочитал Ваше предложение и у меня к Вам ответное предложение=) Не так давно в сети интернет появился новый интернет-портал, который на данный момент наполняется контентом. На портале можно онлайн проконсультироваться по разным вопросам (ИТ, юриспруденция, бизнес прочее), выставлять задания и проекты для выполнения, а также продавать или покупать продукты интеллектуального труда в магазине (дипломы, рефераты, программы прочее). В связи с тем, что ресурс находится на стадии наполнения контентом, я хотела бы предложить Вам разместить вышеуказанное объявление у нас на сайте. Это Вам ровным счетом стоить не будет. Если Вам интересно, то объявление будет размещено здесь http://www.outwork.net.ua/ Жду Вашего ответа!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация представления
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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