|
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) С удовольствием, если логика позволяет
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |