Имя: Пароль:
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). Но! Так у тебя текст запроса не разбит на несколько кусков с кучей Если посередине (в общем случае). Наглядность такого запроса выше, его уже глазами можно читать.
Плюс при таком подходе конструктор запросов хоть открывается и можно посмотреть всё остальное. К тому же при точечных доработках всегда приходится добавлять кусочки запроса и комментарии. Т.е. в любом случае сделал текст конструктором, скопировал что надо, откатил текст, вставил только свой кусочек, не меняя форматирования всего запроса. При таком подходе все эти комментарии нормально живут.