|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Имеем два запроса Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
с планом Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
и Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
с планом Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
как видим во втором случае сначала сортируется, то что соединено внутренним джойном, а потом к нему присоединяются таблички по внешним джойнам. Сервер умный и догадался что левый джойн не влияет на порядок записей и протолкнул сортировку поглубже, тем самым уменьшив ширину сортируемой выборки и экономя память. Вот тут у меня возник собственно вопрос. А нельзя ли тоже самое проделать для внутренних джойнов? Т.е. для первого случая. Раз уж там порядок соединения определился так что FATHER и MOTHER всё равно присоединяются потом. Почему бы для первого случая плану не быть таким Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2015, 15:56 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
последний план не копировал а набирал руками, поэтому там могла быть ошибка. По идее отформатирован он должен быть как-то так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2015, 15:59 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Симонов Денис, В первом случае Ваши JOIN являтся фильтрами, ограничивающими выборку. И они по индексу. Логично предположить, что после их наложения результат может уменьшиться и сортировать придется меньше строк. Сервер собственно так и поступает, что вполне логично. Если Вы сделаете индекс в направлении сортировки на табличке, то план может еще другой вид принять и он будет разный для этих двух видов запросов. Также он возможно будет различным при использовании подсказок оптимизатору (либо будет индекс использовать для сортировки, либо нет). Правда все это зависит от наличия нужных индексов по объединяемым полям. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 14:06 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Romanzek, ну так я и не предлагаю это делать всегда и безапелляционно. Оптимизатор он на то и оптимизатор чтобы просчитывать наименьшую стоимость. Конкретно в моём случае выборка не уменьшается и не увеличивается. CODE_FATHER и CODE_MOTHER всегда принимают значения. Т.е. NULL заменён на псевдо записи с кодами -2 и -3 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 14:11 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Симонов Денис, Уменьшается выборка в случае отсутствия в таблицах строк, удовлетворяющих предикату. Если записи всегда имеют связь 1 к одному, то можно в таких случаях заменять JOIN на LEFT JOIN, однако нежелательно. В ранних версиях FB это применяли, в последних (2.1 и новее) уже оптимизатор вполне справляется, так как учитывает статистику по индексам корректно. В РедБазе также была доработка, позволяющая эффективно использовать индексы по NULLABLE полям с учетом статистики значений NULL (например для случаев, когда все значения столбца NULL - в старом варианте статистика была 1 и оптимизатор не использовал такие индексы). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 15:04 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
А у вас, кстати, какие отличия в скорости выполнения? Приложите Performance Statitstics. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 15:06 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Romanzek, запрос с внутренними джойнами Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
запрос с внешними джойнами Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
на самом деле эта статистика без FetchAll. Запрос с внешними джойнами позволяет получить первую порцию записей быстрей. Когда делаешь FetchAll то по времени никакой разницы уже нет. Разве что по фетчам и памяти. Но у меня TempCacheLimit в гигабайт выставлен. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 15:23 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Romanzek, Вопрос чисто теоретический. К практике отношения не имеет ибо на самом деле он чуток другой и там всё быстро работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 15:24 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Симонов Денис, На самом деле, отличия все равно скорее всего есть, по скорости сортировки, так как в FB скорость сортировки зависит от количества участвующих в результирующем наборе полей (сортировка ведется всего набора, а не только тех полей, которые в ней участвуют). В РедБазе это исправлено, но имеется ряд ограничений, снимающихся консистентными стейтментами. Если выборка вся будет читаться - то Вам в общем-то все равно, разница в данном случае будет незаметной (мало полей в выборке). Если первые несколько строк, то придется либо LEFT JOIN лепить, либо при помощи +0 загонять под нужный план, либо использовать подсказки оптимизатору. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 15:41 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Ах да, есть еще first :) Он тоже будет подсказкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 15:43 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Romanzek, у вас же там нативные подсказки прилепили для стратегии FIRST/ALL ROWS. Для FB dimitr почему-то не стал их добавлять ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 15:46 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
RomanzekНа самом деле, отличия все равно скорее всего есть, по скорости сортировки, так как в FB скорость сортировки зависит от количества участвующих в результирующем наборе полей (сортировка ведется всего набора, а не только тех полей, которые в ней участвуют). В РедБазе это исправлено, но имеется ряд ограничений, снимающихся консистентными стейтментами. несколько лет назад ДЕ выкладывал пропатченную версию где именно так и делалось. Но после тестирования оказалось что это не всегда благо. А оптимизатор распознать когда такой подход применять, а когда старый пока не может. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 15:54 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Симонов Денис, Да, изменение алгоритма сортировки приводит к проблемам на неконсистентных курсорах. Эти две доработки надо в паре брать. Точнее первая без второй имеет ряд ограничений. В случае с LEFT JOIN тоже может быть такая проблема, но она уже приведет к ошибочному результату на неконсистентном запросе (пусть Дмитрий поправит, если я неправ). То есть может получиться так, что ваш запрос с inner join всегда возвращает родителя для всех экземпляров, а в случае с LEFT JOIN вы можете получить NULL на достаточно большой выборке именно из-за сортировки, затащенной внутрь. Так что это еще вопрос - благо ли это или нет. Да, подсказки есть. Оператор first работает как стратегия optimize for first rows. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 16:10 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Romanzek, я говорил не о возможных ошибках, а о том что новый алгоритм сортировки не всегда выигрывал у старого. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 16:22 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Romanzek, раз уж заговорили о стабильном курсоре в RC. У меня по поводу того патча который делает его стабильным беспокойство осталось. Долгая RO RC транзакция теперь удерживает сборку мусора? Вроде да. И чтобы уменьшить эту проблему была введена промежуточная сборка мусора. В какие моменты она срабатывает и за счёт чего долгие RO RC транзакции не будут приводить к проблемам с производительностью? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 16:27 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Симонов Денис, Да, действительно это так. Но доработка делалась с учетом этих особенностей, некоторая эмпирика там присутствует. Скорее всего таких случаев осталось немного и разница не будет существенной. Выигрыш же на больших и широких выборках просто огромен. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 16:28 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Симонов ДенисДолгая RO RC транзакция теперь удерживает сборку мусора? Вроде да. Пока открыт курсор. Симонов ДенисИ чтобы уменьшить эту проблему была введена промежуточная сборка мусора. Если я правильно понимаю, о какой промежуточной сборке мусора речь, то этот патч пока еще не готов и не был влит. Точнее был влит, но потом откачен для доработки. Очень бы хотелось его доработать, но пока нет ресурса. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 16:50 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
RomanzekСимонов ДенисДолгая RO RC транзакция теперь удерживает сборку мусора? Вроде да. Пока открыт курсор. вот это и плохо. Большинство программ на Delphi открывают RO RC и не парятся. Таким образом, можно получать недофетченный курсор и дофетчивать когда потребуется, при этом сборка мусора не удерживается. А теперь получается что все эти проги придётся переписывать чтобы не огрести проблемы с производительностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 17:11 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Симонов ДенисБольшинство программ на Delphi открывают RO RC и не парятся. А всё потому, что кое-кто, находясь в эйфории от этой фичи, в своё время порекомендовал так делать. Причём совершенно зря. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 17:17 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, да в новых проектах можно и писать по новому. Но вот с унаследованными как быть ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 17:28 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Симонов Денис вот это и плохо. Большинство программ на Delphi открывают RO RC и не парятся. Таким образом, можно получать недофетченный курсор и дофетчивать когда потребуется, при этом сборка мусора не удерживается. И какое время живет такой курсор? Я так понимаю, что это клиентское приложение, то есть максимум - рабочий день? Да и то пользователь наверняка обновляет данные, в результате чего курсор переоткрывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2015, 19:38 |
|
Проталкивание внешней сортировки
|
|||
---|---|---|---|
#18+
Симонов ДенисА нельзя ли тоже самое проделать для внутренних джойнов? в текущем коде нельзя, увы. Сейчас сортировка проталкивается для еще неоптимизированного джойна, который для outer априори не изменится, а вот для inner очень даже может. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2015, 12:46 |
|
|
start [/forum/topic.php?fid=40&msg=38994161&tid=1562754]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 271ms |
total: | 406ms |
0 / 0 |