Имя: Пароль:
1C
 
ВременныеТаблицы замедляют работу Запросов?
0 Вася Теркин
 
21.05.15
05:21
1. Временные таблицы быстрее 54% (13)
2. Позовите специалиста 21% (5)
3. Попробуй 21% (5)
4. Вложенные запросы быстрее 4% (1)
5. Одинаково 0% (0)
Всего мнений: 24

Если я сделаю Запрос, помещу во ВременнуюТаблицу и использую её в другом Запросе или сделаю такой же вложенный Запрос и использую его во внешнем Запросе - что быстрее?
3 Рэйв
 
21.05.15
05:38
Один раз сделаная ВТ сидит в менеджере временных таблиц и доступна для использования сколько угодно раз на любые тексты новых запросов.
Но вообще то ...

Попробуй
4 Andrewww123
 
21.05.15
05:42
А мне кажется что замедляют, потому как временные таблицы - это tempdb и расходуется время на запись в неё и на чтение из неё. Если tempdb расположена на небыстром диске, то разница может быть ощутимая, думаю.
5 Вася Теркин
 
21.05.15
06:31
(4) Вот у меня примерно такие опасения
6 Вася Теркин
 
21.05.15
06:33
(3) Очень редко даже код повторно удается использовать. А ты хочешь универсальный набор данных ещё и вечно актуальный. Это Куб называется как минимум. Но рассматривать ВТ как средство публикации можно вряд ли.
7 su_mai
 
21.05.15
06:59
(0) Использование временных таблиц несколько ограничивает SQL сервер в выборе стратегии выполнения запроса, однако в некоторых случаях это обоснованно.

Попробуй
8 Drac0
 
21.05.15
07:07
(4) временные таблицы физически хранятся в оперативке. На диск скидываются, если оперативы не хватает.
9 ILM
 
гуру
21.05.15
07:45
Как то так, если особенно отбирать сразу то, что нужно.

Временные таблицы быстрее
10 ILM
 
гуру
21.05.15
07:47
Ну или удобнее, если нужно много раз обращаться.
11 Drac0
 
21.05.15
07:48
А вообще нет абсолютного решения и каждый запрос надо разбирать и оценивать отдельно.

Позовите специалиста
12 ЧеловекДуши
 
21.05.15
07:53
(0) Все зависит от самих запросов, структуры данных и кривизны рук разработчика этой структуры данных :)

Позовите специалиста
13 shuhard_серый
 
21.05.15
07:54
(0) temp зло

Вложенные запросы быстрее
14 Andrewww123
 
21.05.15
08:20
(8) Доказательство?
15 Вася Теркин
 
21.05.15
08:28
(9) Не понял - вложенные запросы могут "отбирать" ровно то же самое.
16 ИС-2
 
naïve
21.05.15
08:28
В теории ВТ быстрее вложенных, но на практике бывает часто наоборот (проведено)

Попробуй
17 Вася Теркин
 
21.05.15
08:29
(10) Очень мало уже написанных де факто ВТ используют более одного раза. Вот и вопрос - одинэсники тупые? Не вброс.
18 Вася Теркин
 
21.05.15
08:30
(12) Структура Вложенного запроса полностью будет соответствовать ВТ.
19 Вася Теркин
 
21.05.15
08:31
Вижу только один очевидный плюс ВТ - "наглядность" в программировании. А технически как быстрее работает?
20 Вася Теркин
 
21.05.15
08:32
+18 это опять же если текст запроса глазами читать, а не конструктором
21 Вася Теркин
 
21.05.15
08:33
ИМХО, типовые конфигурации через ВТ написаны чтобы обеспечить наглядность - простоту понимания человеком-одинэсником.
22 Одинесю
 
21.05.15
08:34
Все курсы основаны на том, что ВТ быстрее и эффективнее и что ВЗ надо переделывать на ВТ. Обосновано тем, что SQL трудно соображает по вложенным запросам. Это развод?
23 rphosts
 
21.05.15
08:36
(4) только кажется, ВТ сидит в оперативки и заливается на диск только если жутко не хватает памяти.

Потом, вложенный будет выполняться каждый раз а ВТ уже хранит готовый результат, поэтому чаще всего ВТ.

Временные таблицы быстрее
24 ДенисЧ
 
21.05.15
08:36
1с сама утверждает, что в случае вложенных запросов сервер не всегда может построить оптимальный план запроса. И рекомендует использовать временные таблицы
25 rphosts
 
21.05.15
08:37
И вообще среди рекомендаций 1С есть рекомендация использовать ВТ. Кто будет спорить с разрабами?
26 be-may
 
21.05.15
08:37
(0) согласна с (12) : Все зависит от самих запросов, структуры данных и кривизны рук разработчика этой структуры данных.

Считается, что в случае вложенных запросов не всегда получается построить оптимальный план выполнения.  В случае временной таблицы всегда заранее известно размер выборки, а значит можно построить оптимальный план выполнения..

Временные таблицы быстрее
27 rphosts
 
21.05.15
08:39
(26) >В случае временной таблицы всегда заранее известно размер выборки

да с чего это?

И вообще если не ошибаюсь что 15 лет назад что сейчас кроме DB/2 никто не может выдать на гора прогнозное время выполнения запроса
28 rphosts
 
21.05.15
08:39
+ (27) это даже не размер выборки а время
29 ДенисЧ
 
21.05.15
08:41
(27) А ничего, что МС вполне себе выдаёт estimated time и план запроса. И очень даже часто результат похож на правду. Если статистики и индексы в порядке.
30 rphosts
 
21.05.15
08:46
(29) план показывают все, время научились значит... оказывается не совсем безнадёжны. Но для того что-бы пронозировать размер выборки нужно парктически кэшировать все запросы(с набором параметров) и что-бы в кэше хранился требуемый запрос (с именно таким-же набором параметров) - это уже фантастика
31 be-may
 
21.05.15
08:46
(27) если ты выбрал данные  и поместил их во временную таблицу, а потом ее соединяешь с другими данными, то ты ВСЕГДА знаешь размер этой временной таблицы перед соединением. Разве это не очевидно?
32 ДенисЧ
 
21.05.15
08:47
(30) Я ж говорю - при актуальных статистиках
33 rphosts
 
21.05.15
08:48
(31) только когда оно отобрана а не "заранее известно"
34 rphosts
 
21.05.15
08:49
(32) ну не всегда-же ходят юзера только по проторенным дорожкам
35 rphosts
 
21.05.15
08:49
хотя наверное чаще всего именно по ним
36 ДенисЧ
 
21.05.15
08:49
(34) Ты статистики от кеша отличаешь? )
37 be-may
 
21.05.15
08:53
На курсах Гилева  по оптимизации очень хорошо рассказывали про то, почему временные запросы лучше вложенных таблиц.
Без цитат, т.к это видеокурс. Просто, что называется, believe me :)


Есть еще книга от 1С  Язык запросов. Вот цитата из нее про вложенные таблицы :
http://screencast.com/t/gMRHdpbM
http://screencast.com/t/intmUKMFvI

// это уже для автора ветки
38 break
 
21.05.15
09:01
39 break
 
21.05.15
09:04
мне во временных таблицах не хватает УПОРЯДОЧИТЬ без ПЕРВЫЕ, а во вложенных такая возможность имеется
40 Lamer1C
 
21.05.15
09:04
(0) временные таблицы помещаются в tempdb. в большинстве случаев их использование необходимо
41 Salimbek
 
21.05.15
09:09
(39) Какой смысл упорядочивать что-то во временной таблице?

Временные таблицы быстрее
42 Ненавижу 1С
 
гуру
21.05.15
09:12
по ощущениям пережитым в реальности

Временные таблицы быстрее
43 scanduta
 
21.05.15
09:12
Вложенные запросы - прошлый век

Временные таблицы быстрее
44 Ненавижу 1С
 
гуру
21.05.15
09:12
(41) +1
45 Alexander Shevchuck
 
21.05.15
09:23
Временные таблицы быстрее, главное не забывайте индексировать поля по которым будут накладываться фильтр или производится соединение.

Временные таблицы быстрее
46 GANR
 
21.05.15
09:28
Из 2-х зол выбираем меньшее

Временные таблицы быстрее
47 D_E_S_131
 
21.05.15
09:32
Какой мрак пишется в этой теме. И это при наличии кучи методических статей в свободном доступе.

Позовите специалиста
48 Бубка Гоп
 
21.05.15
09:33
(0) по личным ощущениям. опять же, провести замеры совсем не трудно

Временные таблицы быстрее
49 repin_mike
 
21.05.15
09:34
И лучше читаются

Временные таблицы быстрее
50 СвинТуз
 
21.05.15
09:35
я думал вьюха на скл сервере делается
а вы говорите временная таблица?
51 ГеннадийУО
 
21.05.15
09:36
(45) Главное не забывать замерять время выполнения и просматривать планы запросов...
52 Анцеранана
 
21.05.15
09:37
Мне это еще на курсах Больсунов рассказывал 3 УЦ - думаю тут спорить не имеет смысла.
У вложенного запроса преимуществ я нашел только 2:
1) Более удобно выцепить отдельный фрагмент
2) Иногда временные таблицы не срабатывают в ситуации
Подзапрос 1 Объединить ВСЕ Подзапрос 2, где один из подзапросов нетривиальный и сам требует вложенности, тогда ВТ ругается.

Очень часто вложенные запросы используются в типовых до сих пор например у нас в УПП, поэтому с ними приходится возиться.

Временные таблицы быстрее
53 rphosts
 
21.05.15
09:41
(43) RLS разве не вложенный запрос итогового запроса?
54 Ненавижу 1С
 
гуру
21.05.15
09:43
(53) нет, RLS выполняет отдельно сервер приложений на результате запроса
55 Vovan1975
 
21.05.15
09:59
(19) ВТ быстрее за счет индексов
56 Вася Теркин
 
21.05.15
10:05
(23) "вложенный будет выполняться каждый раз" см (17) О чем тогда речь?
57 Вася Теркин
 
21.05.15
10:07
(24) Честно говорю, не слышал. Но я мало читаю.
58 Вася Теркин
 
21.05.15
10:07
(25) Железно, парниша!
59 PePaRiTB
 
21.05.15
10:08
Смешно читать комментарии которые говорят что временные таблицы использую tempdb и это замедляет.
А что если я скажу Вам, что практически все запросы из 1с используют tempdb, т.к. туда попадают все транзакционные запросы (а в 1с по-моему все запросы делаются в транзакции с определенным уровнем изоляции)

Почитали бы литературу и msdn (https://msdn.microsoft.com/ru-ru/library/ms190768.aspx).

Вложенный запрос по определению может использоваться только в нескольких случаях. Например, нужно после объединения таблиц сгруппировать их, тогда производительность вложенного запроса и временной таблицы будет практически одинаковой.
А вот когда соединяют несколько вложенных - это уже клиника.

Про плюсы временных таблиц уже написано много и можно посмотреть курсы Гилева и других интересных товарищей.

Временные таблицы быстрее
60 MrStomak
 
21.05.15
10:09
(33) Так в этом и преимущество ВТ вообще-то, там не нужно заранее знать. Выполняется ВТ, смотрится сколько в ней строк, потом строится с учетом этого нормальный план.
Когда вложенный запрос используется, то при построении плана именно _прогнозируется_ сколько примерно будет строк на основе статистики. Корреляция прогноза  с реальностью обратно пропорциональна сложности вложенного запроса - когда там одна таблица это еще ладно, а когда несколько со сложными фильтрами  - уже не очень.

В общем вложенный запрос может отработать чуть-чуть быстрее, а может отработать значительно медленнее, в зависимости от 100500 причин
61 Вася Теркин
 
21.05.15
10:11
(37) Это очень хорошая мысль. Об этом не думал. Спасибо.
62 Basma4
 
21.05.15
10:12
все зависит от контекста и запроса.
индексированная временная таблица с большим кол-вом строк
будет медленее за счет накладных расходов.
вложенный запрос будет быстрее.
Вложенный запрос опасен при соединениях, оптимизатор может выбрать неоптимальный оператор для соединения и тогда ваш запрос будет медленее чем через временную таблицу.

Позовите специалиста
63 aka AMIGO
 
21.05.15
10:13
ОФФ, Извини, ТС, пожалуйста! :)

(59) PePaRiTB ты из Гуанчжоу?! В China имеет место быть распространение 1с? Здорово! :)
64 H A D G E H O G s
 
21.05.15
10:14
Временные таблицы - это годно. Они разделяют зубодробительные запросы на части, это полезно и тебе и серверу SQL.

Да, сервер SQL построит годный вложенный запрос и он будет быстрее, ОСОБЕННО, если ты его выполняешь 2 раз, хехе, но в тяжелом случае SQL скажет - ипись оно все конем и добавить где-нибудь TableLazySpool и все обернется минутами выполнения.
65 Вася Теркин
 
21.05.15
10:14
(53) Убийственный аргумент...
66 H A D G E H O G s
 
21.05.15
10:15
Индексировать ВТ надо вообще очень - очень редко и со смыслом.
67 Lamer1C
 
21.05.15
10:18
проголосовать забыл

Временные таблицы быстрее
68 MrStomak
 
21.05.15
10:20
(54) Да ничего не отдельно, дописывает свои убийственные фильтры к обычным запросам.
69 Вася Теркин
 
21.05.15
10:21
(54) Тогда RLS не снижает нагрузку на SQL и не увеличивает? Все тормоза от RLS возникают в Сервере 1С?
70 MrStomak
 
21.05.15
10:23
(69) RLS увеличивает нагрузку на SQL вплоть до полной неработоспособности.
71 Вася Теркин
 
21.05.15
10:23
54 это исключает
72 MrStomak
 
21.05.15
10:24
(71) (54) ошибается
73 Вася Теркин
 
21.05.15
10:24
Если верить (54) SQL при включенном и выключенном RLS делает одинаково.
74 ДенисЧ
 
21.05.15
10:25
(73) Верить надо своим глазам и показаниям профайлера. А тот говорит совсем другое
75 Вася Теркин
 
21.05.15
10:25
(72) Тогда (53) прав и 1С сама себе сильно очень противоречит, применяя в RLS вложенные запросы, а не ВТ.
76 Вася Теркин
 
21.05.15
10:26
Я понимаю что фраза "1С сама себе сильно очень противоречит" сакраментльна, но все же.
77 MrStomak
 
21.05.15
10:27
(75) Нет вложенных запросов и нет ВТ
78 Вася Теркин
 
21.05.15
10:27
(77) Но там дописывается сам запрос...
79 MrStomak
 
21.05.15
10:28
(78) Ты пишешь Выбрать Ссылка из Справочник.Номенклатура, RLS дописывает Левое соединение РегистрСведений.ГруппыДоступаНоменклатуры бла-бла-бла
80 MrStomak
 
21.05.15
10:33
(0) Тема с провокационным названием.
Мне кажется автор всё понимает и просто троллит:)
81 AlexITGround
 
21.05.15
11:58
Голосувалка вообще ниКчерту, синим или красным... зависит от ситуации. Нельзя в общем случае сказать 1, 2 или 3, поэтому позовите специалиста.

Позовите специалиста
82 John83
 
21.05.15
13:01
странно, что никто не упомянул, на тему удаления ВТ
83 vi0
 
21.05.15
13:08
(82) а что именно?
84 PePaRiTB
 
21.05.15
13:12
(82) Временная таблица будет удалена в любом из следующих вариантов:
1. в запросе использована команда УНИЧТОЖИТЬ
2. вызван метод МенеджерВременныхТаблиц.Закрыть()
3. объект МенеджерВременныхТаблиц перестал существовать, например, завершилась работа процедуры/функции, которая породила этот объект, или пользователь закрыл программу
85 PePaRiTB
 
21.05.15
13:13
Следовательно 1с подчищяет за программистом и самому это нужно делать если используются большие запросы, либо МенеджерВременныхТаблиц, чтобы освободить ресурсы.
86 John83
 
21.05.15
13:32
(84) меня больше всего интересует 3ий пункт
мне говорили, что если ВТ не УНИЧТОЖИТЬ, то она так и осядет в temp, до перезагрузки сервака
87 ДенисЧ
 
21.05.15
13:35
(86) И кто тебе такое врал?
88 PePaRiTB
 
21.05.15
13:35
(86) похоже на ложь. Ибо можно проверить, создать кучу таблиц и посмотреть размер tempdb, с точкой останова после выполнения запроса естественно (размер увеличиться). Затем продолжить и посмотреть размер (должен уменьшиться).

OFF: (63) да есть такое :)
89 Drac0
 
21.05.15
13:36
(14) статья была от разрабов недавно по этому поводу.
90 PePaRiTB
 
21.05.15
13:37
+ (88) так же возможно, что 1с закэширует результат запроса и освободит tempdb после выполнения.
91 PePaRiTB
 
21.05.15
14:03
Проверил у себя. Выполнял разные методы от сразу уничтожения до менеджера. Что понял 1с реально подметает.

При Запрос.Выполнить с выборкой данных сразу удаляет ВР после использования и хранит где-то в кэше 1с.

При использовании менеджера ВТ хранит Вт в tempdb (исходя из увеличения веса tempdb на 5 мб) до выхода из функции.

Количество временных таблиц при это не изменно. В продакшене таблиц значительно больше, но вес базы на 10-20 выше (работа закончилась).

Следовательно все что написано выше правда. ВТ самоликвидируются.

Код (писал на скору руку ут 11):

МенеджерВТ    = Новый МенеджерВременныхТаблиц;
    
    Запрос        = Новый Запрос;
    Текст        =
    "ВЫБРАТЬ
    |    Партнеры.Ссылка
    |ПОМЕСТИТЬ Врем
    |ИЗ
    |    Справочник.Партнеры КАК Партнеры
    |  ОБЪЕДИНИТЬ ";
    
    Для Каждого Документ Из Метаданные.Документы Цикл
        Текст = Текст + "
        |ВЫБРАТЬ Ссылка ИЗ Документ." + Документ.Имя + "
        |ОБЪЕДИНИТЬ ";
    КонецЦикла;
    
    Запрос.Текст    = Лев(Текст, СтрДлина(Текст) - СтрДлина(" ОБЪЕДИНИТЬ ")) +
    ";
    |ВЫБРАТЬ
    |    *
    |ИЗ
    |    Врем КАК Врем ";
    //Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Результат        = Запрос.Выполнить();
92 H A D G E H O G s
 
21.05.15
14:06
(88) " Затем продолжить и посмотреть размер (должен уменьшиться). "

Тебе еще и про SQL наврали.
93 РазДва
 
21.05.15
14:18
(64) А как 1С сейчас(8.3.6.xxxx) именует временные таблицы? Во многих запросах 1С сама по себе создает временные таблицы именует их по своим принципам, и во второй раз получается вполне себе свеженький запрос, который заново компилируется.
94 H A D G E H O G s
 
21.05.15
14:20
(93) Нормально. Поправили.
95 PePaRiTB
 
22.05.15
04:49
(92) можешь сам проверить, описал в (91)
96 Вася Теркин
 
22.05.15
05:30
(80) Автор не тролит. Он даже не пишет уже. Просто смотрит кто ту кит, а кто слон.
97 vogenut
 
22.05.15
09:23
(0) Что за дурацкие вопросы... и не менее дурацкие ответы
98 vogenut
 
22.05.15
09:42
(0) Вася, вот скажи мне, что быстрее BMW или Mercedes?
99 Вася Теркин
 
25.05.15
14:27
(98) Прогресс. Но эта информация засекречена.
100 Вася Теркин
 
25.05.15
14:27
Все. Выдохлись на сотке.
101 Basilio
 
25.05.15
14:32
Временные таблицы замедляют выполнение запросов. Но. При их использовании СУБД будет строить более оптимальный план и как следствие МОЖНО получить увеличение скорости.
Нужно понимать, что временные таблицы это дополнительная запись данных в память. Если они будут слишком большими это существенно замедлит выполнение запроса.
102 SUA
 
25.05.15
14:45
в 90% случаев (по собственному опыту) временные таблицы быстрее - если их правильно готовить, временем записи в оперативу можно часто пренебречь (конечно, если там не продажи с остатками на каждый день за год - но при этом ВЗ может умереть совсем)

Попробуй
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс