Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги. Прошу помощи. Как называется поведение SQL сервера, описанное ниже, и где можно почитать об этом подробнее? Если коротко - в плане запросе появляется дополнительное условие, которого нет в LEFT JOIN изначально. Теперь подробнее. Есть запрос в динамическом списке 1С, который выбирает документы и добавляет обороты по взаиморасчетам. Обороты добавляются левым соединением. На языке 1С это выглядит так: ВЫБРАТЬ ДокументЗаказПоставщику.Ссылка КАК Ссылка, ВЫБОР КОГДА ДокументЗаказПоставщику.Проведен И ДокументЗаказПоставщику.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовПоставщикам.НеСогласован) И ДокументЗаказПоставщику.СуммаДокумента > 0 ТОГДА ВЫБОР КОГДА ЕСТЬNULL(РасчетыСПоставщикамиОстатки.СуммаКонечныйОстаток, 0) > 0 ТОГДА ВЫРАЗИТЬ((ЕСТЬNULL(РасчетыСПоставщикамиОстатки.СуммаКонечныйОстаток, 0) * 100 / ДокументЗаказПоставщику.СуммаДокумента) КАК ЧИСЛО(15, 0)) ИНАЧЕ ВЫРАЗИТЬ((ЕСТЬNULL(-РасчетыСПоставщикамиОстатки.СуммаКонечныйОстаток, 0) * 100 / ДокументЗаказПоставщику.СуммаДокумента) КАК ЧИСЛО(15, 0)) КОНЕЦ ИНАЧЕ 0 КОНЕЦ КАК ПроцентДолга ИЗ Документ.ЗаказПоставщику КАК ДокументЗаказПоставщику ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РасчетыСПоставщиками.ОстаткиИОбороты КАК РасчетыСПоставщикамиОстатки ПО ДокументЗаказПоставщику.Ссылка = РасчетыСПоставщикамиОстатки.ЗаказПоставщику На SQL сервер уходит примерно такой запрос: Код: 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. Ниже - один узел плана запроса. В нем появилось условие [T5].[_Fld12108_RRRef]=[TGNUT11].[dbo].[_Document231].[_IDRRef] as [T1].[_IDRRef], которого нет в исходном тексте. Код: sql 1. 2. 3. 4. 5. 6. 7. PS. В Postgres такого не происходит и, как следствие, запрос выполняется от 5 до 10 раз дольше на этой базе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 07:02 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
Что может сделать сервер с запросом, написанным больным сознанием? ЗАЧЕМ?!! там LEFT JOIN? ГДЕ?!! в запросе [T5]? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 07:15 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
nicxxxНа SQL сервер уходит примерно такой запрос:Надо не "примерно", а скопировать. nicxxxВ нем появилось условие [T5].[_Fld12108_RRRef]=[TGNUT11].[dbo].[_Document231].[_IDRRef] as [T1].[_IDRRef], которого нет в исходном тексте.Скорее всего, это условие "AND T1._idrref = T3.fld12108_rrref", но это только предположение. Лучше выложите в формате sqlplan, тогда всё прояснится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 13:49 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
nicxxxНа SQL сервер уходит примерно такой запрос:И зачем в запросе LEFT JOIN, если ни одного поля от джойна не используется??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 13:50 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
авторИ зачем в запросе LEFT JOIN, если ни одного поля от джойна не используется??? Там все используется. Я лишь выделил ключевой момент, непосредственно относящийся к вопросу. авторНадо не "примерно", а скопировать. Вам действительно интересно читать 1500 строк запроса? Не имея под рукой исходной БД. авторСкорее всего, это условие "AND T1._idrref = T3.fld12108_rrref", но это только предположение. Да, так может показаться на первый взгляд, но это условие соединения, а не выборки из Т3. Логично предположить, что MSSQL знает, что будет происходить с Т3 и заранее ограничивает выборку из нее только строками, входящими в Т1. Однако явно в исходном запросе не указано. В Postgres такого условия не появляется. Файлы приложил, все в одном архиве. В плане MSSQL можно посмотреть node 49. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 05:34 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
nicxxxВам действительно интересно читать 1500 строк запроса? Не имея под рукой исходной БД. Шо тут поделаешь? Телепузики нонича повывелись. ЗЫ. Читать я, канешно, ничего не буду. Занафига мне это. Но совет бесплатный дам: вместо изучения громадья планов запроса - напиши этот запрос "по-человечески". ЗЗЫ. Ну и ежели постгресс тебя устраивает - зачем ты сюда приперся? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 06:00 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
nicxxx, Философствования на тему какой хороший PG и плохой MSSQL - бесполезная трата времени. Лучше поразмышляйте над статистикой ожиданий. Ее можно посмотреть в свойствах корневого элемента плана. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 10:04 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
nicxxxНиже - один узел плана запроса. В нем появилось условие [T5].[_Fld12108_RRRef]=[TGNUT11].[dbo].[_Document231].[_IDRRef] as [T1].[_IDRRef], которого нет в исходном тексте. Это не оно разве: T1._idrref = T3.fld12108_rrref ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 10:06 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
nicxxxPS. В Postgres такого не происходит и, как следствие, запрос выполняется от 5 до 10 раз дольше на этой базе. Почему ты решил что причина медленного выполнения в sql именно в этой строчке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 10:07 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
vi0, Потому что Postgres выбирает 220 000 строк, а MSSQL - 34. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 13:29 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
nicxxxавторСкорее всего, это условие "AND T1._idrref = T3.fld12108_rrref", но это только предположение. Да, так может показаться на первый взгляд, но это условие соединения, а не выборки из Т3. Логично предположить, что MSSQL знает, что будет происходить с Т3 и заранее ограничивает выборку из нее только строками, входящими в Т1. Однако явно в исходном запросе не указано.Ну да, вот в тексте запроса видно, что это T1._idrref = T3.fld12108_rrref. "Условие соединения" тождественно "условие выборки". Что такое соединение, как не выборка записей, удовлетворяющих условию соединения? MSSQL как то преобразует запрос, да. nicxxxВ Postgres такого условия не появляется.Ну, они по разному преобразуют. В данном случае MSSQL ошибся, и запрос стал тормозить. Можно попробовать обновить статистику, поставить хинты, переписать запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 21:40 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
alexeyvgВ данном случае MSSQL ошибся, и запрос стал тормозить. Можно попробовать обновить статистику, поставить хинты, переписать запрос.Ну ТС же план показал. Актуальный. Там нечему тормозить. Зато есть это: CPUTime - 55, ElapsedTime - 1464 WaitStats: PAGEIOLATCH_SH - 1412 У него с дисковой проблемы или памяти мало. Или и то, и другое. А он все с PG сравнивает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 22:00 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
invmalexeyvgВ данном случае MSSQL ошибся, и запрос стал тормозить. Можно попробовать обновить статистику, поставить хинты, переписать запрос.Ну ТС же план показал. Актуальный. Там нечему тормозить. Зато есть это: CPUTime - 55, ElapsedTime - 1464 WaitStats: PAGEIOLATCH_SH - 1412 У него с дисковой проблемы или памяти мало. Или и то, и другое. А он все с PG сравнивает...Да, я уж в детали не вникал, может, и не тормозит. Потом, может, на Постгресе CPU у него 2 мс, а не 55? Я в принципе написал о том, как к этому вопросу подходить: 1) Любая СУБД будет выполнять запрос не так, как он написан пользователем на SQL, просто потому, что SQL - функциональный язык. 2) Если запрос выполняется слишком медленно (что тоже надо суметь определить), нужно изучать конкретную причину, и пытаться её устранить. При этом выполнение "не так, как написано на SQL", разумеется, не является такой причиной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 00:48 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
alexeyvg, Вы неверно прочитали мой первый пост. Тормозит не MSSQL, а Postgres. MSSQL не ошибся, он заранее исключил из присоединяемой таблицы лишние записи, которых нет в Т1. Результирующая выборка составляет в среднем около 100 строк. В отличие от него, Postgres такой фильтрации не делает, выбирает 200 000 строк. автор"Условие соединения" тождественно "условие выборки". Это с какого момента? У меня не INNER JOIN. В присоединяемом запросе, который начинается здесь: Код: sql 1. 2. 3. нет секции WHERE вообще. А в плане запрсое появился указанный ранее предикат Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 05:47 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
invm, авторУ него с дисковой проблемы или памяти мало. Или и то, и другое. А он все с PG сравнивает... Проблемы с памятью или дисками тут роли не играют. Замеры с ноутбука, шпиндель 5400, SQL серверу отдано 4GB памяти. Проблема в том, что Postgres ведет себя отличным от MSSQL образом. Прочитайте мой первый пост еще раз. Я прошу не запрос ускорять, а показать, где описано такое поведение MSSQL - авторПрошу помощи. Как называется поведение SQL сервера, описанное ниже, и где можно почитать об этом подробнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 05:55 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
alexeyvg, вы какой-то софистикой занимаетесь. 2) Если запрос выполняется слишком медленно (что тоже надо суметь определить), нужно изучать конкретную причину, и пытаться её устранить. При этом выполнение "не так, как написано на SQL", разумеется, не является такой причиной. Прочитайте мой первый пост еще раз. Я запустил запрос на PG и получил время 10 секунд. Сравнил с MSSQL - получил там 1 секунду. Посмотрел, чем отличаются планы, увидел что в присоединяемом подзапросе разное количество строк и нашел, почему так. Спросил, где можно почитать про это поведение оптимизатора MSSQL. Про что, что запрос выполняется слишком медленно и как это устранить, я не писал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 06:01 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
nicxxxТормозит не MSSQL, а Postgres. MSSQL не ошибся, он заранее исключил из присоединяемой таблицы лишние записи, которых нет в Т1. Аффтар просто глумится над здешними аборигенами. Оказывается проблема в том, что MS SQL обскакал постгресс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 06:10 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
nicxxxавторПрошу помощи. Как называется поведение SQL сервера, описанное ниже, и где можно почитать об этом подробнее? Это называется "проталкивание предиката" (predicate pushdown) У postgre тоже что-то такое есть, копайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 06:42 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
Павел Воронцовnicxxxпропущено... Это называется "проталкивание предиката" (predicate pushdown) У postgre тоже что-то такое есть, копайте. Большое спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 07:22 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
nicxxxВы неверно прочитали мой первый пост. Тормозит не MSSQL, а Postgres.А, ну ок, значит, он всё правильно сделал. nicxxxПрочитайте мой первый пост еще раз. Я запустил запрос на PG и получил время 10 секунд. Сравнил с MSSQL - получил там 1 секунду. Посмотрел, чем отличаются планы, увидел что в присоединяемом подзапросе разное количество строк и нашел, почему так. Спросил, где можно почитать про это поведение оптимизатора MSSQL. Про что, что запрос выполняется слишком медленно и как это устранить, я не писал.Ну, я ваш пост понял по другому: "MSSQL извратил мой запрос, выполняет его неправильно, поэтому там медленнее. Как мне сделать так, что бы было как в Постгресс?" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 09:44 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
alexeyvg ]Ну, я ваш пост понял по другому: "MSSQL извратил мой запрос, выполняет его неправильно, поэтому там медленнее. Как мне сделать так, что бы было как в Постгресс?" тут все именно так и поняли тс)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 09:59 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
StarikNavyalexeyvg ]Ну, я ваш пост понял по другому: "MSSQL извратил мой запрос, выполняет его неправильно, поэтому там медленнее. Как мне сделать так, что бы было как в Постгресс?" тут все именно так и поняли тс))Ага, я вижу по комментариям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 10:00 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
nicxxxСпросил, где можно почитать про это поведение оптимизатора MSSQL.Помню, что он всегда так делал; в общем, это же очевидное поведение какого-никакого оптимизатора. Вот, выше написали, что и у Постгреса так же. Но как называется, не знал :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 10:06 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
alexeyvg, А вот и не так же у Постгресса и это удручает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 11:14 |
|
||
|
Упреждающая или неявная фильтрация LEFT JOIN
|
|||
|---|---|---|---|
|
#18+
nicxxxalexeyvg, А вот и не так же у Постгресса и это удручает. Аффторь, очевидно, не догадывается, что "протолкнуть предикат" можно и врукопашную. Тупо написав правильно запрос. ЗЫ. Любая "оптимизация" - это внутреннее дело конкретной реализации сервера. Оракал, говорят, тоже кое-что делает быстрее MS SQL. Се ля ви. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 13:15 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39796441&tid=1688005]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
129ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 434ms |

| 0 / 0 |
