Имя: Пароль:
1C
1С v8
Почему запрос выполняется медленней чем он же помещенный во временную таблицу?
0 ilove1ass
 
20.05.14
15:36
Имеется два запроса. Первый выполняется вдвое дольше чем второй. Почему?
Первый
    "ВЫБРАТЬ
    |    МойДокумент.Ссылка КАК Ссылка,
    |    МойДокумент.ВерсияДанных КАК Версия
    |ИЗ
    |    Документ.МойДокумент КАК МойДокумент"

Второй
    "ВЫБРАТЬ
    |    МойДокумент.Ссылка КАК Ссылка,
    |    МойДокумент.ВерсияДанных КАК Версия
    |ПОМЕСТИТЬ МойДокументВременная
    |ИЗ
    |    Документ.МойДокумент КАК МойДокумент
    |;
    |
    |/////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    МойДокумент.Ссылка
    |ИЗ
    |    МойДокументВременная КАК МойДокумент"
1 ilove1ass
 
20.05.14
15:37
При этом если сделать вот так то первый запрос выполняется быстрее второго.
Первый
    "ВЫБРАТЬ
    |    МойДокумент.Ссылка КАК Ссылка
    |ИЗ
    |    Документ.МойДокумент КАК МойДокумент"

Второй
    "ВЫБРАТЬ
    |    МойДокумент.Ссылка КАК Ссылка
    |ПОМЕСТИТЬ МойДокументВременная
    |ИЗ
    |    Документ.МойДокумент КАК МойДокумент
    |;
    |
    |/////////////////////////////////////////////////////////////

    |ВЫБРАТЬ
    |    МойДокумент.Ссылка
    |ИЗ
    |    МойДокументВременная КАК МойДокумент"
2 rozer76
 
20.05.14
15:37
ну так временную таблицу еще создать надо
3 МихаилМ
 
20.05.14
15:37
кэширование
4 ilove1ass
 
20.05.14
15:38
(3) Кэширование чего? Результат одинаков независимо от порядка выполнения запросов.
5 acsent
 
20.05.14
15:39
Второй небось выполняется сразу после первого без перезагрузки скл?
6 Zero on a dice
 
20.05.14
15:41
меня смущает, что во втором не выбирается версия данных - и не передается в результат, как следствие.
кэш, имхо не причем, т.к., уверен, автор повторил опыт.
7 hhhh
 
20.05.14
15:42
(4) перезагрузите компьютеры. После этого запускайте второй запрос, а за ним первый.
8 Крошка Ру
 
20.05.14
15:42
(0) Потому что таблица документа физически может находиться в разных таблицах и для её выборки создаются подзапросы, ВТ помещается в одну
9 ilove1ass
 
20.05.14
15:44
(5) Нет. Оно проверялось неоднократно с разным набором полей. Короткий запрос выполняется вторым для чистоты эксперимента.
10 ilove1ass
 
20.05.14
15:48
(8) Это понятно. Но почему первый запрос работает медленней. Ведь и в первом и во втором эти данные все равно нужно выбрать. независимо от того требуется их просто вернуть в 1с или предварительно записать во временную таблицу.
11 Леша1с
 
20.05.14
15:49
ВерсияДанных - сама по себе таблица, а не поле, и идет соединение неявное в первом случае.
Во втором - выборка в ВТ быстрее проходит.
Считаю, что проблема в 1С - непродуманный (если вообще "думанное") механизм неявного соединения, отсюда и тормоза.
12 ilove1ass
 
20.05.14
15:51
(11) То есть один и то же набор данных для временной таблицы отбирается быстрее чем просто так?
13 Крошка Ру
 
20.05.14
15:52
(12) Во втором случае все таблицы по очереди складываются в ВТ, а в первом - вложенные запросы.
Ну и (11), да
14 Zero on a dice
 
20.05.14
15:53
а так какой результат?
"ВЫБРАТЬ
    |    МойДокумент.Ссылка КАК Ссылка,
    |    МойДокумент.ВерсияДанных КАК Версия
    |ПОМЕСТИТЬ МойДокументВременная
    |ИЗ
    |    Документ.МойДокумент КАК МойДокумент
    |;
    |
    |/////////////////////////////////////////////////////////////

    |ВЫБРАТЬ
    |    МойДокумент.Ссылка,
    |    МойДокумент.Версия
    |ИЗ
    |    МойДокументВременная КАК МойДокумент"
15 vi0
 
20.05.14
15:56
(11) > ВерсияДанных - сама по себе таблица, а не поле
это откуда инфа?
16 Леша1с
 
20.05.14
15:56
(12) в данном "неявном" случае соединения - да.
ВТ всегда выигрывает против неявного соединения.
Другое дело, что ВерсияДанных никогда в 1С не была ПОЛЕМ, а отдельной хрень-таблицей....
17 el7cartel
 
20.05.14
15:57
(0)есть вещь такая, называется книга! не мешало бы ее почитать)))
18 Леша1с
 
20.05.14
15:57
(15) да тут на мисте, в славные времена "от двадцатитысячников" как-то обсуждалось.
19 vi0
 
20.05.14
15:58
(18) ты сам так считаешь, что версия это таблица?
20 H A D G E H O G s
 
20.05.14
15:59
(19) Лешу я записал в свой список, можно не продолжать эту тему.
21 acsent
 
20.05.14
16:00
Леша, лучше молчи, за умного сойдешь
22 H A D G E H O G s
 
20.05.14
16:00
Автор неправильно меряет и, возможно, скоро мы выясним забавные подробности.
23 ilove1ass
 
20.05.14
16:01
(14) Обратный. С виртуальной таблицей выполняется процентов на 10 быстрее чем без нее.
24 ilove1ass
 
20.05.14
16:02
(17) И какую книгу ты можешь порекомендовать для чтения по этому поводу?

(0)+ Кстати это не только с версией данных. Если обычных реквизитов документа штук пять вместо версии данных отобрать, то эффект похожий только менее явно выражен.

(22) Не исключаю.
26 Леша1с
 
20.05.14
16:38
(20) огласите весь список (с)
27 vi0
 
20.05.14
16:39
(24) а как ты меряешь?
28 Серго62
 
20.05.14
16:39
Чем меньше полей в запросе, тем быстрее он выполняется. Имеется ввиду результирующий запрос. Думаю это объясняется тем, что чем меньше полей, тем меньший объем нужно прочитать и передать на клиента, который который сделал запрос.
29 Леша1с
 
20.05.14
16:43
(28) тут до клиента еще проблемы.
Это общая неоптимизнутость в связке 1С - СУБД.
30 H A D G E H O G s
 
20.05.14
16:46
(29) Ты сравнивал производительность в profiler и в замере производительности?
31 ilove1ass
 
20.05.14
16:47
(27) Отладка > Замер производительности. И кручу оба запроса в цикле по 10 раз. Потом смотрю циферки.
32 Серго62
 
20.05.14
16:47
(29) Ты не поверишь, в самом sql, такая же фигня. Иногда достаточно выбросить из запроса 1 поле для существенного ускорения запроса. Запрос выполняется непосредственно в менеджмент - студии, то есть инструментальными средствами самой СУБД.
33 ilove1ass
 
20.05.14
16:47
(30) Нет. :(
34 H A D G E H O G s
 
20.05.14
16:52
(32) "Иногда достаточно выбросить из запроса 1 поле для существенного ускорения запроса"

Держите indexSeek вместо indexseek+keylookup или даже tablescan/indexscan
35 H A D G E H O G s
 
20.05.14
16:52
(31) Вот ты и попался.
36 H A D G E H O G s
 
20.05.14
16:54
(31) Бери 100500 строчную таблицу и делай по одному запросу каждого вида, перезагружая sql (и сервер 1С) перед каждым запросом.
37 ilove1ass
 
20.05.14
16:56
(36) Это будет проблематично. Пользователи расстроятся. :( А в чем именно я облажался? Думаешь кэширование?
38 H A D G E H O G s
 
20.05.14
16:58
(37) Знаю, что кэширование.
Хотя, это не отменяет твоего парадокса в (0)
39 H A D G E H O G s
 
20.05.14
16:59
Парадокс может быть объяснен RLS кстати
40 Серго62
 
20.05.14
17:01
(34) Я как бы немного о другом пытался сказать. Имелось ввиду то, что количество полей в результирующем запросе влияет на время выполнения запроса. Особенно ярко этот эффект проявляется если в перечень полей добавлять/удалять поля из присоединенной таблицы. Если таблицы большие, то не надо ничего перезагружать даже, все видно невооруженным глазом.
41 Серго62
 
20.05.14
17:02
(39) Кстати да.
42 H A D G E H O G s
 
20.05.14
17:12
(40) Тоже самое можно сказать про поля класса image и nvarchar
43 ilove1ass
 
20.05.14
17:14
(39) Не отменяет. А причем тут РЛС? Полные права же.
44 erp20
 
20.05.14
19:49
(31) Некорректное сравнение. Чтобы оценить и сравнить производительность тебе нужно выполнить след. действия:

1) Выполнить первый запрос. Зафиксировать информацию о его длительности имеющимися средствами.

2) В management studio выполнить запрос:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

3) Выполнить второй запрос. Зафиксировать информацию о его длительности имеющимися средствами. Сравнить результаты замеров производительности запросов.

ps. Такие замеры производить только на тестовых серверах (в крайнем случае на продакшн, но после завершения/до начала "рабочего дня").
45 Леша1с
 
21.05.14
11:54
(32)" Ты не поверишь, в самом sql, такая же фигня"
вообще, мы тут работаем с одноэсовыми данными, а не нормализованными, поэтому даже в SQL неявное соединение (развернутое в запросе SQL) - будет тормознее.