Имя: Пароль:
1C
1С v8
Как правильнее в запросе условия выборки регистратора? ВЫРАЗИТЬ или ССЫЛКА?
0 arsik
 
гуру
01.11.18
09:55
1. Вариант 1 100% (3)
2. Вариант 2 0% (0)
Всего мнений: 3

Как правильнее? Регистр сведений.
Вариант 1.
CRM_ВзаимодействияСКлиентом.Регистратор ССЫЛКА Документ.CRM_ПредпринятоеДействие
Вариант 2.
НЕ ВЫРАЗИТЬ(CRM_ВзаимодействияСКлиентом.Регистратор КАК Документ.CRM_ПредпринятоеДействие) ЕСТЬ NULL
1 FIXXXL
 
01.11.18
09:56
так читабельнее

Вариант 1
2 arsik
 
гуру
01.11.18
09:57
(1) Да фиг с ней читабельностью. Как быстрее?
3 Mankubus
 
01.11.18
10:01
(2) сделай замер
4 Cool_Profi
 
01.11.18
10:17
Судя по пойманным запросам - таки первый.
Мне так кажется.
Но это не точно.

Вариант 1
5 spiller26
 
01.11.18
10:26
2 вариант не встречал ещё.

Вариант 1
6 иубиповец
 
01.11.18
10:28
А что прям кардинально время выполнения меняется?:)
Я всегда 1 вариантом пользовался. По логике в 1 варианте 1 действие - проверка на тип, а во втором 2, попытка преобразования в нужный тип, и проверка на null
7 spiller26
 
01.11.18
10:29
8 arsik
 
гуру
01.11.18
10:29
(1) (4) (5)
Я тоже не встречал, но у меня вариант 2 работает быстрее первого, вот я и интересуюсь.
9 Cyberhawk
 
01.11.18
10:30
(7) Так это не в условии во-первых, во-вторых не для составного типа
10 Cyberhawk
 
01.11.18
10:31
(8) Попробуй еще вариант 3: "НЕ" размести не в начале, а перед ЕСТЬ
11 Cyberhawk
 
01.11.18
10:31
А потом вариант 4: "НЕ" размести после "ЕСТЬ"
12 SleepyHead
 
гуру
01.11.18
10:49
ТипЗначения(Регистратор) = Тип(Документ.CRM_ПредпринятоеДействие)

пробовал?
13 arsik
 
гуру
01.11.18
10:59
(11) Медленнее получается
(12) Еще медленнее (11)
14 Вафель
 
01.11.18
11:01
сами запросы скл сравнивал?
15 arsik
 
гуру
01.11.18
11:02
(14) Неа. Пока нет доступа. Как комп нормальный поставят, локально сервер разверну тогда посмотрю конечно.
16 Вафель
 
01.11.18
11:07
а какая разница в замерах? может это просто пограшность?
17 SleepyHead
 
гуру
01.11.18
11:52
Если сравнить время на отладку и время исполнения запроса,  умноженное на количество исполнений, что больше?
18 Малыш Джон
 
01.11.18
12:06
(0) ССЫЛКА проще, но она - только для ссылочных типов данных(как это не странно). Если в регистраторе будет Неопределено, то запрос в этом месте упадет.
19 Малыш Джон
 
01.11.18
12:08
И кстати второй вариант тоже с ошибкой падает для неопределено
20 youalex
 
01.11.18
12:13
(18) падает все же не по значению,а по типу поля.

3.Вариант 3. Явное соединение.
21 arsik
 
гуру
01.11.18
13:36
(16) Возможно.
(18) В регистраторе не может быть "неопределено"
22 xXeNoNx
 
01.11.18
13:52
(0) CRM_ВзаимодействияСКлиентом.Регистратор ССЫЛКА Документ.CRM_ПредпринятоеДействие

Пользуйтесь!
Это быстрее
23 xXeNoNx
 
01.11.18
14:03
вот факультативная ссцылочка, по п.2
https://www.mssqltips.com/sqlservertutorial/3203/avoid-using-not-equal-in-where-clause/
24 Cyberhawk
 
01.11.18
14:06
(13) А (10)?
25 Cyberhawk
 
01.11.18
14:07
(23) Спс
26 arsik
 
гуру
01.11.18
14:41
(23) Так не понял. ТО есть исходя из этого предложение "В" обрабатывается быстрее чем "<>" или "ИЛИ"
27 Cyberhawk
 
01.11.18
14:48
(26) Еще быстрее вместо "В" делать объединение с =, не?
28 arsik
 
гуру
01.11.18
14:49
Да, но слишком тяжелые для восприятия запросы получаются
29 arsik
 
гуру
01.11.18
14:49
+ (28)  И если нужно что то изменить, приходится во всех объединениях это изменять
30 xXeNoNx
 
01.11.18
14:51
(28) Вам шашечки или ехать?
31 Cyberhawk
 
01.11.18
14:52
Хотя насчет замены "В" на объединение с = лениво смотреть, но по идее платформа прекрасно сама это должна делать?
32 Cyberhawk
 
01.11.18
14:52
Хотя не, походу не делает...
33 VS-1976
 
01.11.18
14:54
(0) Бредовый вопрос :)

Сравнение поля тип конечно же быстрее

CRM_ВзаимодействияСКлиентом.Регистратор ССЫЛКА Документ.CRM_ПредпринятоеДействие

Вариант ниже это как чесать язык через з@дницу

НЕ ВЫРАЗИТЬ(CRM_ВзаимодействияСКлиентом.Регистратор КАК Документ.CRM_ПредпринятоеДействие) ЕСТЬ NULL
34 arsik
 
гуру
01.11.18
15:57
(33) Ну видимо у меня погрешность все же. Т.к.  "НЕ ВЫРАЗИТЬ(CRM_ВзаимодействияСКлиентом.Регистратор КАК Документ.CRM_ПредпринятоеДействие) ЕСТЬ NULL" - было быстрее.
Ну и не только я один юзаю сервер.
35 Вафель
 
01.11.18
16:08
Поле ССЫЛКА .Тип
и
Тип(Поле) = Тип
в скл разварачиваются одинаково
36 Вафель
 
01.11.18
16:09
выразить скорре всего вообще левое соединение будет. так что быстрее может быть только случайно
37 arsik
 
гуру
01.11.18
16:21
(36) Возможно ВЫРАЗИТЬ в условии будет влиять на получение полей запроса. Хотя там при получении полей у меня все тоже через ВЫРАЗИТЬ.
38 Вафель
 
01.11.18
16:22
(37) проще самому соединение написать, чем 500 раз выразить
39 VS-1976
 
01.11.18
21:55
(36) Не будет там левое... Если бы точку поставил тогда да...
Выразить это типа приведение типа :) так кроме этого сравнение на null и ещё инверсия результата. Действий больше, чем просто проверка поля тип на цЫфирь, которую в запрос подставит 1с...
40 VS-1976
 
01.11.18
21:57
(34) что бы мерить нужно код определенно строить. Выносить запрос в общий, что бы он один раз парился и вызывать в цикле уже отпарсенный, что бы тест был корректным...
41 VS-1976
 
01.11.18
21:58
(40) вместо парился читать парсился
42 Bober
 
01.11.18
22:59
(0)
первый вариант - будет сравнение по полу Тип данных, на больших выборках свалится в сканирование таблицы.
второй вариант - 100% будет полное сканирование таблицы, так как будет CASE when ....
43 arsik
 
гуру
02.11.18
09:43
Еще вопрос тогда.
Я вижу что вот такие условия в запросе у меня оптимизатор неверно обрабатывает. (8.2.19)
ВЫБРАТЬ
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    ВЫБОР
            КОГДА &Фильтр = "ТипНоменклатуры"
                ТОГДА Номенклатура.ТипНоменклатуры = &ТипНоменклатуры
            КОГДА &Фильтр = "спТипНоменклатуры"
                ТОГДА Номенклатура.ТипНоменклатуры В (&спТипНоменклатуры)
            КОГДА &Фильтр = "ВидНоменклатуры"
                ТОГДА Номенклатура.ВидНоменклатуры = &ВидНоменклатуры
            КОГДА &Фильтр = "cgВидНоменклатуры"
                ТОГДА Номенклатура.ВидНоменклатуры В (&спВидНоменклатуры)
            ИНАЧЕ ИСТИНА
        КОНЕЦ

Переписал все на конструировании запроса. Сейчас быстрее но сложнее дорабатывать. т.к. запрос собирается из нескольких частей и условий.
Это норма или что то уже изменили в новых платформах?
44 Cyberhawk
 
02.11.18
09:45
(43) Вместо кейсов объединение лупить - это норма
45 Cyberhawk
 
02.11.18
09:46
А вот латиница в "cgВидНоменклатуры" - это не норма )
46 arsik
 
гуру
02.11.18
10:01
(45) Это просто для примера делал, там "спВидНоменклатуры"
47 DrWatson
 
02.11.18
10:04
(43) Чтобы не собирать запрос из несколько частей можно вставить все эти условия в запрос закомментированными, а потом один раз СтрЗаменить(ТекстЗапроса, "//ОтборНоменклатура", "")
48 arsik
 
гуру
02.11.18
10:55
(47) Вариант. Но конструктор запросов выкинет комментарии.
49 Alexandr_U1982
 
02.11.18
11:51
(48)Чтобы конструктор не выкидывал, можно ставить не "ОтборНоменклатура", а "&ОтборНоменклатура".
А потом СтрЗаменить(ТекстЗапроса, "&ОтборНоменклатура", "").
50 Alexandr_U1982
 
02.11.18
11:53
(48)Чтобы конструктор не выкидывал, можно ставить не "//ОтборНоменклатура", а "&ОтборНоменклатура".
А потом СтрЗаменить(ТекстЗапроса, "&ОтборНоменклатура", "").
51 Вафель
 
02.11.18
11:53
(43) Может проще параметр заполнять, а не текст менять?
52 arsik
 
гуру
02.11.18
11:55
(51) А что это даст? Оптимизатор неверно прожует это условие.
53 Вафель
 
02.11.18
11:58
Я предлагая всегда писать "В", а параметр либо список либо элемент
54 DrWatson
 
02.11.18
13:18
(48) Да, выкинет. Да, дорабатывать всё же сложнее чем в (43). Но! Так у тебя текст запроса не разбит на несколько кусков с кучей Если посередине (в общем случае). Наглядность такого запроса выше, его уже глазами можно читать.
Плюс при таком подходе конструктор запросов хоть открывается и можно посмотреть всё остальное. К тому же при точечных доработках всегда приходится добавлять кусочки запроса и комментарии. Т.е. в любом случае сделал текст конструктором, скопировал что надо, откатил текст, вставил только свой кусочек, не меняя форматирования всего запроса. При таком подходе все эти комментарии нормально живут.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.