Имя: Пароль:
1C
1С v8
v8: Запрос в параметрах виртуальной таблицы
,
0 xLokkIx
 
30.01.13
21:53
Листал книгу и увидел рекомендации использовать по масимуму параметры виртуальной таблицы вместо левых соединений. Рекомендация привела в тупик (никогда так не делал).
Провел два эксперимента:
1. Как рекомендуют
ВЫБРАТЬ
   РасходнаяНакладнаяНоменклатура.Номенклатура
ПОМЕСТИТЬ р
ИЗ
   Документ.РасходнаяНакладная.Номенклатура КАК РасходнаяНакладнаяНоменклатура
ГДЕ
   РасходнаяНакладнаяНоменклатура.Ссылка = &Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ОстаткиНоменклатурыОстатки.Номенклатура,
   ОстаткиНоменклатурыОстатки.КоличествоОстаток
ИЗ
   РегистрНакопления.ОстаткиНоменклатуры.Остатки(
           ,
           Номенклатура В
               (ВЫБРАТЬ РАЗЛИЧНЫЕ
                   р.Номенклатура
               ИЗ
                   р КАК р)) КАК ОстаткиНоменклатурыОстатки
2. Как всегда сам делал
ВЫБРАТЬ
   РасходнаяНакладнаяНоменклатура.Номенклатура,
   ОстаткиНоменклатурыОстатки.КоличествоОстаток
ИЗ
   Документ.РасходнаяНакладная.Номенклатура КАК РасходнаяНакладнаяНоменклатура
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
       ПО РасходнаяНакладнаяНоменклатура.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
ГДЕ
   РасходнаяНакладнаяНоменклатура.Ссылка = &Ссылка

Или я не правильно понял рекомендацию (время выполнения запросов вообще не сравнимо-второй выполняется мгновенно), или лучше книжки не листать?
1 Fragster
 
гуру
30.01.13
21:55
(0) файловая? клиент серверная? что говорит профайлер, если клиент-серверная? есть ли индекс по номенклатуре?
2 H A D G E H O G s
 
30.01.13
21:56
(1) Я знал, что ты придешь.
3 Classic
 
30.01.13
21:56
Результаты разные будут
4 H A D G E H O G s
 
30.01.13
21:56
Почему товарищи всегда вторым выполняют им выгодный запрос?
5 Fragster
 
гуру
30.01.13
21:57
(3) ну, и это тоже :)
6 Fragster
 
гуру
30.01.13
21:58
(2) вот бордо шато бельвью - это хорошее вино?
7 DrShad
 
30.01.13
21:58
а где запрос в параметрах?
8 H A D G E H O G s
 
30.01.13
21:58
И база скорее всего мелкая.
9 Fragster
 
гуру
30.01.13
21:59
(6) лично по мне, по результатам измерений 2003 - 2008 годов - почему-о получается, что четные так себе, а нечетные - ничего
10 H A D G E H O G s
 
30.01.13
21:59
(6) Я теоретик, я веду учет по слухам, а конечный продукт вообще не видел в глаза.
11 H A D G E H O G s
 
30.01.13
22:00
(9) Наверное ты мне поможешь.
Оцени тяжесть беды
v8: Вывести штрих-код в форме списка номенклатуры

ПриПолученииДанных.
12 xLokkIx
 
30.01.13
22:03
клиент-серверная
индексы обязательно.
добавил

ИНДЕКСИРОВАТЬ ПО
   Номенклатура

в запрос создания временной таблицы. стало лучше. но все равно медленнее.
Да и пример простой. А если связь по нескольким полям? В параметрах будут несколько запросов?
13 H A D G E H O G s
 
30.01.13
22:05
(12) Выбери остатки на недельку раньше, чем текущая дата.
14 H A D G E H O G s
 
30.01.13
22:06
Ну и скажи результат

ВЫБРАТЬ
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТоварыНаСкладахОстатки.Номенклатура) КАК Номенклатура
ИЗ
   РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ТоварыНаСкладахОстатки
15 Fragster
 
гуру
30.01.13
22:07
(12) индекс у регистра
16 Classic
 
30.01.13
22:07
(12)
Тебя не смущает, что 1 и 2 немного разные запросы? С разным результатом
17 xLokkIx
 
30.01.13
22:13
(16) Согласен. Сделаю замер заново.
Вопрос тогда по другому поставлю. Нужен ли запрос в параметрах чтобы увеличить скорость, при левом соединении. Вроде как выборка для соединения меньше, но параметр с "В (выбрать" тоже не быстрый.
18 DrShad
 
30.01.13
22:15
(17) все зависит от того насколько сократится выборка
19 xLokkIx
 
30.01.13
22:16
ВЫБРАТЬ РАЗЛИЧНЫЕ
   РасходнаяНакладнаяНоменклатура.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ р
ИЗ
   Документ.РасходнаяНакладная.Номенклатура КАК РасходнаяНакладнаяНоменклатура
ГДЕ
   РасходнаяНакладнаяНоменклатура.Ссылка = &Ссылка

ИНДЕКСИРОВАТЬ ПО
   Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   р.Номенклатура,
   ОстаткиНоменклатурыОстатки.КоличествоОстаток
ИЗ
   р КАК р
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
               &Период,
               Номенклатура В
                   (ВЫБРАТЬ
                       р.Номенклатура
                   ИЗ
                       р КАК р)) КАК ОстаткиНоменклатурыОстатки
       ПО р.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура

Теперь на выходе одно и то же. А вот скорость не подтверждает высказывание про необходимость использования параметров виртуальных таблиц в таком виде
20 DrShad
 
30.01.13
22:17
был случай - в левой таблице 6 записей, а в правой 13000 - ограничение правой таблицы через параметры, т.е. сведение к 12 записям и результат выполнения в 300 раз быстрее!
21 Classic
 
30.01.13
22:17
(17)
Ну чисто теоретически во вторую таблицу при левом соединении передаются ограничения первого. Просто не всегда надо ограничивать только первой таблицей. Иногда есть другие ограничители.
22 DrShad
 
30.01.13
22:18
(19) а для чего тут вообще соединение?
23 Fragster
 
гуру
30.01.13
22:19
(22) чтобы результаты были одинаковые
24 Classic
 
30.01.13
22:20
(20)
Правая была подзапросом или ДТ?
25 xLokkIx
 
30.01.13
22:21
(18)
виртуальная таблица остатков содержит 14630 записей (в разрезе только по номенклатуре)
в документе 10 различных номенклатур
26 DrShad
 
30.01.13
22:22
(24) правая была срезом последних к примеру, но без отбора
27 DrShad
 
30.01.13
22:23
(25) у тебя правая таблица сколько записей стала?
28 xLokkIx
 
30.01.13
22:27
(15) Вопрос поставил меня в тупик. Логически такого не должно быть (постоянно используемые таблицы и без индексов). Но я упал под стол - в РН не было индекса... А этой конфе (на которой проводил эксперимент) уже много много лет и люди работают :-)
29 etc
 
30.01.13
22:27
(0). Учти что львиную долю времени занимает создание временной таблицы (в tempeh)
30 DrShad
 
30.01.13
22:28
(28) эксперименты нужно проводить на типовых демо базах
31 xLokkIx
 
30.01.13
22:31
(27) остатки с фильтром по идее должны содержать 10 строк (вместо 14630)
(29) вот я про то же. нужно ли такое ограничение?
переиндексировал. теперь сложно сравнивать - одинаково быстро.
32 etc
 
30.01.13
22:33
Вот если в первом запросе написать
ВЫБРАТЬ
   ОстаткиНоменклатурыОстатки.Номенклатура,
   ОстаткиНоменклатурыОстатки.КоличествоОстаток
ИЗ
   РегистрНакопления.ОстаткиНоменклатуры.Остатки(
           ,
           Номенклатура В
               (ВЫБРАТЬ РАЗЛИЧНЫЕ
                   Номенклатура
               ИЗ
                   Документ.РасходнаяНакладная.Номенклатура
ГДЕ Ссылка = &Ссылка)) КАК ОстаткиНоменклатурыОстатки

То он будет вне конкуренции
33 DrShad
 
30.01.13
22:34
(31) [остатки с фильтром по идее должны содержать 10 строк (вместо 14630)] спасибо, поржал
это если нет других измерений
34 DrShad
 
30.01.13
22:34
(32) именно это и имелось ввиду об использовании запросов в параметрах вирт таблиц
35 Fragster
 
гуру
30.01.13
22:35
(33) там будет <= 10 строк
36 xLokkIx
 
30.01.13
22:35
(33) не совсем понял, я разве неправильно посчитал? как их может быть больше, когда на них наложено ограничение из документа (10 разных номенклатур)
37 Classic
 
30.01.13
22:37
(36)
Оно имеет ввиду, что таблица остатков имеет вид
НОменклатура  Склад Остаток
Ном1          Ск1     1
Ном1          Ск2     2
38 xLokkIx
 
30.01.13
22:37
результат замера: с запросом в параметрах на 0.01 секунду медленнее. Но боюсь про это говорить не стоит, могла луна светить в это время по другому
39 DrShad
 
30.01.13
22:37
(37) именно
40 Classic
 
30.01.13
22:38
(37)
Но если ты будешь юзать Остатки(), то у тебя автогруппировка работать будет
41 Fragster
 
гуру
30.01.13
22:38
(37)(39) если не выбирать второе измерение, то оно само свернется
42 xLokkIx
 
30.01.13
22:38
(39) так мы говорим о виртуальной таблице с одним выбранным измерением.
43 Classic
 
30.01.13
22:39
(41)
Без скобок разве тоже свернется?
Я просто невкурсе :)
44 DrShad
 
30.01.13
22:39
(42) где!?
45 xLokkIx
 
30.01.13
22:40
(44)
ИЗ
   РегистрНакопления.ОстаткиНоменклатуры.Остатки(
           ,
           Номенклатура В
               (ВЫБРАТЬ РАЗЛИЧНЫЕ
                   Номенклатура
               ИЗ
                   Документ.РасходнаяНакладная.Номенклатура
ГДЕ Ссылка = &Ссылка))
46 DrShad
 
30.01.13
22:41
(42) ты мало того что сотворил ВТ, так еще и соединение и пытаешься этот зоопарк сравнивать
47 DrShad
 
30.01.13
22:41
(45) это выбранное или отфильтрованное!?
48 etc
 
30.01.13
22:42
(34) понятно но если параметры предварительно во временную таблицу запихивать то это только ухудшает ситуацию
49 Classic
 
30.01.13
22:44
(48)
В общем случае не факт. Если ограничение надо использовать во многих местах, то выигрыш от использования ВТ может оказаться выше проигрыша от записи этой ВТ
50 DrShad
 
30.01.13
22:46
(49) но сейчас холивар на конкретном примере :)))
51 xLokkIx
 
30.01.13
22:46
(42) Задача:
Определить текущие остатки для контроля отрицательных. Иначе как? Я должен сделать левое соединение табличной части документа и остатков. Вопрос изначально в том, нужно ли в виртуальной таблице в параметры ставить дополнительное условие.
а сравниваю один и тот же запрос, но с указанием условия в параметрах ВТ и без. Запрос вроде как логически корректный
52 etc
 
30.01.13
22:47
(48) это да, но нечасто бывает когда ее используют более 1 разв
53 xLokkIx
 
30.01.13
22:48
(47) не понимаю вопроса.
54 DrShad
 
30.01.13
22:49
(53) но оценки результатам даешь красноречивые :))))
55 Classic
 
30.01.13
22:50
(51)
Ты просто приводишь конкретный пример для общего правила.
Если ты делаешь

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Ч.Остатки()
ПО ......

То в общем случае ограничение на поле, которое учавствует в ПО ставить не надо.
А вот если ты сделаешь

ЛЕВОЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ
ИЗ РегистрНакопления.Ч.Остатки()
)
ПО.....


То в эти остатки надо пихать ограничение
56 xLokkIx
 
30.01.13
22:52
(54) а может мы просто друг друга не поняли
(55) пример из книги, который и заставил меня задуматься (да и задача от туда же)
57 xLokkIx
 
30.01.13
22:54
(55) я и не пихал ограничение при левом соединении. А в книге рекомендуют так делать...
58 Fragster
 
гуру
30.01.13
22:55
(55) как раз с виртуальными таблицами не совсем так
59 Classic
 
30.01.13
22:55
(58)
?
60 Fragster
 
гуру
30.01.13
22:56
(59) виртуальные таблицы - это на самом деле вложенные запросы, причем достаточно сложные. и к кускам этих вложенных запросов применяются условия в скобках
61 DrShad
 
30.01.13
22:56
(57) а зачем там вообще соединение?
62 Fragster
 
гуру
30.01.13
22:57
(60)+ если оптимизатор сообразит, то прокинет параметры соединения внутрь для отбора. но это чаще не так.
63 Classic
 
30.01.13
22:57
(60)
Ну это понятно. Просто у меня ограничение на правую ВТ никогда не давало прироста скорости. В отличии от ограничения на "явный" вложенный запрос.
Могу конечно ошибаться
64 Classic
 
30.01.13
22:59
+(63) т.е. ДТ. Динамическая таблица, чтоб не путать с временной таблицей :)
65 xLokkIx
 
30.01.13
23:06
(57) в запросе без ограничения в параметрах соединение нужно. во втором запросе (ограничение в параметрах) соединение во первых для чистоты эксперимента, а во вторых именно такая реализация в книге заставила задуматься (и она рекомендовалась )
66 DrShad
 
30.01.13
23:09
(65) что за книга-то такая!? я таких рекомендаций не встречал
67 Classic
 
30.01.13
23:10
(65)
Если резюмировать, то Фрагстер прав в (61)

Передача отбора через ЛЕВОЕ СОЕДИНЕНИЕ целиком и полностью на совести оптимизатора.

Задание отбора напрямую - гарантия уменьшения правой таблицы.

Так что лучше задавай в параметрах :)
68 Classic
 
30.01.13
23:10
Сори в (62)
69 xLokkIx
 
30.01.13
23:14
(32) попробовал. непонятно почему, но он на много медленнее работает чем с временной таблицей.
(66) листаю практическое пособие разработчика 8.2 М.Г. Радченко. Глава "оптимизация проведения документа..."
70 DrShad
 
30.01.13
23:16
(69) год выпуска и номер издания
71 DrShad
 
30.01.13
23:16
+(70) номер страницы, где такой пример с листингом
72 xLokkIx
 
30.01.13
23:18
Москва 2009
стр. 421. листинг 14.27
73 DrShad
 
30.01.13
23:18
акуеть
74 DrShad
 
30.01.13
23:23
сорри, но у меня такой фолиант не сохранился
75 xLokkIx
 
30.01.13
23:24
(73) а вопрос остался. зачем это нужно и нужно ли.
(67) получается нужно только для перестраховки от возможной недооптимизации
76 DrShad
 
30.01.13
23:38
(67) любые плюшки хороши там где они нужны
77 NcSteel
 
31.01.13
00:13
Левое соединение - зло, оператор "В" тоже зло ))). Использовать надо "Внутреннее соединение" ))
78 xLokkIx
 
31.01.13
13:52
(77) С удовольствием, если логика позволяет