powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Последствия создания индекса
14 сообщений из 14, страница 1 из 1
Последствия создания индекса
    #39809504
rinace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый,

возникла интересная ситуация .
Есть запрос который нужно попытаться соптимизировать :
Код: 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.
SELECT 
    als.alsessionid,
    e.equipmentid,
    e.equipmentname,
    s.strategyid,
    s.strategyuuid,
    s.strategyname,
    i.indicatorname,
    als.minpopulationsize,
    count(*) as populationsize
FROM 
	ALFDCCONTEXT alf 
	INNER JOIN vw_al_last_session vw ON alf.ALSESSIONID = vw.alsessionid
	INNER JOIN ALSTRATEGY als ON ( alf.alsessionid = als.alsessionid AND alf.strategyid = als.strategyid )
	INNER JOIN STRATEGY s ON ( s.strategyid = als.strategyid AND alf.strategyid = s.strategyid )
	INNER JOIN EQUIPMENT e ON e.equipmentid = s.equipmentid
	INNER JOIN TREATEDDATA t ON alf.fdccontextid = t.fdccontextid
	INNER JOIN INDICATOR i ON i.indicatorid = t.indicatorid     
WHERE 
     e.groupname <> 'SAMPLE GROUP'
     AND alf.baddcqv = 0
	 AND e.equipmentname = 'EV14'
GROUP BY als.alsessionid,
     e.equipmentid,
     e.equipmentname,
     s.strategyname,
     s.strategyid,
     s.strategyuuid,
     i.indicatorname,
     als.minpopulationsize;

План выполнения ,
Код: plaintext
1.
2.
3.
4.
HashAggregate  (cost=1770.40..1948.24 rows=17784 width=104) (actual time=910974.227..910974.380 rows=41 loops=1)
...
 Planning time: 10.782 ms
 Execution time: 910982.066 ms
имеет примечательную деталь :
Код: plaintext
1.
2.
 ->  Seq Scan on equipment e  (cost=0.00..3.84 rows=1 width=10) (actual time=0.019..0.026 rows=1  loops=24913020 )
                 Filter: (((groupname)::text <> 'SAMPLE GROUP'::text) AND ((equipmentname)::text = 'EV14'::text))
                 Rows Removed by Filter: 99

Вопрос 1 - почему loops=24913020 ?
Старая статистика ?

Далее.
Таблица equipment на момент решения всего 100 строк. Вроде бы логично - индекс в данном случае может помочь.
После создания индекса план запроса кардинально изменился и задача , казалось бы была решена :
Код: plaintext
1.
2.
3.
4.
GroupAggregate  (cost=1981953.87..1982702.11 rows=27209 width=104) (actual time=18411.587..18712.775 rows=41 loops=1)
...
 Planning time: 5.948 ms
 Execution time: 18716.234 ms

Однако , план выполнения по прежднему содержит Seq Scan по таблице equipment :
Код: plaintext
1.
2.
3.
->  Seq Scan on equipment e  (cost=0.00..3.50 rows=1 width=10) (actual time=0.029..0.033 rows=1  loops=1 )
      Filter: (((groupname)::text <> 'SAMPLE GROUP'::text) AND ((equipmentname)::text = 'EV14'::text))
      Rows Removed by Filter: 99

Однако сейчас loops=1

Есть какие-либо предположения по вопросам :
1) Почему в первом случае loops=24913020
2) Как построение индекса по маленькой таблице так кардинально изменило план выполнения ?
3) Нет ли проблем с analyze ? Как в этом можно убедится ?
...
Рейтинг: 0 / 0
Последствия создания индекса
    #39809529
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rinace,

Вы словно специально скрыли ту информацию о плане которая может помочь решить ваш вопрос ).
...
Рейтинг: 0 / 0
Последствия создания индекса
    #39809618
rinace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

Да нет, не специально, прсто планы все таки не меленькие.
Итак, вот первый план(без индекса)
Код: 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.
                                                                                                  QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=1770.40..1948.24 rows=17784 width=104) (actual time=910974.227..910974.380 rows=41 loops=1)
   Group Key: als.alsessionid, e.equipmentid, s.strategyid, i.indicatorname, als.minpopulationsize
   ->  Merge Join  (cost=1426.02..1503.64 rows=17784 width=96) (actual time=728712.053..910482.102 rows=205378 loops=1)
         Merge Cond: ((alf.alsessionid = als_1.alsessionid) AND (alf.strategyid = als.strategyid))
         ->  Gather Merge  (cost=1001.87..573881167.61 rows=8434285 width=99) (actual time=4945.347..908464.962 rows=2161867 loops=1)
               Workers Planned: 2
               Workers Launched: 2
               ->  Nested Loop  (cost=1.84..572906641.82 rows=3514285 width=99) (actual time=4934.938..305973.890 rows=720663 loops=3)
                     ->  Nested Loop  (cost=1.42..559477268.49 rows=3514285 width=83) (actual time=4934.918..300655.753 rows=720663 loops=3)
                           ->  Nested Loop  (cost=0.85..222267829.45 rows=113232 width=85) (actual time=4934.067..297230.771 rows=138346 loops=3)
                                 Join Filter: (s.equipmentid = e.equipmentid)
                                 Rows Removed by Join Filter: 8165994
                                 ->  Nested Loop  (cost=0.85..168542529.06 rows=13927492 width=79) (actual time=0.024..66592.774 rows=8304340 loops=3)
                                       ->  Parallel Index Scan using alfdccontext_pkey on alfdccontext alf  (cost=0.56..92555529.14 rows=13927492 width=20) (actual time=0.009..7947.137 rows=8304340 loops=3)
                                             Filter: (baddcqv = '0'::numeric)
                                             Rows Removed by Filter: 73644
                                       ->  Index Scan using strategy_idx3 on strategy s  (cost=0.29..5.46 rows=1 width=59) (actual time=0.005..0.005 rows=1 loops=24913020)
                                             Index Cond: (strategyid = alf.strategyid)
                                 ->  Seq Scan on equipment e  (cost=0.00..3.84 rows=1 width=10) (actual time=0.019..0.026 rows=1 loops=24913020)
                                       Filter: (((groupname)::text <> 'SAMPLE GROUP'::text) AND ((equipmentname)::text = 'EV14'::text))
                                       Rows Removed by Filter: 99
                           ->  Index Only Scan using treateddata_pkey on treateddata t  (cost=0.57..2957.09 rows=2095 width=14) (actual time=0.014..0.018 rows=5 loops=415038)
                                 Index Cond: (fdccontextid = alf.fdccontextid)
                                 Heap Fetches: 723597
                     ->  Index Only Scan using indicator_idx4 on indicator i  (cost=0.42..3.82 rows=1 width=28) (actual time=0.005..0.005 rows=1 loops=2161989)
                           Index Cond: (indicatorid = t.indicatorid)
                           Heap Fetches: 177505
         ->  Sort  (cost=419.19..419.37 rows=72 width=20) (actual time=19.454..139.686 rows=206862 loops=1)
               Sort Key: als_1.alsessionid, als.strategyid
               Sort Method: quicksort  Memory: 165kB
               ->  Nested Loop  (cost=39.40..416.96 rows=72 width=20) (actual time=1.566..3.585 rows=1491 loops=1)
                     ->  Seq Scan on alsession als_1  (cost=0.00..135.30 rows=1 width=5) (actual time=1.330..1.331 rows=1 loops=1)
                           Filter: ((stopdate IS NOT NULL) AND ((aborted)::numeric = '0'::numeric) AND ((manual)::numeric = '0'::numeric) AND (stopdate = (SubPlan 2)))
                           Rows Removed by Filter: 142
                           SubPlan 2
                             ->  Result  (cost=0.48..0.49 rows=1 width=8) (actual time=0.009..0.009 rows=1 loops=121)
                                   InitPlan 1 (returns $2)
                                     ->  Limit  (cost=0.15..0.48 rows=1 width=8) (actual time=0.006..0.007 rows=1 loops=121)
                                           ->  Index Scan Backward using alsession_idx2 on alsession als2  (cost=0.15..21.44 rows=64 width=8) (actual time=0.005..0.006 rows=1 loops=121)
                                                 Index Cond: (stopdate IS NOT NULL)
                                                 Filter: ((aborted = als_1.aborted) AND (manual = als_1.manual))
                     ->  Bitmap Heap Scan on alstrategy als  (cost=39.40..267.33 rows=1434 width=15) (actual time=0.232..0.954 rows=1491 loops=1)
                           Recheck Cond: (alsessionid = als_1.alsessionid)
                           Heap Blocks: exact=25
                           ->  Bitmap Index Scan on alstrategy_idx3  (cost=0.00..39.04 rows=1434 width=0) (actual time=0.220..0.220 rows=1491 loops=1)
                                 Index Cond: (alsessionid = als_1.alsessionid)
 Planning time: 10.782 ms
 Execution time: 910982.066 ms

