Имя: Пароль:
1C
 
ЗАПРОС: универсальное условие для секции ГДЕ как быстрее?
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) насчет поправки согласен  Записей. Вопрос что "где" накладывается уже после соединений по факту на результирующую таблицу и сколько там будет записей оптимизатор зачастую не знает да ему и все равно.Хотя да в целом вы скорее всего правы на быстродействии это врят ли скажется. Вот если "или" стоит в условиях соединения или в параметрах вирттаблици тогда да скорее всего будет не оптимально.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn