v8: Запрос в параметрах виртуальной таблицы #649972


#0 by xLokkIx
Листал книгу и увидел рекомендации использовать по масимуму параметры виртуальной таблицы вместо левых соединений. Рекомендация привела в тупик (никогда так не делал). Провел два эксперимента:    Документ.РасходнаяНакладная.Номенклатура КАК РасходнаяНакладнаяНоменклатура ИЗ    РегистрНакопления.ОстаткиНоменклатуры.Остатки(                    р КАК р)) КАК ОстаткиНоменклатурыОстатки 2. Как всегда сам делал ВЫБРАТЬ    РасходнаяНакладнаяНоменклатура.Номенклатура,    ОстаткиНоменклатурыОстатки.КоличествоОстаток ИЗ Или я не правильно понял рекомендацию (время выполнения запросов вообще не сравнимо-второй выполняется мгновенно), или лучше книжки не листать?
#1 by Fragster
файловая? клиент серверная? что говорит профайлер, если клиент-серверная? есть ли индекс по номенклатуре?
#2 by H A D G E H O G s
Я знал, что ты придешь.
#3 by Classic
Результаты разные будут
#4 by H A D G E H O G s
Почему товарищи всегда вторым выполняют им выгодный запрос?
#5 by Fragster
ну, и это тоже :)
#6 by Fragster
вот бордо шато бельвью - это хорошее вино?
#7 by DrShad
а где запрос в параметрах?
#8 by H A D G E H O G s
И база скорее всего мелкая.
#9 by Fragster
лично по мне, по результатам измерений 2003 - 2008 годов - почему-о получается, что четные так себе, а нечетные - ничего
#10 by H A D G E H O G s
Я теоретик, я веду учет по слухам, а конечный продукт вообще не видел в глаза.
#11 by H A D G E H O G s
Наверное ты мне поможешь. Оцени тяжесть беды ПриПолученииДанных.
#12 by xLokkIx
клиент-серверная индексы обязательно. добавил в запрос создания временной таблицы. стало лучше. но все равно медленнее. Да и пример простой. А если связь по нескольким полям? В параметрах будут несколько запросов?
#13 by H A D G E H O G s
Выбери остатки на недельку раньше, чем текущая дата.
#14 by H A D G E H O G s
Ну и скажи результат ВЫБРАТЬ    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТоварыНаСкладахОстатки.Номенклатура) КАК Номенклатура ИЗ    РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ТоварыНаСкладахОстатки
#15 by Fragster
индекс у регистра
#16 by Classic
Тебя не смущает, что 1 и 2 немного разные запросы? С разным результатом
#17 by xLokkIx
Согласен. Сделаю замер заново. Вопрос тогда по другому поставлю. Нужен ли запрос в параметрах чтобы увеличить скорость, при левом соединении. Вроде как выборка для соединения меньше, но параметр с "В (выбрать" тоже не быстрый.
#18 by DrShad
все зависит от того насколько сократится выборка
#19 by xLokkIx
р КАК р        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( Теперь на выходе одно и то же. А вот скорость не подтверждает высказывание про необходимость использования параметров виртуальных таблиц в таком виде
#20 by DrShad
был случай - в левой таблице 6 записей, а в правой 13000 - ограничение правой таблицы через параметры, т.е. сведение к 12 записям и результат выполнения в 300 раз быстрее!
#21 by Classic
Ну чисто теоретически во вторую таблицу при левом соединении передаются ограничения первого. Просто не всегда надо ограничивать только первой таблицей. Иногда есть другие ограничители.
#22 by DrShad
а для чего тут вообще соединение?
#23 by Fragster
чтобы результаты были одинаковые
#24 by Classic
Правая была подзапросом или ДТ?
#25 by xLokkIx
виртуальная таблица остатков содержит 14630 записей (в разрезе только по номенклатуре) в документе 10 различных номенклатур
#26 by DrShad
правая была срезом последних к примеру, но без отбора
#27 by DrShad
у тебя правая таблица сколько записей стала?
#28 by xLokkIx
Вопрос поставил меня в тупик. Логически такого не должно быть (постоянно используемые таблицы и без индексов). Но я упал под стол - в РН не было индекса... А этой конфе (на которой проводил эксперимент) уже много много лет и люди работают :-)
#29 by etc
. Учти что львиную долю времени занимает создание временной таблицы (в tempeh)
#30 by DrShad
эксперименты нужно проводить на типовых демо базах
#31 by xLokkIx
остатки с фильтром по идее должны содержать 10 строк (вместо 14630) вот я про то же. нужно ли такое ограничение? переиндексировал. теперь сложно сравнивать - одинаково быстро.
#32 by etc
Вот если в первом запросе написать ВЫБРАТЬ    ОстаткиНоменклатурыОстатки.Номенклатура,    ОстаткиНоменклатурыОстатки.КоличествоОстаток ИЗ    РегистрНакопления.ОстаткиНоменклатуры.Остатки(            , ГДЕ Ссылка = &Ссылка)) КАК ОстаткиНоменклатурыОстатки То он будет вне конкуренции
#33 by DrShad
[остатки с фильтром по идее должны содержать 10 строк (вместо 14630)] спасибо, поржал это если нет других измерений
#34 by DrShad
именно это и имелось ввиду об использовании запросов в параметрах вирт таблиц
#35 by Fragster
там будет <= 10 строк
#36 by xLokkIx
не совсем понял, я разве неправильно посчитал? как их может быть больше, когда на них наложено ограничение из документа (10 разных номенклатур)
#37 by Classic
Оно имеет ввиду, что таблица остатков имеет вид НОменклатура  Склад Остаток Ном1          Ск1     1 Ном1          Ск2     2
#38 by xLokkIx
результат замера: с запросом в параметрах на 0.01 секунду медленнее. Но боюсь про это говорить не стоит, могла луна светить в это время по другому
#39 by DrShad
именно
#40 by Classic
Но если ты будешь юзать Остатки, то у тебя автогруппировка работать будет
#41 by Fragster
если не выбирать второе измерение, то оно само свернется
#42 by xLokkIx
так мы говорим о виртуальной таблице с одним выбранным измерением.
#43 by Classic
Без скобок разве тоже свернется? Я просто невкурсе :)
#44 by DrShad
где!?
#45 by xLokkIx
ИЗ    РегистрНакопления.ОстаткиНоменклатуры.Остатки(            ,
#46 by DrShad
ты мало того что сотворил ВТ, так еще и соединение и пытаешься этот зоопарк сравнивать
#47 by DrShad
это выбранное или отфильтрованное!?
#48 by etc
понятно но если параметры предварительно во временную таблицу запихивать то это только ухудшает ситуацию
#49 by Classic
В общем случае не факт. Если ограничение надо использовать во многих местах, то выигрыш от использования ВТ может оказаться выше проигрыша от записи этой ВТ
#50 by DrShad
но сейчас холивар на конкретном примере :)))
#51 by xLokkIx
Задача: Определить текущие остатки для контроля отрицательных. Иначе как? Я должен сделать левое соединение табличной части документа и остатков. Вопрос изначально в том, нужно ли в виртуальной таблице в параметры ставить дополнительное условие. а сравниваю один и тот же запрос, но с указанием условия в параметрах ВТ и без. Запрос вроде как логически корректный
#52 by etc
это да, но нечасто бывает когда ее используют более 1 разв
#53 by xLokkIx
не понимаю вопроса.
#54 by DrShad
но оценки результатам даешь красноречивые :))))
#55 by Classic
Ты просто приводишь конкретный пример для общего правила. Если ты делаешь ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Ч.Остатки ПО ...... То в общем случае ограничение на поле, которое учавствует в ПО ставить не надо. А вот если ты сделаешь ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ИЗ РегистрНакопления.Ч.Остатки ) ПО..... То в эти остатки надо пихать ограничение
#56 by xLokkIx
а может мы просто друг друга не поняли пример из книги, который и заставил меня задуматься (да и задача от туда же)
#57 by xLokkIx
я и не пихал ограничение при левом соединении. А в книге рекомендуют так делать...
#58 by Fragster
как раз с виртуальными таблицами не совсем так
#59 by Classic
?
#60 by Fragster
виртуальные таблицы - это на самом деле вложенные запросы, причем достаточно сложные. и к кускам этих вложенных запросов применяются условия в скобках
#61 by DrShad
а зачем там вообще соединение?
#62 by Fragster
+ если оптимизатор сообразит, то прокинет параметры соединения внутрь для отбора. но это чаще не так.
#63 by Classic
Ну это понятно. Просто у меня ограничение на правую ВТ никогда не давало прироста скорости. В отличии от ограничения на "явный" вложенный запрос. Могу конечно ошибаться
#64 by Classic
+ т.е. ДТ. Динамическая таблица, чтоб не путать с временной таблицей :)
#65 by xLokkIx
в запросе без ограничения в параметрах соединение нужно. во втором запросе (ограничение в параметрах) соединение во первых для чистоты эксперимента, а во вторых именно такая реализация в книге заставила задуматься (и она рекомендовалась )
#66 by DrShad
что за книга-то такая!? я таких рекомендаций не встречал
#67 by Classic
Если резюмировать, то Фрагстер прав в Передача отбора через ЛЕВОЕ СОЕДИНЕНИЕ целиком и полностью на совести оптимизатора. Задание отбора напрямую - гарантия уменьшения правой таблицы. Так что лучше задавай в параметрах :)
#68 by Classic
Сори в
#69 by xLokkIx
попробовал. непонятно почему, но он на много медленнее работает чем с временной таблицей. листаю практическое пособие разработчика 8.2 М.Г. Радченко. Глава "оптимизация проведения документа..."
#70 by DrShad
год выпуска и номер издания
#71 by DrShad
+ номер страницы, где такой пример с листингом
#72 by xLokkIx
#73 by DrShad
акуеть
#74 by DrShad
сорри, но у меня такой фолиант не сохранился
#75 by xLokkIx
а вопрос остался. зачем это нужно и нужно ли. получается нужно только для перестраховки от возможной недооптимизации
#76 by DrShad
любые плюшки хороши там где они нужны
#77 by NcSteel
Левое соединение - зло, оператор "В" тоже зло ))). Использовать надо "Внутреннее соединение" ))
#78 by xLokkIx
С удовольствием, если логика позволяет
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С