Вот план , после создения индекса по таблице equipment
Код: 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.
56.
57.
58.
59.
																										  QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 GroupAggregate  (cost=1981953.87..1982702.11 rows=27209 width=104) (actual time=18411.587..18712.775 rows=41 loops=1)
   Group Key: als.alsessionid, e.equipmentid, s.strategyid, i.indicatorname, als.minpopulationsize
   ->  Sort  (cost=1981953.87..1982021.89 rows=27209 width=96) (actual time=18410.567..18600.796 rows=205378 loops=1)
         Sort Key: als.alsessionid, e.equipmentid, s.strategyid, i.indicatorname, als.minpopulationsize
         Sort Method: external merge  Disk: 21664kB
         ->  Hash Join  (cost=7623.48..1979949.68 rows=27209 width=96) (actual time=3890.582..17911.858 rows=205378 loops=1)
               Hash Cond: (t.indicatorid = i.indicatorid)
               ->  Nested Loop  (cost=427.31..1970890.08 rows=27209 width=80) (actual time=9.312..17435.390 rows=205378 loops=1)
                     ->  Nested Loop  (cost=426.74..7260.88 rows=660 width=82) (actual time=7.331..96.614 rows=38374 loops=1)
                           Join Filter: (als_1.alsessionid = alf.alsessionid)
                           ->  Hash Join  (cost=337.21..715.05 rows=1 width=85) (actual time=5.435..14.571 rows=15 loops=1)
                                 Hash Cond: (als.strategyid = s.strategyid)
                                 ->  Nested Loop  (cost=39.40..416.96 rows=72 width=20) (actual time=4.647..13.747 rows=1491 loops=1)
                                       ->  Seq Scan on alsession als_1  (cost=0.00..135.30 rows=1 width=5) (actual time=0.712..0.714 rows=1 loops=1)
                                             Filter: ((stopdate IS NOT NULL) AND ((aborted)::numeric = '0'::numeric) AND ((manual)::numeric = '0'::numeric) AND (stopdat
e = (SubPlan 2)))
                                             Rows Removed by Filter: 142
                                             SubPlan 2
                                               ->  Result  (cost=0.48..0.49 rows=1 width=8) (actual time=0.005..0.005 rows=1 loops=121)
                                                     InitPlan 1 (returns $2)
                                                       ->  Limit  (cost=0.15..0.48 rows=1 width=8) (actual time=0.003..0.004 rows=1 loops=121)
                                                             ->  Index Scan Backward using alsession_idx2 on alsession als2  (cost=0.15..21.44 rows=64 width=8) (actual
time=0.003..0.003 rows=1 loops=121)
                                                                   Index Cond: (stopdate IS NOT NULL)
                                                                   Filter: ((aborted = als_1.aborted) AND (manual = als_1.manual))
                                       ->  Bitmap Heap Scan on alstrategy als  (cost=39.40..267.33 rows=1434 width=15) (actual time=3.930..12.229 rows=1491 loops=1)
                                             Recheck Cond: (alsessionid = als_1.alsessionid)
                                             Heap Blocks: exact=25
                                             ->  Bitmap Index Scan on alstrategy_idx3  (cost=0.00..39.04 rows=1434 width=0) (actual time=3.481..3.482 rows=1491 loops=1)
                                                   Index Cond: (alsessionid = als_1.alsessionid)
                                 ->  Hash  (cost=296.67..296.67 rows=91 width=65) (actual time=0.282..0.282 rows=52 loops=1)
                                       Buckets: 1024  Batches: 1  Memory Usage: 13kB
                                       ->  Nested Loop  (cost=12.99..296.67 rows=91 width=65) (actual time=0.082..0.202 rows=52 loops=1)
                                             ->  Seq Scan on equipment e  (cost=0.00..3.50 rows=1 width=10) (actual time=0.029..0.033 rows=1 loops=1)
                                                   Filter: (((groupname)::text <> 'SAMPLE GROUP'::text) AND ((equipmentname)::text = 'EV14'::text))
                                                   Rows Removed by Filter: 99
                                             ->  Bitmap Heap Scan on strategy s  (cost=12.99..292.26 rows=91 width=59) (actual time=0.047..0.122 rows=52 loops=1)
                                                   Recheck Cond: (equipmentid = e.equipmentid)
                                                   Heap Blocks: exact=42
                                                   ->  Bitmap Index Scan on strategy_idx4  (cost=0.00..12.97 rows=91 width=0) (actual time=0.033..0.033 rows=52 loops=1)
                                                         Index Cond: (equipmentid = e.equipmentid)
                           ->  Bitmap Heap Scan on alfdccontext alf  (cost=89.53..6514.39 rows=2515 width=20) (actual time=0.631..3.116 rows=2558 loops=15)
                                 Recheck Cond: ((alsessionid = als.alsessionid) AND (strategyid = als.strategyid))
                                 Filter: (baddcqv = '0'::numeric)
                                 Rows Removed by Filter: 0
                                 Heap Blocks: exact=355
                                 ->  Bitmap Index Scan on alfdccontext_pkey  (cost=0.00..88.90 rows=2536 width=0) (actual time=0.485..0.485 rows=2559 loops=15)
                                       Index Cond: ((alsessionid = als.alsessionid) AND (strategyid = als.strategyid))
                     ->  Index Only Scan using treateddata_pkey on treateddata t  (cost=0.57..2954.25 rows=2095 width=14) (actual time=0.419..0.447 rows=5 loops=38374)
                           Index Cond: (fdccontextid = alf.fdccontextid)
                           Heap Fetches: 205378
               ->  Hash  (cost=4085.52..4085.52 rows=160852 width=28) (actual time=175.046..175.047 rows=160650 loops=1)
                     Buckets: 65536  Batches: 4  Memory Usage: 2960kB
                     ->  Seq Scan on indicator i  (cost=0.00..4085.52 rows=160852 width=28) (actual time=0.488..99.006 rows=160650 loops=1)
 Planning time: 5.948 ms
 Execution time: 18716.234 ms

Мое предположение - статистика по таблице strategy была пересобрана autoanalyze.
Но подтвердить или опровергнуть эту гипотезу не имея истории autoanalyze пока нет возможности
Хотя на будущее, этот вопрос будет решен и история сбора статистики и изменения таблиц будет собираться.
...
Рейтинг: 0 / 0
Последствия создания индекса
    #39809622
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rinace,

Для проверки вашей гипотезы - я бы попробовал опять удалить индекс и посмотреть какой план получается.
И дальше думать исходя из результатов.
...
Рейтинг: 0 / 0
Последствия создания индекса
    #39809643
rinace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

тут могут быть проблемы

продакшн
если производительность не измениться гипотеза будет проверена
если производительность ухудшится - будет нехорошо со стороны заказчика

А тестовая база, довольно сильно отличается от продакшн, так,что планы там совсем разные
...
Рейтинг: 0 / 0
Последствия создания индекса
    #39809650
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rinaceMaxim Boguk,

тут могут быть проблемы

продакшн
если производительность не измениться гипотеза будет проверена
если производительность ухудшится - будет нехорошо со стороны заказчика

А тестовая база, довольно сильно отличается от продакшн, так,что планы там совсем разные

Индекс на таблицу в 100 строк восстанавливается назад за пару секунд.
Без экспериментов на той конкретной базе где наблюдаются проблемы с планом запроса (или на ее очень близкой копии по данным и оборудованию) - обычно проблему решить не получается.


1) Почему в первом случае loops=24913020
В первом случае у вас nestedloop план а во втором hash join (а они совсем по разному делаются отсюда и разница в loops).
Вообще план в первом случае выглядит странным на мой взгляд.

А что показывает explain analyze для упрощенного запроса вида
SELECT
*
FROM
ALFDCCONTEXT alf
INNER JOIN STRATEGY s ON alf.strategyid = s.strategyid
INNER JOIN EQUIPMENT e ON e.equipmentid = s.equipmentid
WHERE
e.groupname <> 'SAMPLE GROUP'
AND alf.baddcqv = 0
AND e.equipmentname = 'EV14';

?
ps: меня слегка смущает наличие одновременно s.strategyid = als.strategyid И alf.strategyid = s.strategyid в одном условии join в вашем запросе


2) Как построение индекса по маленькой таблице так кардинально изменило план выполнения ?

При отсутствии бага (что неисключено) в планировщике - план неиспользующий индекс не должен менятся от наличия или отсутствия этого индекса (лет 7 назад был милый баг когда это было не так но с тех пор я ничего похожего не встречал).


3) Нет ли проблем с analyze ? Как в этом можно убедится ?
Не видно очевидных ошибок в ожидаемом количестве строк. Значить все более менее ок с статистикой.
Но: вообще таблицы с 1-100 строк любят пропускаться или редко обрабатываться autoanalyze потому что есть такая штука как autovacuum_analyze_threshold который 50 строк по умолчанию (что для маленьких таблиц - легко может быть больше половины).
Иногда полезно перед тем как делать индексы - сделать ручной analyze всем участвующим таблицам.
И в общем если у вас много мелких таблиц и сложные запосы я бо порекомендовал бы уменьшить его до 10 или даже до 2-3.

ps: я бы еще можен на счет join_collapse_limit/from_collapse_limit бы подумал... таблиц у вас много в запросе может не хватать для получения стабильных планов (geqo оптимизатор дело такое... вероятностное в лучшем случае). Какие у вас настройки на этот счет.

pps: 'Но подтвердить или опровергнуть эту гипотезу не имея истории autoanalyze пока нет возможности' - в pg_stat_user_tables есть колонки
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 last_vacuum         | timestamp with time zone |           |          |         | plain   | 
 last_autovacuum     | timestamp with time zone |           |          |         | plain   | 
 last_analyze        | timestamp with time zone |           |          |         | plain   | 
 last_autoanalyze    | timestamp with time zone |           |          |         | plain   | 
 vacuum_count        | bigint                   |           |          |         | plain   | 
 autovacuum_count    | bigint                   |           |          |         | plain   | 
 analyze_count       | bigint                   |           |          |         | plain   | 
 autoanalyze_count   | bigint                   |           |          |         | plain   | 
которые иногда могут помочь с этим вопросом.
...
Рейтинг: 0 / 0
Последствия создания индекса
    #39809688
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rinace,

А покажите вывод:
Код: plaintext
1.
2.
3.
\d equipment
\dt+ equipment
\di+ <созданный индекс> [code=plaintext]
                    
...
Рейтинг: 0 / 0
Последствия создания индекса
    #39810007
rinace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim BogukИндекс на таблицу в 100 строк восстанавливается назад за пару секунд.
Без экспериментов на той конкретной базе где наблюдаются проблемы с планом запроса (или на ее очень близкой копии по данным и оборудованию) - обычно проблему решить не получается
Технически то конечно, проблем никаких.
Но все эти действия нужно документально оформлять.
И при этом объяснить заказчику необходимость экспериментов на продакшн базе в условиях когда и так все работает хорошо.

Но общая идея , понятна.
Спасибо за наводки, соберу остальную информацию поделюсь.
Общая идея понятна, согласен, есть подозрения на более тонкую настройку autoanalyze

Пока, что можно получить сразу
vyegorov
Код: plaintext
1.
2.
\d equipment
\dt+ equipment
\di+ <созданный индекс>


Код: 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.
 \d equipment
                    Table "fdc.equipment"
       Column       |            Type             | Modifiers
--------------------+-----------------------------+-----------
 equipmentid        | integer                     | not null
 equipmentname      | character varying(32)       |
 groupname          | character varying(32)       |
 adaptername        | character varying(32)       |
 partitionsize      | integer                     |
 variablesupdatets  | timestamp without time zone |
 retention_default  | character varying(128)      |
 retention_temporal | character varying(128)      |
 fab_fsr_key        | numeric(10,0)               |
 fab_loc_key        | integer                     |
Indexes:
    "equipment_pk" PRIMARY KEY, btree (equipmentid)
    "equipment_groupname_equipmentname_idx" btree (groupname, equipmentname)
    "equipment_idx1" btree (equipmentname, groupname, fab_fsr_key)
    "equipment_idx2" btree (equipmentid)



 \dt+ equipment
                    List of relations
 Schema |   Name    | Type  | Owner | Size  | Description
--------+-----------+-------+-------+-------+-------------
 fdc    | equipment | table | fdc   | 56 kB |


 \di+ "equipment_groupname_equipmentname_idx"
                                        List of relations
 Schema |                 Name                  | Type  | Owner |   Table   | Size  | Description
--------+---------------------------------------+-------+-------+-----------+-------+-------------
 fdc    | equipment_groupname_equipmentname_idx | index | fdc   | equipment | 16 kB |
(1 row)
...
Рейтинг: 0 / 0
Последствия создания индекса
    #39810013
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rinace "equipment_groupname_equipmentname_idx" btree (groupname, equipmentname)


Этот индекс НЕ МОЖЕТ эффективно использоваться в вашем запросе при всем желании базы )).
Вот индекс с обратым порядком полей (equipmentname, groupname) потенциально может но смысла в этом очень мало (там hash join очевидно лучше подходит).
...
Рейтинг: 0 / 0
Последствия создания индекса
    #39810069
rinace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ценную информацию.

Maxim Bogukrinace "equipment_groupname_equipmentname_idx" btree (groupname, equipmentname)


Этот индекс НЕ МОЖЕТ эффективно использоваться в вашем запросе при всем желании базы )).
Вот индекс с обратым порядком полей (equipmentname, groupname) потенциально может но смысла в этом очень мало (там hash join очевидно лучше подходит).
А можно попросить уточнить , почему именно с обратным порядком правильнее ?

Я ориентировался вот на эту строку из плана
Код: plaintext
Filter: (((groupname)::text <> 'SAMPLE GROUP'::text) AND ((equipmentname)::text = 'EV14'::text))
...
Рейтинг: 0 / 0
Последствия создания индекса
    #39810104
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rinace,

1. вообще-то присмотритесь к vw_al_last_session , если это не матвью то его (если я правильно догадываюсь о назначении) можно написать оптимизированным либо под 1--несколько записей, (обычно с лейтерал + лимит 1, вдоль индекса), либо под массовый запрос (вероятно без лейтерала -- в зависимости от плотности сессий).

2. и, вероятно, если все равно хешджойнитесь, то лучше все остальные таблички соединять с результатами группировки
Код: sql
1.
2.
ALFDCCONTEXT alf 
INNER JOIN vw_al_last_session vw ON alf.ALSESSIONID = vw.alsessionid


снаружи , а не до .

с учетом 1. для 2 вероятно можно написать отдельную "вьюху" оптимизированную под массовую свертку по всем последним сессиям.
...
Рейтинг: 0 / 0
Последствия создания индекса
    #39810183
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rinaceСпасибо за ценную информацию.

Maxim Bogukпропущено...


Этот индекс НЕ МОЖЕТ эффективно использоваться в вашем запросе при всем желании базы )).
Вот индекс с обратым порядком полей (equipmentname, groupname) потенциально может но смысла в этом очень мало (там hash join очевидно лучше подходит).
А можно попросить уточнить , почему именно с обратным порядком правильнее ?

Я ориентировался вот на эту строку из плана
Код: plaintext
Filter: (((groupname)::text <> 'SAMPLE GROUP'::text) AND ((equipmentname)::text = 'EV14'::text))


Потому что индекс умеет хорошо искать по '=', хуже по '>'/'<'и совсем не умеет искать по '<>'
потому например для условия where a=10 and b>5 надо индекс по (a,b) а любой другой вариант ((b,a) или (a), (b)) - будет сильно менее оптимальным.
Совсем на пальцах - индекс это АЛФАВИТНЫЙ указатель... и те вещи которые вы с помощью алфавитного указателя можете быстро сделать - он быстро сделат а которые не можете и btree индекс не сделает.
Из этого например следует что простой btree индекс не сможет нормально обслуживать запросы вида where a<10 and b>10 (хотя есть методы это обойти).
...
Рейтинг: 0 / 0
Последствия создания индекса
    #39810607
rinace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim BogukПотому что индекс умеет хорошо искать по '=', хуже по '>'/'<'и совсем не умеет искать по '<>'
Спасибо. Вообще , вылетело из головы. Элементарно , же.
Еще раз спасибо за ценные советы !
...
Рейтинг: 0 / 0
Последствия создания индекса
    #39810608
rinace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqвообще-то присмотритесь к vw_al_last_session , если это не матвью то его
Нет, не матвью, обычное представление.

Спасибо за советы.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Последствия создания индекса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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