powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Упреждающая или неявная фильтрация LEFT JOIN
25 сообщений из 27, страница 1 из 2
Упреждающая или неявная фильтрация LEFT JOIN
    #39795473
nicxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, коллеги.
Прошу помощи. Как называется поведение 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.
SELECT TOP 45 T1._idrref, 
              T1._marked, 
              T1._number, 
              T1._date_time, 
              T1._posted
FROM
	dbo._document231 T1 WITH(nolock) 
		LEFT OUTER JOIN 
		(
		SELECT 
			T4.fld12108_type  AS Fld12108_TYPE, 
            T4.fld12108_rtref AS Fld12108_RTRef, 
            T4.fld12108_rrref  AS Fld12108_RRRef 
            Cast(Sum(T4.fld12112receipt_) AS NUMERIC(27, 2)) AS Fld12112Receipt_,
			Cast(Sum(T4.fld12112expense_) AS NUMERIC(27, 2)) AS Fld12112Expense_
		FROM
			dbo._accumrg12106 T4 WITH(nolock)
		GROUP BY
			T4.fld12108_type,
            T4.fld12108_rtref,
            T4.fld12108_rrref
		) T3 ON 
			( 0x08 = T3.fld12108_type 
				AND 0x000000E7 = T3.fld12108_rtref 
				AND T1._idrref = T3.fld12108_rrref )  



Ниже - один узел плана запроса. В нем появилось условие [T5].[_Fld12108_RRRef]=[TGNUT11].[dbo].[_Document231].[_IDRRef] as [T1].[_IDRRef], которого нет в исходном тексте.

Код: sql
1.
2.
3.
4.
5.
6.
7.
OBJECT:([TGNUT11].[dbo].[_AccumRg12106].[_AccumRg12106_ByDims12120_RTRN] AS [T5]), 
SEEK:(
[T5].[_Fld601]=[@P82] AND -- в этой базе всегда 0 (ноль)
[T5].[_Fld12108_TYPE]=0x08 AND 
[T5].[_Fld12108_RTRef]=0x000000E7 AND 
[T5].[_Fld12108_RRRef]=[TGNUT11].[dbo].[_Document231].[_IDRRef] as [T1].[_IDRRef]
) ORDERED FORWARD 



PS. В Postgres такого не происходит и, как следствие, запрос выполняется от 5 до 10 раз дольше на этой базе.
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39795477
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что может сделать сервер с запросом, написанным больным сознанием?

ЗАЧЕМ?!! там LEFT JOIN?
ГДЕ?!! в запросе [T5]?
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39795800
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicxxxНа SQL сервер уходит примерно такой запрос:Надо не "примерно", а скопировать.
nicxxxВ нем появилось условие [T5].[_Fld12108_RRRef]=[TGNUT11].[dbo].[_Document231].[_IDRRef] as [T1].[_IDRRef], которого нет в исходном тексте.Скорее всего, это условие "AND T1._idrref = T3.fld12108_rrref", но это только предположение.

Лучше выложите в формате sqlplan, тогда всё прояснится.
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39795801
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicxxxНа SQL сервер уходит примерно такой запрос:И зачем в запросе LEFT JOIN, если ни одного поля от джойна не используется???
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796062
nicxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторИ зачем в запросе LEFT JOIN, если ни одного поля от джойна не используется???
Там все используется. Я лишь выделил ключевой момент, непосредственно относящийся к вопросу.
авторНадо не "примерно", а скопировать.
Вам действительно интересно читать 1500 строк запроса? Не имея под рукой исходной БД.
авторСкорее всего, это условие "AND T1._idrref = T3.fld12108_rrref", но это только предположение.
Да, так может показаться на первый взгляд, но это условие соединения, а не выборки из Т3. Логично предположить, что MSSQL знает, что будет происходить с Т3 и заранее ограничивает выборку из нее только строками, входящими в Т1. Однако явно в исходном запросе не указано.
В Postgres такого условия не появляется.
Файлы приложил, все в одном архиве. В плане MSSQL можно посмотреть node 49.
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796063
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicxxxВам действительно интересно читать 1500 строк запроса? Не имея под рукой исходной БД.

Шо тут поделаешь? Телепузики нонича повывелись.

ЗЫ. Читать я, канешно, ничего не буду. Занафига мне это.
Но совет бесплатный дам: вместо изучения громадья планов запроса - напиши этот запрос "по-человечески".

ЗЗЫ. Ну и ежели постгресс тебя устраивает - зачем ты сюда приперся?
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796179
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicxxx,

Философствования на тему какой хороший PG и плохой MSSQL - бесполезная трата времени.
Лучше поразмышляйте над статистикой ожиданий. Ее можно посмотреть в свойствах корневого элемента плана.
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796184
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicxxxНиже - один узел плана запроса. В нем появилось условие [T5].[_Fld12108_RRRef]=[TGNUT11].[dbo].[_Document231].[_IDRRef] as [T1].[_IDRRef], которого нет в исходном тексте.
Это не оно разве: T1._idrref = T3.fld12108_rrref
?
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796186
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicxxxPS. В Postgres такого не происходит и, как следствие, запрос выполняется от 5 до 10 раз дольше на этой базе.
Почему ты решил что причина медленного выполнения в sql именно в этой строчке?
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796441
nicxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vi0,

Потому что Postgres выбирает 220 000 строк, а MSSQL - 34.
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796818
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicxxxавторСкорее всего, это условие "AND T1._idrref = T3.fld12108_rrref", но это только предположение.
Да, так может показаться на первый взгляд, но это условие соединения, а не выборки из Т3. Логично предположить, что MSSQL знает, что будет происходить с Т3 и заранее ограничивает выборку из нее только строками, входящими в Т1. Однако явно в исходном запросе не указано.Ну да, вот в тексте запроса видно, что это T1._idrref = T3.fld12108_rrref.

"Условие соединения" тождественно "условие выборки". Что такое соединение, как не выборка записей, удовлетворяющих условию соединения?

MSSQL как то преобразует запрос, да.
nicxxxВ Postgres такого условия не появляется.Ну, они по разному преобразуют.
В данном случае MSSQL ошибся, и запрос стал тормозить.
Можно попробовать обновить статистику, поставить хинты, переписать запрос.
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796827
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgВ данном случае MSSQL ошибся, и запрос стал тормозить.
Можно попробовать обновить статистику, поставить хинты, переписать запрос.Ну ТС же план показал. Актуальный. Там нечему тормозить.

Зато есть это:
CPUTime - 55, ElapsedTime - 1464
WaitStats: PAGEIOLATCH_SH - 1412

У него с дисковой проблемы или памяти мало. Или и то, и другое. А он все с PG сравнивает...
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796870
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmalexeyvgВ данном случае MSSQL ошибся, и запрос стал тормозить.
Можно попробовать обновить статистику, поставить хинты, переписать запрос.Ну ТС же план показал. Актуальный. Там нечему тормозить.

Зато есть это:
CPUTime - 55, ElapsedTime - 1464
WaitStats: PAGEIOLATCH_SH - 1412

У него с дисковой проблемы или памяти мало. Или и то, и другое. А он все с PG сравнивает...Да, я уж в детали не вникал, может, и не тормозит.
Потом, может, на Постгресе CPU у него 2 мс, а не 55?

Я в принципе написал о том, как к этому вопросу подходить:
1) Любая СУБД будет выполнять запрос не так, как он написан пользователем на SQL, просто потому, что SQL - функциональный язык.
2) Если запрос выполняется слишком медленно (что тоже надо суметь определить), нужно изучать конкретную причину, и пытаться её устранить. При этом выполнение "не так, как написано на SQL", разумеется, не является такой причиной.
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796895
nicxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

Вы неверно прочитали мой первый пост. Тормозит не MSSQL, а Postgres. MSSQL не ошибся, он заранее исключил из присоединяемой таблицы лишние записи, которых нет в Т1. Результирующая выборка составляет в среднем около 100 строк. В отличие от него, Postgres такой фильтрации не делает, выбирает 200 000 строк.

автор"Условие соединения" тождественно "условие выборки". Это с какого момента? У меня не INNER JOIN. В присоединяемом запросе, который начинается здесь:
Код: sql
1.
2.
3.
LEFT OUTER JOIN 
		(
		SELECT 


нет секции WHERE вообще. А в плане запрсое появился указанный ранее предикат
Код: sql
1.
[T5].[_Fld12108_RRRef]=[TGNUT11].[dbo].[_Document231].[_IDRRef] as [T1].[_IDRRef]
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796897
nicxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

авторУ него с дисковой проблемы или памяти мало. Или и то, и другое. А он все с PG сравнивает...
Проблемы с памятью или дисками тут роли не играют. Замеры с ноутбука, шпиндель 5400, SQL серверу отдано 4GB памяти.
Проблема в том, что Postgres ведет себя отличным от MSSQL образом. Прочитайте мой первый пост еще раз. Я прошу не запрос ускорять, а показать, где описано такое поведение MSSQL - авторПрошу помощи. Как называется поведение SQL сервера, описанное ниже, и где можно почитать об этом подробнее?
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796898
nicxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg, вы какой-то софистикой занимаетесь.

2) Если запрос выполняется слишком медленно (что тоже надо суметь определить), нужно изучать конкретную причину, и пытаться её устранить. При этом выполнение "не так, как написано на SQL", разумеется, не является такой причиной.

Прочитайте мой первый пост еще раз. Я запустил запрос на PG и получил время 10 секунд. Сравнил с MSSQL - получил там 1 секунду. Посмотрел, чем отличаются планы, увидел что в присоединяемом подзапросе разное количество строк и нашел, почему так. Спросил, где можно почитать про это поведение оптимизатора MSSQL.
Про что, что запрос выполняется слишком медленно и как это устранить, я не писал.
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796899
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicxxxТормозит не MSSQL, а Postgres. MSSQL не ошибся, он заранее исключил из присоединяемой таблицы лишние записи, которых нет в Т1.

Аффтар просто глумится над здешними аборигенами.
Оказывается проблема в том, что MS SQL обскакал постгресс.
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796905
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicxxxавторПрошу помощи. Как называется поведение SQL сервера, описанное ниже, и где можно почитать об этом подробнее?

Это называется "проталкивание предиката" (predicate pushdown) У postgre тоже что-то такое есть, копайте.
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796914
nicxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Воронцовnicxxxпропущено...


Это называется "проталкивание предиката" (predicate pushdown) У postgre тоже что-то такое есть, копайте.
Большое спасибо.
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39796994
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicxxxВы неверно прочитали мой первый пост. Тормозит не MSSQL, а Postgres.А, ну ок, значит, он всё правильно сделал.

nicxxxПрочитайте мой первый пост еще раз. Я запустил запрос на PG и получил время 10 секунд. Сравнил с MSSQL - получил там 1 секунду. Посмотрел, чем отличаются планы, увидел что в присоединяемом подзапросе разное количество строк и нашел, почему так. Спросил, где можно почитать про это поведение оптимизатора MSSQL.
Про что, что запрос выполняется слишком медленно и как это устранить, я не писал.Ну, я ваш пост понял по другому: "MSSQL извратил мой запрос, выполняет его неправильно, поэтому там медленнее. Как мне сделать так, что бы было как в Постгресс?"
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39797008
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg ]Ну, я ваш пост понял по другому: "MSSQL извратил мой запрос, выполняет его неправильно, поэтому там медленнее. Как мне сделать так, что бы было как в Постгресс?"
тут все именно так и поняли тс))
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39797009
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StarikNavyalexeyvg ]Ну, я ваш пост понял по другому: "MSSQL извратил мой запрос, выполняет его неправильно, поэтому там медленнее. Как мне сделать так, что бы было как в Постгресс?"
тут все именно так и поняли тс))Ага, я вижу по комментариям.
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39797016
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicxxxСпросил, где можно почитать про это поведение оптимизатора MSSQL.Помню, что он всегда так делал; в общем, это же очевидное поведение какого-никакого оптимизатора. Вот, выше написали, что и у Постгреса так же. Но как называется, не знал :-(
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39797081
nicxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

А вот и не так же у Постгресса и это удручает.
...
Рейтинг: 0 / 0
Упреждающая или неявная фильтрация LEFT JOIN
    #39797228
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicxxxalexeyvg,
А вот и не так же у Постгресса и это удручает.
Аффторь, очевидно, не догадывается, что "протолкнуть предикат" можно и врукопашную.
Тупо написав правильно запрос.


ЗЫ. Любая "оптимизация" - это внутреннее дело конкретной реализации сервера.
Оракал, говорят, тоже кое-что делает быстрее MS SQL.
Се ля ви.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Упреждающая или неявная фильтрация LEFT JOIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]