|
ЗАПРОС: универсальное условие для секции ГДЕ как быстрее? | ☑ | ||
---|---|---|---|---|
0
Gorr
31.08.15
✎
10:36
|
Суть - создать условие которое будет отрабатывать как в случае задания параметра отбора так и в случае его отсутствия.
Даю два варианта на выбор. Который быстрее и почему? 1. выбор когда &Номенклатура = значение(Справочник.Номенклатура.ПустаяСсылка) тогда Истина иначе Номенклатура = &Номенклатура конец 2. &Номенклатура = значение(Справочник.Номенклатура.ПустаяСсылка) или Номенклатура = &Номенклатура |
|||
1
asady
31.08.15
✎
10:39
|
(0) для птяницы рановато - подними ветку в пятницу - может народ и поймет твой стеб
|
|||
2
EugeniaK
31.08.15
✎
10:40
|
(0) Второе, разумеется.
|
|||
3
gigi789
31.08.15
✎
10:40
|
(0) Используй построитель
|
|||
4
Ненавижу 1С
гуру
31.08.15
✎
10:42
|
ГДЕ
&УсловиеНоменклатура в коде: ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"&УсловиеНоменклатура",?(ЗначениеЗаполнено(Номенклатура),"Номенклатура = &Номенклатура","ИСТИНА")); |
|||
5
pavig
31.08.15
✎
10:42
|
(4)
Тогда уж лучше использовать Построитель |
|||
6
Ненавижу 1С
гуру
31.08.15
✎
10:47
|
(5) я не против, но не люблю его программно дергать, только для отчетов
|
|||
7
gigi789
31.08.15
✎
10:51
|
можно в иерархии юзать
|
|||
8
Гёдза
31.08.15
✎
10:58
|
(4) За такое нужно руки отрубать
|
|||
9
Gorr
31.08.15
✎
11:00
|
(3) ответ не верный - или в условии может привести к тому, что СУБД не сможет использовать индексы таблиц и будет выполнять сканирование, что увеличит время запроса и вероятность возникновения блокировок.
(4) это принесение универсализации в жертву скорости. Кроме того это приведет к невозможности использования конструктора запроса (наличие шаблонов в тексте запроса). |
|||
10
Gorr
31.08.15
✎
11:01
|
(7) в отношении справочника да, но в отношении документа?
|
|||
11
Ненавижу 1С
гуру
31.08.15
✎
11:06
|
(9) как раз конструктором это прекрасно открывается
и по поводу скорости ты как раз не прав |
|||
12
Simod
31.08.15
✎
11:16
|
Еще можно так:
ВЫБРАТЬ СправочникНоменклатура.Ссылка КАК Номенклатура ИЗ Справочник.Номенклатура КАК СправочникНоменклатура ГДЕ &Номенклатура = ЗНАЧЕНИЕ(справочник.Номенклатура.ПустаяСсылка) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ СправочникНоменклатура.Ссылка ИЗ Справочник.Номенклатура КАК СправочникНоменклатура ГДЕ СправочникНоменклатура.Ссылка = &Номенклатура |
|||
13
gigi789
31.08.15
✎
11:18
|
(10) Отбирай значение справочника в врт потом соединяй с документом
|
|||
14
gigi789
31.08.15
✎
11:18
|
(9) Где в посторителе будет или??
|
|||
15
H A D G E H O G s
31.08.15
✎
11:19
|
(8) И такие дятлы, как (4) еще нас пытаются чему -то учить.
|
|||
16
H A D G E H O G s
31.08.15
✎
11:20
|
(9) "или в условии может привести к тому, что СУБД не сможет использовать индексы таблиц и будет выполнять сканирование, "
Пальцем в попу. |
|||
17
Gorr
31.08.15
✎
11:21
|
(11) вы правы открывается у вас не шаблон а условие целиком. но то, что вы предлагаете это модификация текста в зависимости от условий. здесь же речь же об универсальном тексте.
|
|||
18
H A D G E H O G s
31.08.15
✎
11:21
|
Номенклатура В (значение(Справочник.Номенклатура.ПустаяСсылка), &Номенклатура)
|
|||
19
Gorr
31.08.15
✎
11:22
|
(12) и возможно это будет самый быстрый вариант.
|
|||
20
Ненавижу 1С
гуру
31.08.15
✎
11:22
|
(17) а я не спорю, скажем это изобретение велосипеда построителя
|
|||
21
Гёдза
31.08.15
✎
11:22
|
в справочнике номенклатуры не может быть пустых ссылок )))
|
|||
22
gigi789
31.08.15
✎
11:24
|
(18) не верно условие в 0 другое
|
|||
23
gigi789
31.08.15
✎
11:24
|
(19) самый быстрый вариант это построитель
|
|||
24
Гёдза
31.08.15
✎
11:25
|
(22) именно оно
|
|||
25
butterbean
31.08.15
✎
11:26
|
(18) в общем случае не подходит, т.к. поле Номенклатура может быть не заполнено
|
|||
26
Gorr
31.08.15
✎
11:26
|
(16) "Настольная книга 1С эксперта" стр.193 почитайте
|
|||
27
gigi789
31.08.15
✎
11:28
|
(24) Да только в 0 если пустая ссылка то выбираем все, если заполнено то выбираем что равно, а в (18) мы документы с не заполненной номенклатурой выберем по любому.
|
|||
28
H A D G E H O G s
31.08.15
✎
11:30
|
(26) "может привести", Gorr, "может привести".
Филлипов поленился физику индексов описывать, так как не рассчитывал, что 1Снеги осилят это, поэтому дал "безопасную" рекомендацию. |
|||
30
H A D G E H O G s
31.08.15
✎
11:31
|
(27) Да, не смог узреть & под таким углом.
|
|||
31
К_Дач
31.08.15
✎
11:44
|
В шаблонах РЛС обычно пишут так (пример):
ГДЕ (ТаблицаДокумента.ДокументОснование В (&СписокДокументовОснований) ИЛИ НЕ 1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ ТаблицаДокумента КАК ТаблицаДокумента ГДЕ ТаблицаДокумента.ДокументОснование В (&СписокДокументовОснований))) на быстроту, конечно, не претендует, но зато универсально. |
|||
32
DS
31.08.15
✎
11:45
|
(26) Так и знал, что настольная книга попала в шаловливые ручки. Читайте полностью, вдумчиво. Сверяйте с планами на практике. А потом делайте выводы.
|
|||
33
Gorr
31.08.15
✎
11:47
|
(28) Ну так (0) не просто так и появилась. Просвятите пожалуйста нас о физике индексов и чем рекомендация по запроса данная в 13м правиле неверна.
|
|||
34
pavig
31.08.15
✎
11:50
|
(15)
Цитирую "И такие дятлы, как " ... " еще нас пытаются чему -то учить" (18) (30) |
|||
35
К_Дач
31.08.15
✎
11:57
|
Кстати, думаю, что в конечном счете (31) на уровне СУБД превращается в (12), так как оптимизатор запросов SQL - не дурак и оператор "В" он скорее всего преобразует в джойн, а "ИЛИ" в объединение
|
|||
36
gigi789
31.08.15
✎
11:59
|
(35) Зря так думаете
|
|||
37
К_Дач
31.08.15
✎
12:01
|
(36) ну я не тестировал, но почему нет? на досуге гляну план такого запроса
|
|||
38
gigi789
31.08.15
✎
12:04
|
(37)Задача оптимизатора понять какая есть статистика и как с ней работать "или" сильно вводит его в заблуждение он не знает что должно вернутся, а времени подумать у него нет.
|
|||
39
gigi789
31.08.15
✎
12:07
|
(38) Плюс иногда на моей практике встречались умышленно не оптимальные запросы. На пример требовалось чтоб некоторые строки в результат попали n раз.
|
|||
40
К_Дач
31.08.15
✎
12:09
|
(39) такое, конечно, лучше делать через объединение. ну, значит вариант в (12) в целом более универсален
|
|||
41
H A D G E H O G s
31.08.15
✎
12:19
|
(34) Моя ошибка не отменяет рукорубства за динамические запросы, которые можно делать только в самом самом крайнем случае.
|
|||
42
H A D G E H O G s
31.08.15
✎
12:21
|
(38) "ИЛИ" никак не вводит SQL в заблуждение.
ИЛИ отлично применяется к одному поля таблицы, хоть испляшись. ИЛИ опасно для нескольких полей. |
|||
43
Chin
31.08.15
✎
12:23
|
(0) Лучше первый вариант, "ИЛИ" в условие запроса лично я стараюсь не использовать, в некоторых случаях запрос работает гораздо медленнее.
|
|||
44
gigi789
31.08.15
✎
12:45
|
(42)ага только вот оптимизатор не знает сколько полей оберется в таблицу которая получается после "или" 1 или все и что делается дальше с этой таблицей
|
|||
45
H A D G E H O G s
31.08.15
✎
12:49
|
(44) Оптимизатор об этом прекрасно знает. И не полей, а записей.
" и что делается дальше с этой таблицей" А какая разница, что с ней делается потом. Я думаю, вы это окончание написали просто, чтобы было, для придания веса фразе, не так ли? |
|||
46
Бубка Гоп
31.08.15
✎
13:50
|
(0) неужели проще спросить на форуме, чем узнать у замера производительности/профайлера/секундомера/илиЧтоТамУВасЕсть?
|
|||
47
Gorr
31.08.15
✎
14:01
|
(45) а про физику индексов вы, наверное, так же подумав добавили для предания веса фразе?
|
|||
48
gigi789
31.08.15
✎
14:16
|
(45) насчет поправки согласен Записей. Вопрос что "где" накладывается уже после соединений по факту на результирующую таблицу и сколько там будет записей оптимизатор зачастую не знает да ему и все равно.Хотя да в целом вы скорее всего правы на быстродействии это врят ли скажется. Вот если "или" стоит в условиях соединения или в параметрах вирттаблици тогда да скорее всего будет не оптимально.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |