|
Почему запрос выполняется медленней чем он же помещенный во временную таблицу? | ☑ | ||
---|---|---|---|---|
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) - будет тормознее. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |