Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Упреждающая или неявная фильтрация LEFT JOIN / 25 сообщений из 27, страница 1 из 2
03.04.2019, 07:02
    #39795473
nicxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упреждающая или неявная фильтрация LEFT JOIN
Добрый день, коллеги.
Прошу помощи. Как называется поведение 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
03.04.2019, 07:15
    #39795477
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упреждающая или неявная фильтрация LEFT JOIN
Что может сделать сервер с запросом, написанным больным сознанием?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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


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