|
Почему не используется индекс ?
|
|||
---|---|---|---|
#18+
Кратко. Имеется запрос : 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") ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 15:04 |
|
Почему не используется индекс ?
|
|||
---|---|---|---|
#18+
rinace, 1. Читать код в такой каше очень неудобно, вы уж в следующий раз хоть немного его форматируйте 2. SeqScan возвращает 27М записей, после джойна остаётся 8М. Тут индексы по shipment_id не поможет 3. А приведите весь план?.. Ибо гадать что у вас там получается нет желания ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 15:34 |
|
Почему не используется индекс ?
|
|||
---|---|---|---|
#18+
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" ? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 15:49 |
|
Почему не используется индекс ?
|
|||
---|---|---|---|
#18+
vyegorov, спасибо за ответ. отформатированный план выполнения во вложении ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 16:00 |
|
Почему не используется индекс ?
|
|||
---|---|---|---|
#18+
rinace, покажите вывод запроса: Код: sql 1.
у вас больше всего времени уходит на вычисление подзапроса с max – именно это надо оптимизировать в первую очередь. план запроса можно вставлять сюда без вложений, выбрав форматирование как sql в меню редактора. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2018, 13:18 |
|
Почему не используется индекс ?
|
|||
---|---|---|---|
#18+
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.
Вопрос : почему используется "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") ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2018, 16:10 |
|
Почему не используется индекс ?
|
|||
---|---|---|---|
#18+
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.
В этом то и вопрос - почему используетс SeqScan при заданном условии w."SHIPMENT_ID" = s."SHIPMENT_ID" ? -- popravil ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2018, 16:15 |
|
Почему не используется индекс ?
|
|||
---|---|---|---|
#18+
qwwq, Код: sql 1. 2. 3. 4. 5.
навскидку может пригодиться индекс типа : ("SHIPMENT_ID","LASERMARK","SHIPMENT_DATE") | ("LASERMARK","SHIPMENT_ID","SHIPMENT_DATE") ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2018, 16:19 |
|
|
start [/forum/topic.php?fid=53&fpage=50&tid=1995583]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 268ms |
total: | 401ms |
0 / 0 |