|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
Добрый денечек! Сам я 1С-ник, но SQL приходится пользовать частенько. Столкнулся с неоптимальным выполнением запроса скулем. Суть запроса: в 1С 7.7 надо выбрать подчиненные документы определенного вида. И родился такой запрос: Код: 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.
Вообще родился он не совсем в таком виде - был изначально один Select. Но когда выяснилось, что условие Док_вид=49116 сильно влияет на скорость, запрос превратился в такой. Суть проблемы: если Док_вид=49116 запрос выполняется 1000 мсек, если Док_вид=49117, то запрос выполняется 15 мсек. Получается запрос судя по плану запросов пытается наложить фильтр на поле IDDOCDEF таблицы _1SJOURN. Индексов подходящих по нему нет. Но почему он накладывает этот фильтр, если условие находится во внешнем селекте, разве внутренний селект не должен отработать самостоятельно, а потом сработать внешний по результатам внутреннего? Внутренний селект выдает не более 10 строк и внешнему для фильтрации по полю IDDOCDEF (Док_вид) индексы вообще не нужны были бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 16:29 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
WPuh, вложенные запросы разворачиваются в единый план выполнения вместе с основным запросом (но вы и так это должны были видеть в плане). Так что никакой гарантии порядка выполнения нет - операции будут выполняться так, как СУБД посчитает нужным. Приложите планы (и быстрый, и медленный) - так понятнее будет, за что бороться ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 16:54 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
WPuh, Планы нужно показывать, а не пересказывать. Желательно актуальные и в формате sqlplan, а не картинкой. Попробуйте так Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 17:15 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
0wl, спасибо. Предполагал, что такой ответ может быть. Очень жаль - хотелось все фильтры в запросе наложить. Теперь придется накладывать на стороне клиента, либо внутренний селект помещать в отдельную таблицу и далее выбирать из нее. Планы запросов медленный и быстрый ничем не отличаются - сравнил два xml файла запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 17:21 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
invm, суперское решение. Помогло!! Спасибо огромное! Про такую фичу я не знал. Можно считать вопрос закрытым. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 17:26 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
WPuh, только это костыль. Будьте проще. Проще код, проще отлаживать. Проще код, оптимизатору проще выбрать оптимальный план. Создайте временную таблицу или табличную переменную. В неё записывайте предварительную инфу, которая начитывается внутренним запросом. Затем уже из этой временной таблицы/переменной читайте то, что нужно основным селектом. * Если промежуточных данных много (десятки тысяч записей и более), то создавайте временную таблицу. Если наоборот мало (не более нескольких тысяч), то делайте через переменную. ** Так же можно в зависимости от кол-ва данных поэкспериментировать с индексами по искомым полям. Такое решение позволит оптимизировать каждый запрос по шагам и будет более стабильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 18:15 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
Кесарь, спасибо за подсказку про табличную переменную! Не знал о таком покопаю в эту сторону. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 18:30 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
Кесарь Создайте временную таблицу или табличную переменную. В данном конкретном случае они не нужны. Совсем. Будет просто лишняя трата ресурсов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 19:39 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
invm Кесарь Создайте временную таблицу или табличную переменную. В данном конкретном случае они не нужны. Совсем. Будет просто лишняя трата ресурсов. На слабо нагруженном сервере это не так важно. А на высоко нагруженном, как показывает практика, разделение на отдельные блоки даёт стабильность и управляемость. Потому что оптимизатор успевает строить правильные планы. И без костылей. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 19:52 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
Кесарь И без костылей. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 20:29 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
invm Кесарь И без костылей. Код: sql 1.
, я думаю. Если число записей, которые должен вернуть запрос, больше миллиона, то нехорошо получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 21:39 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
Ну top (9223372036854775807) напишите, столько точно не вернет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 21:45 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
DaniilSeryi я думаю. Если число записей, которые должен вернуть запрос, больше миллиона, то нехорошо получится. WPuh Внутренний селект выдает не более 10 строк ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 21:47 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
WPuh, Пачка вопросов. 1. А покрывающие индексы нельзя создать принципиально? 2. Поле Код: sql 1.
в подзапросе принципиально не используется во внешнем запросе? 3. Смысл дублировать поле Код: sql 1.
во внешнем запросе? Код: sql 1. 2.
4. А если убрать внешний и внутренний подзапросы и объединить в один? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 21:55 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
DaniilSeryi, автор1. А покрывающие индексы нельзя создать принципиально? На мой взгляд в данной ситуации это костыль для решение проблемы неоптимального плана запроса. автор4. А если убрать внешний и внутренний подзапросы и объединить в один? тогда точно без индекса не обойтись. А так Top 1000 решает проблему при использовании вложенного запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 09:45 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
WPuh, На днях аналогичная проблема была при запросе на ~3 млн строк (для куба). SELECT TOP 1 000 000 - работал мгновенно SELECT TOP 5 000 000 - вешал намертво, с запасом... Пришлось накостылять серверу Join Hints (LOOP | HASH | MERGE | REMOTE) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 09:53 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
WPuh DaniilSeryi, автор1. А покрывающие индексы нельзя создать принципиально? На мой взгляд в данной ситуации это костыль для решение проблемы неоптимального плана запроса. автор4. А если убрать внешний и внутренний подзапросы и объединить в один? тогда точно без индекса не обойтись. А так Top 1000 решает проблему при использовании вложенного запроса. Открою Вам страшную тайну - это не костыль, а основное средство ускорения запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 10:49 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
DaniilSeryi, костыль - это всё, что является эксплойтом системы. top (1М) - это очевидный эксплойт. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 11:58 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
Владислав Колосов top (1М) - это очевидный эксплойт. Сторонникам "костыльности" стоило бы разобраться для чего и почему применено предложение top(), а потом уже выносить суждение. А применено оно для устранения проблемы ТС, а именно проталкивания вниз предиката (Доки.Док_вид=49116) AND (Доки.ISMARK=0) 100000 - для предотвращения искажения плана из-за row goal ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 14:55 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
invm, а мы не говорим, что это не решает проблему. Решает. Но это костыль. Там ещё кстати вызывает вопросы nolock. Чем продиктовано использование подсказки? Это реальное свойство бизнес-процесса или очередной костыль, чтобы хоть как-то работало? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 16:43 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
Кесарь Но это костыль. Только никто не может внятно объяснить почему. Уже и до эксплойтов дошли... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 16:51 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
invm Кесарь Но это костыль. Только никто не может внятно объяснить почему. Уже и до эксплойтов дошли... Да потому что любые точные указания там, где возможны варианты, это костыль. В одним местах в ходу условия по доменным учёткам сотрудников прямо в коде (да-да, именно так), в других хинты, в третьих вот топ миллион. И все полагают, что у них всё норм и так и надо. Но это всё костыли (и гвозди, по учёткам - это конкретно гвозди, а хинты и топ-миллионы - это костыли). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 16:57 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
invm, разумеется эксплойт, поскольку это манипуляция с механизмом формирования плана. Я не пишу, что это плохо, сам механизм самостоятельно решение, подобное результату с top() не принял, а мы достигли желаемого результата. Поведение это не инвариантно, оно зависит от типа и версии SQL сервера. Не думаю, что на MySQL подобный трюк сработал бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 17:32 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
Кесарь, вот насчет хинтов не соглашусь, поскольку это документированное средство воздействия на план запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 17:34 |
|
Кривой план запроса SQL. Можно ли исправить?
|
|||
---|---|---|---|
#18+
Кесарь Да потому что любые точные указания там, где возможны варианты, это костыль. Если следовать вешей же логике, то предложение воспользоваться табличной переменной (временной таблицей) - такой же костыль. И, например, любые средства фиксации плана выполнения - костыль. Потому что все перечисленное относится к "точные указания там, где возможны варианты". ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 17:45 |
|
|
start [/forum/topic.php?fid=46&fpage=24&tid=1684675]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 138ms |
0 / 0 |