Имя: Пароль:
1C
1С v8
ВЫРАЗИТЬ() и ССЫЛКА разница в скорости
,
0 jdxy
 
18.09.14
11:41
Добрый день! Уважаемые Форумчане, прошу помочь понять как работает Оператор "СССЫЛКА" в запросе? Объясню в чем возникли сомнения: долгое время использовал данный оператор когда была необходимость выбирать из таблицы документы одного типа, но недавно столкнулся с необходимостью сделать выборку из регистра, с большим количеством различных типов документа.

Т.е. в регистре "статусы документов" измерение документ имеет составной тип (40 видов документов), мне нужно выбрать документы с 1 единственным типом. раньше писал "Ссылка" и не замечал проблемы, а тут запрос выполняется очень долго. начал оптимизировать, и подумал использовать "Выразить()". получил таблицу, отсек NULL получилось в разы быстрее. Долго думал. пробовал в других запросах переписать в качестве тестирования на "выразить", пришел к выводу, что -либо запросы начинают работать быстрее, -либо примерно также. Может кто из Вас сталкивался всегда ли выразить работает быстрее или это только на конкретных случаях производительность растет?
1 H A D G E H O G s
 
18.09.14
11:42
Запросы
2 Крошка Ру
 
18.09.14
11:45
(0) Ну, неужели лень написать 3 слова в гугле и не лень - сотню слов здесь?
3 Крошка Ру
 
18.09.14
11:45
4 Maxus43
 
18.09.14
11:45
если ты потом обращаешся к реквизитам Составного Типа с Выразить - есно будет в разы быстрее, чем ГДЕ ССЫЛКА

ССЫЛКА - проверка на тип, ВЫРАЗИТЬ - приведение типа выходного к одному значению
5 Ник второй
 
18.09.14
11:46
Ссылка быстрее конечно при условии что нет дырок в индексах в запросе.
6 Ник второй
 
18.09.14
11:46
(4) Немного не так.
7 Maxus43
 
18.09.14
11:49
(6) вещай, чего уж, просвяти
8 Крошка Ру
 
18.09.14
11:50
(7) "просвети" же! А то смысл другой получается...
9 Maxus43
 
18.09.14
11:51
в идеале надо комбинировать обе конструкции, для полей - выразить, и в условии ССЫЛКА, либо ТИПЗНАЧЕНИЯ. В том случае, если надо обращаться к реквизитам составного
10 H A D G E H O G s
 
18.09.14
11:51
(5) Дырок нет.
11 Maxus43
 
18.09.14
11:52
(8) правильный смысл, мы за провославное программирование
12 Крошка Ру
 
18.09.14
11:52
(11) "православное" же! )))
13 Ник второй
 
18.09.14
11:53
(7) Долго, не буду. Посмотри профайлером тексты запросов.
14 jdxy
 
18.09.14
11:54
Запросы примерно такие
ВЫБРАТЬ
    СтатусыДокументовСрезПоследних.Документ
    ИЗ
    РегистрСведений.СтатусыДокументов.СрезПоследних(, ) КАК СтатусыДокументовСрезПоследних
ГДЕ
    СтатусыДокументовСрезПоследних.Документ ССЫЛКА Документ.ДоговорСтрахованияПолис


Это Первый

ВЫБРАТЬ
    ВЫРАЗИТЬ(СтатусыДокументовСрезПоследних.Документ КАК Документ.ДоговорСтрахованияПолис) КАК Документ,
    СтатусыДокументовСрезПоследних.Статус
ПОМЕСТИТЬ Документы
ИЗ
    РегистрСведений.СтатусыДокументов.СрезПоследних(, ) КАК СтатусыДокументовСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Документы.Документ
    
ИЗ
    Документы КАК Документы
ГДЕ
    НЕ Документы.Документ ЕСТЬ NULL

Это второй
15 Ник второй
 
18.09.14
11:54
(10) Разные ситуации бывают, например накладывают условия не на регистратор )
16 Ник второй
 
18.09.14
11:54
(14) Давай состав регистра и индексы к нему.
17 H A D G E H O G s
 
18.09.14
11:55
(16) А смысл? Херовое сравнение у автора
18 Крошка Ру
 
18.09.14
11:55
А по теме: всегда должна использоваться конструкция вида
ВЫБОР
    КОГДА Документ1 ССЫЛКА Документ.ТипДокумента
        ТОГДА ВЫРАЗИТЬ(Документ1 КАК Документ.ЗаказПокупателя)
    
КОНЕЦ

т.к если выразить объект одного типа, как объект другого, то запрос вываливается с ошибкой
19 H A D G E H O G s
 
18.09.14
11:55
(15) Тогда индекс на измерение делать надо
20 Maxus43
 
18.09.14
11:56
(13) смотрел я всё, при обращении к реквизитам без Выразить - будет туева куча соединений, и выходной тип будет составной.
Я не сравниваю скорость Выразить и ССЫЛКА - это разные вещи впринципе
21 Крошка Ру
 
18.09.14
11:56
+(18) ну в смысле
ВЫРАЗИТЬ(Документ1 КАК Документ.ТипДокумента)
22 Ник второй
 
18.09.14
11:56
(19) Садись, 5 )
23 Ник второй
 
18.09.14
11:58
(20) В некоторых случаях выгоднее получить всю таблицу и потом ее обрезать, чем бегать по кучи отбирая каждую запись.

Упираемся в индексы, поэтому и скорости могут быть разные.
24 Drac0
 
18.09.14
11:58
(18) Щито? 0_о
25 Maxus43
 
18.09.14
12:00
(23) зависит от ситуации конечно
26 H A D G E H O G s
 
18.09.14
12:00
(23) "В некоторых случаях выгоднее получить всю таблицу и потом ее обрезать, чем бегать по кучи отбирая каждую запись. "

Сам то понял, что сказал
27 Ник второй
 
18.09.14
12:00
(26) Конечно )
28 Крошка Ру
 
18.09.14
12:00
(24) какое слово не понял?
29 Ник второй
 
18.09.14
12:01
А вообще срез последних , это буэээ ))) правильные программисты сами его в запросе реализуют ))) и сразу во вложенном запросе отбирают нужные записи )
30 H A D G E H O G s
 
18.09.14
12:01
(27) Вот. А я не понял. Разъясни, будь добр.
31 Maxus43
 
18.09.14
12:04
(30) как я понял типа сначала выбрать по условию ГДЕ ССЫЛКА
а потом эту кучу ВЫРАЗИТЬ, а не сразу ВЫРАЗИТЬ. Но эт о мой сломаный миелофон
32 Ник второй
 
18.09.14
12:05
table scan + nested loops это зло которое можно получить если сразу пытаться получить одним махом все.

Поэтому чаще выгоднее отобрать таблицу по шагам помещая данные во ВТ
33 Maxus43
 
18.09.14
12:07
(32)>(14) Высокие материи надо оставлять на прекрасные запросы, а не на эти
34 H A D G E H O G s
 
18.09.14
12:09
(32) "Поэтому чаще выгоднее отобрать таблицу по шагам помещая данные во ВТ"

Ничего ты этим не изменишь.

ВТ имеет смысл для:
1) Многократного использования.
2) Помещения в нее результатов ВТ для посл. соединений.
3) Замены вложенных подзапросов.
35 Maxus43
 
18.09.14
12:09
вместо (14) я бы вобще сделал:
ВЫБРАТЬ
    ВЫРАЗИТЬ(СтатусыДокументовСрезПоследних.Документ КАК Документ.ДоговорСтрахованияПолис) КАК Документ,
    СтатусыДокументовСрезПоследних.Статус
ИЗ
    РегистрСведений.СтатусыДокументов.СрезПоследних(, ) КАК СтатусыДокументовСрезПоследних
ГДЕ
    ТИПЗНАЧЕНИЯ(СтатусыДокументовСрезПоследних.Документ) = ТИП("Документ.ДоговорСтрахованияПолис")
36 Drac0
 
18.09.14
12:10
(28) С каких пор ВЫРАЗИТЬ() выдает ошибку на составных типах данных. Сколько использую никогда не встречал.
37 H A D G E H O G s
 
18.09.14
12:11
(35) Почему условие

ТИПЗНАЧЕНИЯ(СтатусыДокументовСрезПоследних.Документ) = ТИП("Документ.ДоговорСтрахованияПолис")

не загнать в параметры ВТ?
38 jdxy
 
18.09.14
12:11
(35) А для чего выражать если мы в условии получили только 1 тип?
39 H A D G E H O G s
 
18.09.14
12:11
(38) 1С об этом не знает.
40 jdxy
 
18.09.14
12:13
Да не в виртуальных таблицах дело у меня и при обращении к реальной тоже самое в замере производительности выходит.
41 Maxus43
 
18.09.14
12:13
(38) это если ты дальше будешь использовать этот список документов в запросе например, а так в результате без ВЫРАЗИТЬ у тебя поле всё равно составного типа
42 Крошка Ру
 
18.09.14
12:13
(36) если у тебя попадается документ ЗаказПокупателя, а в запросе он выражается как ЗаказПоставщику, запрос вывалится с ошибкой. Такие дела.
43 jdxy
 
18.09.14
12:15
(41) Спасибо.
44 Drac0
 
18.09.14
12:22
(42) Только если правого типа нет среди типов составного реквизита. А если есть, то для другого типа вернет NULL. Такие дела.
45 Зойч
 
18.09.14
12:25
1 тип - это одна колонка, составной тип - 2 колонки минимум
46 H A D G E H O G s
 
18.09.14
12:26
(45) 3 колонки минимум.
47 Drac0
 
18.09.14
12:27
(46) Только 3 колонки :)
48 H A D G E H O G s
 
18.09.14
12:30
(47) нет
49 Drac0
 
18.09.14
12:32
(48) Вид составного поля, тип значения, значение. Что еще?
50 H A D G E H O G s
 
18.09.14
12:34
(49) + по колонке для каждого примитивного типа в составе
51 Drac0
 
18.09.14
12:38
(50) Точно.
52 Зойч
 
18.09.14
12:43
Мы сейчас говорим только про составные ссыорчные типы
53 Maxus43
 
18.09.14
12:44
о пиве лучше поговорить, пятница скоро
54 Drac0
 
18.09.14
12:45
(52) Тогда только 3 колонки.
55 боксер
 
18.09.14
12:50
(14) тупость использовать Где в виртуальных таблицах- отсюда и тормоза
за такой штраф на экзамене
56 боксер
 
18.09.14
12:53
и по "раньше писал "Ссылка" и не замечал проблемы, а тут запрос выполняется очень долго" советую базы чаще индексировать
57 jdxy
 
18.09.14
13:01
(55) по поводу ВТ и Где знаю, и не использую, просто тут промазал и выбрал ВТ вместо реальной таблицы.

а по поводу раньше писал, это на других базах. в смысле что всю жизнь писал и не видел разницы
58 Sammo
 
18.09.14
13:09
Выразить на поле + Ссылка в условии.
Ссылка - для ограничения выборки. Выразить, чтобы возвращало примитивный тип.
59 DS
 
18.09.14
14:17
Примитивный тип? Точно?
60 Крошка Ру
 
18.09.14
14:20
(55) не всегда одно и то же
61 Крошка Ру
 
18.09.14
14:21
+(60) в смысле - условие в ГДЕ и условие в параметрах виртуальной таблицы