|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Поставлена задача кардинально улучшить производительность запроса вида : SELECT 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, 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"; Текущий план запроса : Код: 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.
Представление : CREATE OR REPLACE VIEW public.vw_dataextractor_waferdata AS SELECT 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, 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"; CREATE OR REPLACE RULE "_RETURN" AS ON SELECT TO public.vw_dataextractor_waferdata DO INSTEAD SELECT 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, 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"; Таблица wafer_data порядка 2-х миллионов строк Table "public.wafer_data" Column | Type | Modifiers -----------------------+-----------------------+----------- RUN_ID | integer | LASERMARK | character varying(20) | not null LOTID | character varying(80) | SHIPMENT_ID | integer | not null PARAMETER_ID | integer | not null SOITEC_INTERNAL_VALUE | character varying(75) | REPORTED_VALUE | character varying(75) | LOWER_SPEC_LIMIT | numeric | UPPER_SPEC_LIMIT | numeric | Indexes: "waferdata_idx1" btree ("SHIPMENT_ID", "PARAMETER_ID") "waferdata_idx2" btree ("LASERMARK") "waferdata_idx3" btree ("SHIPMENT_ID") Таблица shipment порядка 2-х тысяч строк Table "public.shipment" Column | Type | Modifiers ---------------+-----------------------------+---------------------------------------------------------------- SHIPMENT_ID | integer | not null default nextval('shipment_shipment_id_seq'::regclass) SHIPMENT_NAME | character varying(30) | SHIPMENT_DATE | timestamp without time zone | REPORT_NAME | character varying(40) | Indexes: "shipment_pkey" PRIMARY KEY, btree ("SHIPMENT_ID") "unique_shipment_name_date_report" UNIQUE CONSTRAINT, btree ("SHIPMENT_NAME", "SHIPMENT_DATE", "REPORT_NAME") "shipment_idx1" btree ("SHIPMENT_ID", "SHIPMENT_DATE") "shipment_idx2" btree ("SHIPMENT_DATE") "shipment_idx3" btree ("SHIPMENT_ID") Таблица parameters порядка 22 000 строк Table "public.parameters" Column | Type | Modifiers --------------------+-----------------------+--------------------------------------------------------- PARAMETER_ID | integer | not null default nextval('parameters_id_seq'::regclass) PC_ID | integer | SOITECPARAM_NAME | character varying(50) | CUSTOMERPARAM_NAME | character varying(50) | CUSTOMERPARAM_UNIT | character varying(32) | TYPE_CALCUL | character varying(50) | Indexes: "unique_parameter" UNIQUE CONSTRAINT, btree ("PC_ID", "SOITECPARAM_NAME", "CUSTOMERPARAM_NAME", "CUSTOMERPARAM_UNIT", "TYPE_CALCUL") "parameters_idx1" btree ("PARAMETER_ID", "CUSTOMERPARAM_NAME") Таблица shipment_pc порядка 2 000 строе Table "public.shipment_pc" Column | Type | Modifiers -------------+---------+---------------------------------------------------------- ID | integer | not null default nextval('shipment_pc_id_seq'::regclass) SHIPMENT_ID | integer | PC_ID | integer | Indexes: "unique_shipment_pc" UNIQUE CONSTRAINT, btree ("SHIPMENT_ID", "PC_ID") "shipmentpc_idx1" btree ("SHIPMENT_ID", "PC_ID") Таблица pc порядка 100 строк Table "public.pc" Column | Type | Modifiers ---------------------+-----------------------+---------------------------------------------------- PC_ID | integer | not null default nextval('pc_pc_id_seq'::regclass) PC_NAME | character varying(50) | CUSTOMER_PARTNUMBER | character varying(30) | CUSTOMERFACTORY_ID | character varying(30) | Indexes: "unique_pc" UNIQUE CONSTRAINT, btree ("PC_NAME", "CUSTOMER_PARTNUMBER", "CUSTOMERFACTORY_ID") "pc_idx1" btree ("PC_NAME") Просьба сразу, не тратить время на предложения типа «пересчитать статистику». Мое личное мнение – задача не решаемая , кардинально улучшить ситуацию нельзя , потому, что самая большая таблица служит для реализации отношения многие-ко-многим . Секционирование таблицы wafer_data по ключам SHIPMENT_ID или PARAMETER_ID – увеличивает стоимость запроса . Но вдруг у кого найдется свежее решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 12:11 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
rinace, Execution time: 43.283 ms А какое желаемое время по сравнению с 43 мс? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 12:17 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
jan2aryrinace, Execution time: 43.283 ms А какое желаемое время по сравнению с 43 мс? Это время с тестовой маленькой базы, на продакшн время выполнения чуть побольше. Вопрос конечно больше теоретический, запрос получен в результате исследований и попыток улучшить время выполнения другого запроса . 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-04-03' AND s."SHIPMENT_DATE" <= '2018-08-03' 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"); Со следующим планом Код: 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.
В ходе попыток улучшить запрос, возникла идея о секционировании, однако оказалось , секционирование в данном случае ничем не помогает. Этот запрос несколько похож на исходный, поэтому чтобы не усложнять и не перегружать и был задан вопрос по возможности оптимизировать конструкцию , хотя запрос сильно другой, согласен. Возможно запрос из первого сообщения нельзя чем то улучшить в отличии от текущего. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 12:38 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
rinace, у вас два последовательных просмотра shipments: один из-за отсутствия индекса по shipment_date, второй из-за max(). Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Здесь, как я понимаю, max() имеет смысл только, если попадает между указанными датами. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 13:05 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Ы2rinace, у вас два последовательных просмотра shipments: один из-за отсутствия индекса по shipment_date, второй из-за max(). Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Здесь, как я понимаю, max() имеет смысл только, если попадает между указанными датами. А вот это уж что-то. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 13:31 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Ы2rinace, у вас два последовательных просмотра shipments: один из-за отсутствия индекса по shipment_date, второй из-за max(). Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Здесь, как я понимаю, max() имеет смысл только, если попадает между указанными датами. да, смысл max именно такой. Однако почему возникает Seq Scan пока не понятно Индексы имеются shipment Table "public.shipment" Column | Type | Collation | Nullable | Default ---------------+-----------------------------+-----------+----------+----------------------------------------------- SHIPMENT_ID | integer | | not null | nextval('shipment_shipment_id_seq'::regclass) SHIPMENT_NAME | character varying(30) | | | SHIPMENT_DATE | timestamp without time zone | | | REPORT_NAME | character varying(40) | | | Indexes: "shipment_pkey" PRIMARY KEY, btree ("SHIPMENT_ID") "unique_shipment_name_date_report" UNIQUE CONSTRAINT, btree ("SHIPMENT_NAME", "SHIPMENT_DATE", "REPORT_NAME") "shipment_idx1" btree ("SHIPMENT_ID", "SHIPMENT_DATE") "shipment_idx2" btree ("SHIPMENT_DATE") "shipment_idx3" btree ("SHIPMENT_ID") ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 13:36 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
rinace, Код: sql 1. 2. 3.
если в бою то же -- бороться не за что ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 13:48 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
qwwq, В боевой чуть-чуть по другому оказывается , индекс по SHIPMENT_DATA использован, но там и строк в таблице сильно побольше Код: 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.
В общем, тут ничего особо не улучшить, как я понимаю пока . ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 14:12 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
rinace Код: plaintext 1. 2.
Можно попробовать подумать, как обойтись без этих почти 27 миллиардов. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 14:41 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
rinaceВ общем, тут ничего особо не улучшить, как я понимаю пока . А какая версия базы у вас? Странно что параллельные запросы не включаются на десятке. PS: я на вскидку вижу много вариантов чего тут улучшить можно но это уже за пределы поддержки на форуме выходит. Если будет время вечером - предложу несколько вариантов. Но надо версию базы знать. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 15:07 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Maxim BogukrinaceВ общем, тут ничего особо не улучшить, как я понимаю пока . А какая версия базы у вас? Странно что параллельные запросы не включаются на десятке. PS: я на вскидку вижу много вариантов чего тут улучшить можно но это уже за пределы поддержки на форуме выходит. Если будет время вечером - предложу несколько вариантов. Но надо версию базы знать. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru select version(); version -------------------------------------------------------------------------------------------------------- PostgreSQL 10.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4), 64-bit (1 row) Вопрос не горящий, хотя с теоретической точки зрения интересно. Если что подкинете, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2018, 16:12 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Ы2rinace Код: plaintext 1. 2.
Можно попробовать подумать, как обойтись без этих почти 27 миллиардов . миллионов? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 11:54 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
256k, действительно, миллионов. Но все равно многовато. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 12:22 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Ы2256k, действительно, миллионов. Но все равно многовато. таки до ярдов там доходило. авторloops=1880840957 интересно, нельзя ли этот "макс по джойну" материализовать или в поле одной из (триггерно) или отдельной таблицей. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 12:31 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
qwwqЫ2256k, действительно, миллионов. Но все равно многовато. таки до ярдов там доходило. авторloops=1880840957 интересно, нельзя ли этот "макс по джойну" материализовать или в поле одной из (триггерно) или отдельной таблицей. Вот именно эта мысль и приходит в голову. Нужно избавить от коррелированного подзапроса ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 16:50 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
rinaceMaxim Bogukпропущено... А какая версия базы у вас? Странно что параллельные запросы не включаются на десятке. PS: я на вскидку вижу много вариантов чего тут улучшить можно но это уже за пределы поддержки на форуме выходит. Если будет время вечером - предложу несколько вариантов. Но надо версию базы знать. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru select version(); version -------------------------------------------------------------------------------------------------------- PostgreSQL 10.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4), 64-bit (1 row) Вопрос не горящий, хотя с теоретической точки зрения интересно. Если что подкинете, спасибо. Тогда начнем с show max_worker_processes ; show max_parallel_workers_per_gather ; select count(*) from wafer_data ; explain analyze select distinct LASERMARK from wafer_data; explain analyze select lasermark, max(shipment_date) from wafer_data join shipment on shipment.SHIPMENT_ID=wafer_data.SHIPMENT_ID group by lasermark; А дальше будем думать. Все с prod Базы. PS: комментарии на счет структуры базы (в части отсутствия FK И наличия таблиц без primary key), структуры индексов (тут вообще один мат) и используемой версии базы ("хождение по багам") - я оставлю для отдельного комента. Если это у вас prod - очень очень грустно. :( -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2018, 20:26 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Maxim Boguk, Взято с prod: version select version(); version -------------------------------------------------------------------------------------------------------- PostgreSQL 10.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit (1 row) show max_worker_processes ; max_worker_processes ---------------------- 8 (1 row) show max_parallel_workers_per_gather ; max_parallel_workers_per_gather --------------------------------- 2 (1 row) select count(*) from wafer_data ; count ---------- 30608037 (1 row) explain analyze select distinct "LASERMARK" from wafer_data; Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
explain analyze select "LASERMARK", max("SHIPMENT_DATE") from wafer_data join shipment on shipment."SHIPMENT_ID"=wafer_data."SHIPMENT_ID" group by "LASERMARK"; Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
По поводу избавления от коррелированного подзапроса, удалось очень сильно снизить стоимость и соответственно уменьшить время выполнения : Код: 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.
Код: 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.
По поводу структуры базы - ну в таком виде принята на поддержку, как раз и стоит задача привести все в нормальное состояние. Как раз планировал посмотреть , что там с индексами и PK, FK. По поводу версии - предлагаете на 10.5 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2018, 15:56 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
rinace, 1)по версии - да 10.5 2)у вас там походу такие настройки что параллельное выполнение не хочет включаться (хотя надо смотреть конечно) 3)правильно ли я понимаю что lasermark в wafer_data уникальный? И если да то запрос мягко говоря странный получается. 4)ваш запрос неверный в части SELECT w2."LASERMARK" , MAX(s2."SHIPMENT_DATE") AS "MAX_SHIPMENT_DATE" FROM shipment s2 INNER JOIN wafer_data w2 ON s2."SHIPMENT_ID" = w2."SHIPMENT_ID" WHERE s2."SHIPMENT_DATE" >= '2018-07-01' AND s2."SHIPMENT_DATE" <= '2018-09-30' group by w2."LASERMARK" он никак не будет проверять что МАКСИМАЛЬНЫЙ shipment_date для заданной LASERMARK находится в заданном диапазоне (если предполагать что он все таки не уникальный конечно) 5)в таких запросах надо начинать с получения точной постановки чего именно от него хотят так как в половине случаев то что хотят и то что написано в запросе - вещи несовпадающие. PS: ощущение что у вас много времени тратиться на работу с дисками... а тогда стабильной скорости не будет и надо смотреть что там с этой проблемой тоже. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2018, 17:54 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
rinace, Максим, как обычно, дело говорит. Я правильно понимаю, что вы тянете все детали для последнего shipment в предоставленном диапазоне дат? Меня сильно смущает сакральный смысл WAFER_DATA.LASERMARK. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2018, 03:44 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Sergei.Agalakovrinace, Максим, как обычно, дело говорит. Я правильно понимаю, что вы тянете все детали для последнего shipment в предоставленном диапазоне дат? Меня сильно смущает сакральный смысл WAFER_DATA.LASERMARK. Спасибо Сергей, Спасибо Максим. Аналогичные мысли и мне приходили. Смысл LASERMARK пока не понятен , как и смысл запроса. Спасибо за наводки, анализирую. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2018, 10:32 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Maxim Bogukrinace, 4)ваш запрос неверный в части SELECT w2."LASERMARK" , MAX(s2."SHIPMENT_DATE") AS "MAX_SHIPMENT_DATE" FROM shipment s2 INNER JOIN wafer_data w2 ON s2."SHIPMENT_ID" = w2."SHIPMENT_ID" WHERE s2."SHIPMENT_DATE" >= '2018-07-01' AND s2."SHIPMENT_DATE" <= '2018-09-30' group by w2."LASERMARK" он никак не будет проверять что МАКСИМАЛЬНЫЙ shipment_date для заданной LASERMARK находится в заданном диапазоне (если предполагать что он все таки не уникальный конечно) -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru Отдельное спасибо за уточнение. Стало быть попытка избавится от коррелированного подзапроса, пока не удачная оказалась. Продолжу искать ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2018, 10:33 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Maxim Bogukrinace, 3)правильно ли я понимаю что lasermark в wafer_data уникальный? И если да то запрос мягко говоря странный получается. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru Нет поле LASERMARK не уникальное, только индексировано Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2018, 10:30 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
Очередная попытка оптимизировать запрос , избавившись от коррелированного подзапроса На продакшн version -------------------------------------------------------------------------------------------------------- PostgreSQL 10.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit (1 row) Код: 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.
В результате получен следующий план : Код: 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.
В принципе , если не ошибся с изменением запроса неплохо. Однако не понятно почему возникают Seq Scan on wafer_data Таблица wafer_data проиндексирована по SHIPMENT_ID Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Это особенности версии 10.4 или можно заставить оптимизатор использовать индекс ? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2018, 14:04 |
|
Оптимизация запроса
|
|||
---|---|---|---|
#18+
rinace, Хотя с другой стороны внимательнее посмотрев условия запроса - слишком большая выборка получается rows=10855785 Может быть оптимизатор все делает так как и должен делать. Нет смысла подключать индекс если в результате выбираются все строки. Но хотелось бы конечно получить опровержение или подтверждение от более опытных коллег. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2018, 14:10 |
|
|
start [/forum/search_topic.php?author=sms63&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 686ms |
total: | 870ms |
0 / 0 |