|
|
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
Делаю отчет по 3 событиям собирая строки тремя разными SELECT. По отдельности каждый из SELECT работают меньше секунды, а объединенные в один запрос оператором UNION выполняются уже пол минуты. Догадываюсь, что запросы криво составлены, индексов не хватает. Оптимизатор видя их вместе ошибается с выбором индексов, может быть есть легкий способ заставить его делать все запросы независимо и по отдельности. Или еще как то оптимизировать объединенный запрос. Спасибо. Код: plsql 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. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 11:59:16 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
И сколько же записей производит каждый из трёх запросов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 12:14:08 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
записей немного ~ 10тыс каждый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 12:21:46 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
А что показывает план выполнения? особенно на последнем этапе - слиянии... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 12:25:02 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
Вот объединенный: idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARYofferALLPRIMARYNULLNULLNULL7821"Using where"1PRIMARYitem_offerref"fk_item_idxfk_offer_idx"fk_offer_idx9equipment.offer.id2"Using where"1PRIMARYitemeq_refPRIMARYPRIMARY8equipment.item_offer.item_id11PRIMARY<derived2>ALLNULLNULLNULLNULL76"Using where; Not exists"1PRIMARY<derived3>ALLNULLNULLNULLNULL76103DERIVEDitemindexPRIMARYfk_item_15NULL19107"Using index; Using temporary; Using filesort"3DERIVEDitem_offerreffk_item_idxfk_item_idx8equipment.item.id12DERIVEDoffer_acceptALLNULLNULLNULLNULL11061"Using where"4UNIONoffer_paymentALLNULLNULLNULLNULL4461"Using where"4UNIONitem_offerref"fk_item_idxfk_offer_idx"fk_offer_idx9equipment.offer_payment.offer_id2"Using where"4UNION<derived5>ALLNULLNULLNULLNULL5517"Using where; Using join buffer"4UNIONitemeq_refPRIMARYPRIMARY8equipment.item_offer.item_id14UNIONoffereq_refPRIMARYPRIMARY8equipment.offer_payment.offer_id1"Using where"4UNION<derived6>ALLNULLNULLNULLNULL76106DERIVEDitemindexPRIMARYfk_item_15NULL19107"Using index; Using temporary; Using filesort"6DERIVEDitem_offerreffk_item_idxfk_item_idx8equipment.item.id15DERIVEDofferindexPRIMARYPRIMARY8NULL3910"Using where"5DERIVEDitem_offerreffk_offer_idxfk_offer_idx9equipment.offer.id2"Using where"7UNIONdeliveryALLPRIMARYNULLNULLNULL4639"Using where"7UNIONdelivery_itemref"fk_delivery_item_1fk_delivery_item_2_idxfk_delivery_item_3_idx"fk_delivery_item_14equipment.delivery.id1"Using where"7UNIONitemeq_refPRIMARYPRIMARY8equipment.delivery_item.item_id17UNIONitem_offereq_refPRIMARYPRIMARY8equipment.delivery_item.item_offer_id17UNION<derived8>ALLNULLNULLNULLNULL44098DERIVEDdeliveryindexPRIMARYs_sp_idx5NULL4639"Using index; Using temporary; Using filesort"8DERIVEDdelivery_itemref"fk_delivery_item_1fk_delivery_item_2_idxfk_delivery_item_3_idx"fk_delivery_item_14equipment.delivery.id18DERIVEDitemeq_refPRIMARYPRIMARY8equipment.delivery_item.item_id18DERIVEDitem_offereq_refPRIMARYPRIMARY8equipment.delivery_item.item_offer_id1NULL"UNION RESULT""<union147>"ALLNULLNULLNULLNULLNULL Это первый idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARYofferALLPRIMARYNULLNULLNULL7820"Using where"1PRIMARYitem_offerref"fk_item_idx;fk_offer_idx"fk_offer_idx9equipment.offer.id2"Using where"1PRIMARYitemeq_refPRIMARYPRIMARY8equipment.item_offer.item_id11PRIMARY<derived2>ALLNULLNULLNULLNULL76"Using where; Not exists"1PRIMARY<derived3>ALLNULLNULLNULLNULL76093DERIVEDitemindexPRIMARYfk_item_15NULL19099"Using index; Using temporary; Using filesort"3DERIVEDitem_offerreffk_item_idxfk_item_idx8equipment.item.id12DERIVEDoffer_acceptALLNULLNULLNULLNULL11059"Using where" Второй idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARYoffer_paymentALLNULLNULLNULLNULL4460"Using where"1PRIMARYitem_offerref"fk_item_idx;fk_offer_idx"fk_offer_idx9equipment.offer_payment.offer_id2"Using where"1PRIMARY<derived2>ALLNULLNULLNULLNULL5516"Using where; Using join buffer"1PRIMARYitemeq_refPRIMARYPRIMARY8equipment.item_offer.item_id11PRIMARYoffereq_refPRIMARYPRIMARY8equipment.offer_payment.offer_id1"Using where"1PRIMARY<derived3>ALLNULLNULLNULLNULL76093DERIVEDitemindexPRIMARYfk_item_15NULL19107"Using index; Using temporary; Using filesort"3DERIVEDitem_offerreffk_item_idxfk_item_idx8equipment.item.id12DERIVEDofferindexPRIMARYPRIMARY8NULL3910"Using where"2DERIVEDitem_offerreffk_offer_idxfk_offer_idx9equipment.offer.id2"Using where" Третий idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARYdeliveryALLPRIMARYNULLNULLNULL4639"Using where"1PRIMARYdelivery_itemref"fk_delivery_item_1;fk_delivery_item_2_idx;fk_delivery_item_3_idx"fk_delivery_item_14equipment.delivery.id1"Using where"1PRIMARYitemeq_refPRIMARYPRIMARY8equipment.delivery_item.item_id11PRIMARYitem_offereq_refPRIMARYPRIMARY8equipment.delivery_item.item_offer_id11PRIMARY<derived2>ALLNULLNULLNULLNULL44092DERIVEDdeliveryindexPRIMARYs_sp_idx5NULL4639"Using index; Using temporary; Using filesort"2DERIVEDdelivery_itemref"fk_delivery_item_1;fk_delivery_item_2_idx;fk_delivery_item_3_idx"fk_delivery_item_14equipment.delivery.id12DERIVEDitemeq_refPRIMARYPRIMARY8equipment.delivery_item.item_id12DERIVEDitem_offereq_refPRIMARYPRIMARY8equipment.delivery_item.item_offer_id1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 12:49:00 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
Akina, вот точнее, (в прошлый раз таблица разъехалась) idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARYofferALLPRIMARYNULLNULLNULL7821"Using where"1PRIMARYitem_offerref"fk_item_idx;fk_offer_idx"fk_offer_idx9equipment.offer.id2"Using where"1PRIMARYitemeq_refPRIMARYPRIMARY8equipment.item_offer.item_id11PRIMARY<derived2>ALLNULLNULLNULLNULL76"Using where; Not exists"1PRIMARY<derived3>ALLNULLNULLNULLNULL76103DERIVEDitemindexPRIMARYfk_item_15NULL19107"Using index; Using temporary; Using filesort"3DERIVEDitem_offerreffk_item_idxfk_item_idx8equipment.item.id12DERIVEDoffer_acceptALLNULLNULLNULLNULL11061"Using where"4UNIONoffer_paymentALLNULLNULLNULLNULL4461"Using where"4UNIONitem_offerref"fk_item_idx;fk_offer_idx"fk_offer_idx9equipment.offer_payment.offer_id2"Using where"4UNION<derived5>ALLNULLNULLNULLNULL5517"Using where; Using join buffer"4UNIONitemeq_refPRIMARYPRIMARY8equipment.item_offer.item_id14UNIONoffereq_refPRIMARYPRIMARY8equipment.offer_payment.offer_id1"Using where"4UNION<derived6>ALLNULLNULLNULLNULL76106DERIVEDitemindexPRIMARYfk_item_15NULL19107"Using index; Using temporary; Using filesort"6DERIVEDitem_offerreffk_item_idxfk_item_idx8equipment.item.id15DERIVEDofferindexPRIMARYPRIMARY8NULL3910"Using where"5DERIVEDitem_offerreffk_offer_idxfk_offer_idx9equipment.offer.id2"Using where"7UNIONdeliveryALLPRIMARYNULLNULLNULL4639"Using where"7UNIONdelivery_itemref"fk_delivery_item_1;fk_delivery_item_2_idx;fk_delivery_item_3_idx"fk_delivery_item_14equipment.delivery.id1"Using where"7UNIONitemeq_refPRIMARYPRIMARY8equipment.delivery_item.item_id17UNIONitem_offereq_refPRIMARYPRIMARY8equipment.delivery_item.item_offer_id17UNION<derived8>ALLNULLNULLNULLNULL44098DERIVEDdeliveryindexPRIMARYs_sp_idx5NULL4639"Using index; Using temporary; Using filesort"8DERIVEDdelivery_itemref"fk_delivery_item_1;fk_delivery_item_2_idx;fk_delivery_item_3_idx"fk_delivery_item_14equipment.delivery.id18DERIVEDitemeq_refPRIMARYPRIMARY8equipment.delivery_item.item_id18DERIVEDitem_offereq_refPRIMARYPRIMARY8equipment.delivery_item.item_offer_id1NULL"UNION RESULT""<union1;4;7>"ALLNULLNULLNULLNULLNULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 12:52:13 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
Посмотрел частные запросы... есть мелкие странности. Вот например: Код: 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. НЕ нра вот эта часть: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Перерисуй её на WHERE NOT EXISTS, что ли. Что до окончательного запроса - я не понимаю, откуда появляются лишние сортировки. Так что из осмысленных советов рождается разве что реализация этого всего в процедуре со сливом записей во временную таблицу и потом селектом из неё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 13:32:14 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
авторТак что из осмысленных советов рождается разве что реализация этого всего в процедуре со сливом записей во временную таблицу и потом селектом из неё. это так и работает, с 10 минутной актуальностью им достаточно. Меня сам факт увеличения времени беспокоит, именно то, что я не понимаю. В общем буду копать. Тот запрос, я могу просто изъять и все равно оставшиеся считаются быстрее, чем объединенные UNION оба. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 13:44:44 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
kpushМеня сам факт увеличения времени беспокоит, именно то, что я не понимаю. Ну так почитай документацию про разницу между UNION и UNION ALL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 13:52:29 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov , у него как раз UNION ALL. Если посмотреть опубликованный код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 13:56:16 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
Код: 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. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 14:59:02 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ТС, тебя ничего не смущает - находим список айдишников, для которых Эллоу не равно 1, и берём айдишники, которые не в этом списке. я понимаю что двойное отрицание, это утверждения... но в даннос ситуации, - ты чего творишь то!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 15:02:45 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
alex564657498765453я понимаю что двойное отрицание, это утверждения...А мож у него поле допускает NULL... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 15:04:56 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. для вычисления offer_item_group.item_group_id нихилый такой подзапрос... это точно надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 15:08:15 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
Akinaalex564657498765453я понимаю что двойное отрицание, это утверждения...А мож у него поле допускает NULL... в общем то да, NULL когда решение не принято. Такая архитектура, старались избежать дублирование информации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 15:08:54 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
alex564657498765453 Код: sql 1. для вычисления offer_item_group.item_group_id нихилый такой подзапрос... это точно надо? иногда добавляют строчку счета не из заявки, (т.е. equipment.item с item_group_id Null окажется) когда например доставку в счет вставляют или сборку или хрень какую то дополнительную. Тогда делаем предположение, что расход по этому должен нести тот кто заказывал все остальное в этом счете. Такая же конструкция с доставками, нам все, что вошло в один счет и попало в одну доставку "вешается" на один заказ. Пробовал это выкидывать на уровень верхних (не указанных здесь запросов) Код: 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. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. , скорость не изменилась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 15:36:14 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
kpushalex564657498765453 Код: sql 1. для вычисления offer_item_group.item_group_id нихилый такой подзапрос... это точно надо? иногда добавляют строчку счета не из заявки, (т.е. equipment.item с item_group_id Null окажется) когда например доставку в счет вставляют или сборку или хрень какую то дополнительную. Тогда делаем предположение, что расход по этому должен нести тот кто заказывал все остальное в этом счете. Такая же конструкция с доставками, нам все, что вошло в один счет и попало в одну доставку "вешается" на один заказ. Пробовал это выкидывать на уровень верхних (не указанных здесь запросов) Код: 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. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. , скорость не изменилась. Сейчас выкинул вообще эти под запросы, стало 7 секунд, а отдельные запросы вместе взятые меньше 1 секунды. Придумываю, как этим воспользоваться, что бы улучшить показатели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 15:59:21 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
kpushСейчас выкинул вообще эти под запросы, стало 7 секунд, а отдельные запросы вместе взятые меньше 1 секунды. Придумываю, как этим воспользоваться, что бы улучшить показатели. в конечном итоге добился только сокращения расчета временной таблицы с 30 до 20 секунд, на этом думаю отложить. Спасибо за поддержку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 18:14:53 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
kpushв конечном итоге добился только сокращения расчета временной таблицы с 30 до 20 секунд, на этом думаю отложить. Спасибо за поддержку. Убрал в исходном запросе SUBSELECTы по расчету суммы и недостающих номеров заказов, т.к. их актуализация каждые 5 минут достаточна для дела. Из пересчет занимает 3 секунды в сумме. Все вернулось "на круги своя". Теперь 0,7 секунды сразу итоговый отчет, без промежуточных таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 14:45:02 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
kpushalex564657498765453 Код: sql 1. для вычисления offer_item_group.item_group_id нихилый такой подзапрос... это точно надо? иногда добавляют строчку счета не из заявки, (т.е. equipment.item с item_group_id Null окажется) когда например доставку в счет вставляют или сборку или хрень какую то дополнительную. Тогда делаем предположение, что расход по этому должен нести тот кто заказывал все остальное в этом счете. Такая же конструкция с доставками, нам все, что вошло в один счет и попало в одну доставку "вешается" на один заказ. Пробовал это выкидывать на уровень верхних (не указанных здесь запросов) Код: 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. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. , скорость не изменилась. и вопрос остаёться в силе, зачем групировку делать? то-есть у тебя этот айди либо нету, либо такойже как для любого елемента группы?? тоесть тебе по сути нужен любой елемент где не нулл требуемый айдишник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 16:09:44 |
|
||
|
UNION работает дольше, чем 3 SELECT по отдельности.
|
|||
|---|---|---|---|
|
#18+
alex564657498765453и вопрос остаёться в силе, зачем групировку делать? то-есть у тебя этот айди либо нету, либо такойже как для любого елемента группы?? тоесть тебе по сути нужен любой елемент где не нулл требуемый айдишник. Эту группировку я то же убрал тем, ввел новое поле: item.tmp_item_group_id и заранее его вычисляю, если нет значения "номера группы" в основном item.item_group_id . Вот такой процедурой: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Сумму счета offer_sum.offer_sum вычисляю то же заранее. И отчет становится быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 17:25:42 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=139&tid=1833273]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
49ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
151ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 464ms |

| 0 / 0 |
