|
ВЫРАЗИТЬ() и ССЫЛКА разница в скорости | ☑ | ||
---|---|---|---|---|
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) в смысле - условие в ГДЕ и условие в параметрах виртуальной таблицы
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |