powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему не используется индекс ?
8 сообщений из 8, страница 1 из 1
Почему не используется индекс ?
    #39704318
rinace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кратко.
Имеется запрос :
SELECT
p."PARAMETER_ID" as parameter_id,
pc."PC_NAME" AS pc_name,
pc."CUSTOMER_PARTNUMBER" AS customer_partnumber,
w."LASERMARK" AS lasermark,
w."LOTID" AS lotid,
w."REPORTED_VALUE" AS reported_value,
w."LOWER_SPEC_LIMIT" AS lower_spec_limit,
w."UPPER_SPEC_LIMIT" AS upper_spec_limit,
p."TYPE_CALCUL" AS type_calcul,
s."SHIPMENT_NAME" AS shipment_name,
s."SHIPMENT_DATE" AS shipment_date,
extract(year from "SHIPMENT_DATE") AS year,
extract(month from "SHIPMENT_DATE") as month,
s."REPORT_NAME" AS report_name,
p."SOITECPARAM_NAME" AS soitecparam_name,
p."CUSTOMERPARAM_NAME" AS customerparam_name
FROM wafer_data w,
shipment s,
parameters p,
shipment_pc sp,
pc pc
WHERE s."SHIPMENT_ID" = w."SHIPMENT_ID"
AND p."PARAMETER_ID" = w."PARAMETER_ID"
AND s."SHIPMENT_ID" = sp."SHIPMENT_ID"
AND pc."PC_ID" = sp."PC_ID"
AND s."SHIPMENT_DATE" >= '2018-07-01' AND s."SHIPMENT_DATE" <= '2018-09-30'
and s."SHIPMENT_DATE" = (SELECT MAX(s2."SHIPMENT_DATE")
FROM shipment s2,
wafer_data w2
WHERE s2."SHIPMENT_ID" = w2."SHIPMENT_ID"
AND w2."LASERMARK" = w."LASERMARK");
Кусок плана выполнения :
-> Nested Loop (cost=958.90..490361411.99 rows=3419 width=104) (actual time=32.075..6304027.497 rows=8367589 loops=1)
-> Hash Join (cost=958.49..490353428.41 rows=3419 width=76) (actual time=32.056..6232786.924 rows=8367589 loops=1)
Hash Cond: ((w."SHIPMENT_ID" = s."SHIPMENT_ID") AND ((SubPlan 1) = s."SHIPMENT_DATE"))
-> Seq Scan on wafer_data w (cost=0.00..578873.97 rows=27097897 width=46) (actual time=0.007..8999.658 rows=27083570 loops=1)

Вопрос : почему используется "Seq Scan on wafer_data w " вместо индекса ?

Хотя индекс по полю SHIPMENT_ID создан :
EDATA=> \d+ wafer_data
Indexes:
"waferdata_idx1" btree ("SHIPMENT_ID", "PARAMETER_ID")
"waferdata_idx2" btree ("LASERMARK")
"waferdata_idx3" btree ("SHIPMENT_ID")
...
Рейтинг: 0 / 0
Почему не используется индекс ?
    #39704347
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rinace,

1. Читать код в такой каше очень неудобно, вы уж в следующий раз хоть немного его форматируйте
2. SeqScan возвращает 27М записей, после джойна остаётся 8М. Тут индексы по shipment_id не поможет
3. А приведите весь план?.. Ибо гадать что у вас там получается нет желания
...
Рейтинг: 0 / 0
Почему не используется индекс ?
    #39704366
rinace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov, спасибо за ответ.

Вот весь план :

QUERY PLAN
-------------------------------------------------------------------------------------------------------------- Nested Loop (cost=959.18..490375243.35 rows=3424 width=135) (actual time=32.805..6982828.864 rows=8367589 loops=1)
Join Filter: (sp."PC_ID" = pc."PC_ID")
Rows Removed by Join Filter: 1313711473
-> Nested Loop (cost=959.18..490365381.38 rows=3424 width=100) (actual time=32.134..6338543.249 rows=8367589 loops=1)
Join Filter: (s."SHIPMENT_ID" = sp."SHIPMENT_ID")
-> Nested Loop (cost=958.90..490361411.99 rows=3419 width=104) (actual time=32.075..6304027.497 rows=8367589 loops=1)
-> Hash Join (cost=958.49..490353428.41 rows=3419 width=76) (actual time=32.056..6232786.924 rows=8367589 loops=1)
Hash Cond: ((w."SHIPMENT_ID" = s."SHIPMENT_ID") AND ((SubPlan 1) = s."SHIPMENT_DATE"))
-> Seq Scan on wafer_data w (cost=0.00..578873.97 rows=27097897 width=46) (actual time=0.007..8999.658 rows=27083570 loops=1)
-> Hash (cost=946.42..946.42 rows=805 width=30) (actual time=0.990..0.990 rows=805 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 60kB
-> Index Scan using shipment_idx2 on shipment s (cost=0.28..946.42 rows=805 width=30) (actual time=0.032..0.680 rows=805 loops=1)
Index Cond: (("SHIPMENT_DATE" >= '2018-07-01 00:00:00'::timestamp without time zone) AND ("SHIPMENT_DATE" <= '2018-09-30 00:00:00'::timestamp without time zone))
SubPlan 1
-> Aggregate (cost=361.17..361.18 rows=1 width=8) (actual time=0.174..0.174 rows=1 loops=35451159)
-> Nested Loop (cost=0.84..361.03 rows=57 width=8) (actual time=0.016..0.159 rows=54 loops=35451159)
-> Index Scan using waferdata_idx2 on wafer_data w2 (cost=0.56..232.07 rows=57 width=4) (actual time=0.013..0.048 rows=54 loops=35451159)
Index Cond: (("LASERMARK")::text = (w."LASERMARK")::text)
-> Index Only Scan using shipment_idx1 on shipment s2 (cost=0.28..2.26 rows=1 width=12) (actual time=0.001..0.001 rows=1 loops=1914795351)
Index Cond: ("SHIPMENT_ID" = w2."SHIPMENT_ID")
Heap Fetches: 1451553724
-> Index Scan using parameters_idx1 on parameters p (cost=0.41..2.33 rows=1 width=32) (actual time=0.007..0.007 rows=1 loops=8367589)
Index Cond: ("PARAMETER_ID" = w."PARAMETER_ID")
-> Index Only Scan using unique_shipment_pc on shipment_pc sp (cost=0.28..1.15 rows=1 width=8) (actual time=0.002..0.003 rows=1 loops=8367589)
Index Cond: ("SHIPMENT_ID" = w."SHIPMENT_ID")
Heap Fetches: 9322754
-> Materialize (cost=0.00..1730.37 rows=158 width=27) (actual time=0.000..0.035 rows=158 loops=8367589)
-> Seq Scan on pc (cost=0.00..1729.58 rows=158 width=27) (actual time=0.009..1.404 rows=158 loops=1)
Planning time: 2.217 ms
Execution time: 6985431.575 ms

В этом то и вопрос - почему используетс SeqScan при заданном условии w."SHIPMENT_ID" = s."SHIPMENT_ID" ?
...
Рейтинг: 0 / 0
Почему не используется индекс ?
    #39704376
rinace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov, спасибо за ответ.
отформатированный план выполнения во вложении
...
Рейтинг: 0 / 0
Почему не используется индекс ?
    #39704899
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rinace,

покажите вывод запроса:
Код: sql
1.
select attname, n_distinct, null_frac, avg_width, most_common_freqs from pg_stats where tablename = 'wafer_data' and attname in ('SHIPMENT_ID', 'LASERMARK');



у вас больше всего времени уходит на вычисление подзапроса с max – именно это надо оптимизировать в первую очередь.

план запроса можно вставлять сюда без вложений, выбрав форматирование как sql в меню редактора.
...
Рейтинг: 0 / 0
Почему не используется индекс ?
    #39705100
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rinaceКратко.
Имеется запрос :
Код: 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.
SELECT
            p."PARAMETER_ID" as  parameter_id,
            pc."PC_NAME" AS pc_name,
            pc."CUSTOMER_PARTNUMBER" AS customer_partnumber,
            w."LASERMARK" AS lasermark,
            w."LOTID" AS lotid,
            w."REPORTED_VALUE" AS reported_value,
            w."LOWER_SPEC_LIMIT" AS lower_spec_limit,
            w."UPPER_SPEC_LIMIT" AS upper_spec_limit,
            p."TYPE_CALCUL" AS type_calcul,
            s."SHIPMENT_NAME" AS shipment_name,
            s."SHIPMENT_DATE" AS shipment_date,
            extract(year from "SHIPMENT_DATE") AS year,
            extract(month from "SHIPMENT_DATE") as month,
            s."REPORT_NAME" AS report_name,
            p."SOITECPARAM_NAME" AS soitecparam_name,
            p."CUSTOMERPARAM_NAME" AS customerparam_name
        FROM wafer_data w,
             shipment s,
             parameters p,
             shipment_pc sp,
             pc pc
        WHERE s."SHIPMENT_ID" = w."SHIPMENT_ID"
          AND p."PARAMETER_ID" = w."PARAMETER_ID"
          AND s."SHIPMENT_ID" = sp."SHIPMENT_ID"
          AND pc."PC_ID" = sp."PC_ID"
          AND s."SHIPMENT_DATE" >= '2018-07-01' AND s."SHIPMENT_DATE" <= '2018-09-30'
          and s."SHIPMENT_DATE" = (SELECT MAX(s2."SHIPMENT_DATE")
                                     FROM shipment s2,
                                          wafer_data w2
                                     WHERE s2."SHIPMENT_ID" = w2."SHIPMENT_ID"
                                       AND w2."LASERMARK" = w."LASERMARK");
Кусок плана выполнения :
         ->  Nested Loop  (cost=958.90..490361411.99 rows=3419 width=104) (actual time=32.075..6304027.497 rows=8367589 loops=1)
               ->  Hash Join  (cost=958.49..490353428.41 rows=3419 width=76) (actual time=32.056..6232786.924 rows=8367589 loops=1)
                     Hash Cond: ((w."SHIPMENT_ID" = s."SHIPMENT_ID") AND ((SubPlan 1) = s."SHIPMENT_DATE"))
                     ->  Seq Scan on wafer_data w  (cost=0.00..578873.97 rows=27097897 width=46) (actual time=0.007..8999.658 rows=27083570 loops=1)


Вопрос : почему используется "Seq Scan on wafer_data w " вместо индекса ?

Хотя индекс по полю SHIPMENT_ID создан :
EDATA=> \d+ wafer_data
Indexes:
"waferdata_idx1" btree ("SHIPMENT_ID", "PARAMETER_ID")
"waferdata_idx2" btree ("LASERMARK")
"waferdata_idx3" btree ("SHIPMENT_ID")
...
Рейтинг: 0 / 0
Почему не используется индекс ?
    #39705103
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rinacevyegorov, спасибо за ответ.

Вот весь план :

QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Код: 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.
Nested Loop  (cost=959.18..490375243.35 rows=3424 width=135) (actual time=32.805..6982828.864 rows=8367589 loops=1)
   Join Filter: (sp."PC_ID" = pc."PC_ID")
   Rows Removed by Join Filter: 1313711473
   ->  Nested Loop  (cost=959.18..490365381.38 rows=3424 width=100) (actual time=32.134..6338543.249 rows=8367589 loops=1)
         Join Filter: (s."SHIPMENT_ID" = sp."SHIPMENT_ID")
         ->  Nested Loop  (cost=958.90..490361411.99 rows=3419 width=104) (actual time=32.075..6304027.497 rows=8367589 loops=1)
               ->  Hash Join  (cost=958.49..490353428.41 rows=3419 width=76) (actual time=32.056..6232786.924 rows=8367589 loops=1)
                     Hash Cond: ((w."SHIPMENT_ID" = s."SHIPMENT_ID") AND ((SubPlan 1) = s."SHIPMENT_DATE"))
                     ->  Seq Scan on wafer_data w  (cost=0.00..578873.97 rows=27097897 width=46) (actual time=0.007..8999.658 rows=27083570 loops=1)
                     ->  Hash  (cost=946.42..946.42 rows=805 width=30) (actual time=0.990..0.990 rows=805 loops=1)
                           Buckets: 1024  Batches: 1  Memory Usage: 60kB
                           ->  Index Scan using shipment_idx2 on shipment s  (cost=0.28..946.42 rows=805 width=30) (actual time=0.032..0.680 rows=805 loops=1)
                                 Index Cond: (("SHIPMENT_DATE" >= '2018-07-01 00:00:00'::timestamp without time zone) AND ("SHIPMENT_DATE" <= '2018-09-30 00:00:00'::timestamp without time zone))
                     SubPlan 1
                       ->  Aggregate  (cost=361.17..361.18 rows=1 width=8) (actual time=0.174..0.174 rows=1 loops=35451159)
                             ->  Nested Loop  (cost=0.84..361.03 rows=57 width=8) (actual time=0.016..0.159 rows=54 loops=35451159)
                                   ->  Index Scan using waferdata_idx2 on wafer_data w2  (cost=0.56..232.07 rows=57 width=4) (actual time=0.013..0.048 rows=54 loops=35451159)
                                         Index Cond: (("LASERMARK")::text = (w."LASERMARK")::text)
                                   ->  Index Only Scan using shipment_idx1 on shipment s2  (cost=0.28..2.26 rows=1 width=12) (actual time=0.001..0.001 rows=1 loops=1914795351)
                                         Index Cond: ("SHIPMENT_ID" = w2."SHIPMENT_ID")
                                         Heap Fetches: 1451553724
               ->  Index Scan using parameters_idx1 on parameters p  (cost=0.41..2.33 rows=1 width=32) (actual time=0.007..0.007 rows=1 loops=8367589)
                     Index Cond: ("PARAMETER_ID" = w."PARAMETER_ID")
         ->  Index Only Scan using unique_shipment_pc on shipment_pc sp  (cost=0.28..1.15 rows=1 width=8) (actual time=0.002..0.003 rows=1 loops=8367589)
               Index Cond: ("SHIPMENT_ID" = w."SHIPMENT_ID")
               Heap Fetches: 9322754
   ->  Materialize  (cost=0.00..1730.37 rows=158 width=27) (actual time=0.000..0.035 rows=158 loops=8367589)
         ->  Seq Scan on pc  (cost=0.00..1729.58 rows=158 width=27) (actual time=0.009..1.404 rows=158 loops=1)
 Planning time: 2.217 ms
 Execution time: 6985431.575 ms



В этом то и вопрос - почему используетс SeqScan при заданном условии w."SHIPMENT_ID" = s."SHIPMENT_ID" ?
-- popravil
...
Рейтинг: 0 / 0
Почему не используется индекс ?
    #39705107
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,
Код: sql
1.
2.
3.
4.
5.
(SELECT MAX(s2."SHIPMENT_DATE")
                                     FROM shipment s2,
                                          wafer_data w2
                                     WHERE s2."SHIPMENT_ID" = w2."SHIPMENT_ID"
                                       AND w2."LASERMARK" = w."LASERMARK")



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


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