|   |   | 
| 
 | Как правильнее в запросе условия выборки регистратора? ВЫРАЗИТЬ или ССЫЛКА? | ☑ | ||||||
|---|---|---|---|---|---|---|---|---|
| 0
    
        arsik гуру 01.11.18✎ 09:55 | 
 
        Как правильнее? Регистр сведений.
 Вариант 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) ВЫБРАТЬ
Переписал все на конструировании запроса. Сейчас быстрее но сложнее дорабатывать. т.к. запрос собирается из нескольких частей и условий. Это норма или что то уже изменили в новых платформах? | |||||||
| 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). Но! Так у тебя текст запроса не разбит на несколько кусков с кучей Если посередине (в общем случае). Наглядность такого запроса выше, его уже глазами можно читать.
 Плюс при таком подходе конструктор запросов хоть открывается и можно посмотреть всё остальное. К тому же при точечных доработках всегда приходится добавлять кусочки запроса и комментарии. Т.е. в любом случае сделал текст конструктором, скопировал что надо, откатил текст, вставил только свой кусочек, не меняя форматирования всего запроса. При таком подходе все эти комментарии нормально живут. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |