|
Оптимизация запроса (вопрос с собеседования) | ☑ | ||
---|---|---|---|---|
0
AsadRoman
01.08.17
✎
14:04
|
Одна из фирм-франчази прислала в качестве тестового задания. Мне не для получения результата (он уже отрицательный), а для себя: как это все-таки нужно сделать?
Собственно задание: Есть запрос, нужно его оптимизировать. ТекстЗапроса = "ВЫБРАТЬ | ЗакупкиОбороты.Контрагент |ПОМЕСТИТЬ ВТ_Контрагенты |ИЗ | РегистрНакопления.Закупки.Обороты( | &ДатаНачала, | &ДатаОкончания, | , | Организация = &Организация | И Валюта = &Валюта) КАК ЗакупкиОбороты |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВЫБОР | КОГДА УправленческийДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетГруппа) | ТОГДА УправленческийДвиженияССубконто.СубконтоДт1 | ИНАЧЕ УправленческийДвиженияССубконто.СубконтоКт1 | КОНЕЦ КАК Контрагент, | ВЫБОР | КОГДА УправленческийДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетГруппа) | ТОГДА УправленческийДвиженияССубконто.СубконтоДт1.Описание | ИНАЧЕ УправленческийДвиженияССубконто.СубконтоКт1.Описание | КОНЕЦ КАК ОписаниеКонтрагента, | УправленческийДвиженияССубконто.Сумма, | УправленческийДвиженияССубконто.Регистратор, | УправленческийДвиженияССубконто.Содержание |ИЗ | РегистрБухгалтерии.Управленческий.ДвиженияССубконто( | &ДатаНачала, | &ДатаОкончания, | Организация = &Организация | И ((СчетДт В ИЕРАРХИИ (&СчетГруппа) | И СубконтоДт1 В | (ВЫБРАТЬ | ВТ_Контрагенты.Контрагент | ИЗ | ВТ_Контрагенты)) | ИЛИ (СчетКт В ИЕРАРХИИ (&СчетГруппа) | И СубконтоКт1 В | (ВЫБРАТЬ | ВТ_Контрагенты.Контрагент | ИЗ | ВТ_Контрагенты))), | , | ) КАК УправленческийДвиженияССубконто"; |
|||
4
toypaul
гуру
01.08.17
✎
14:11
|
1. .СубконтоДт1.Описание - соединить с нужной таблицей
2. сначала получить список счетов как (2) 3. (3) |
|||
5
vde69
01.08.17
✎
14:12
|
еще можно индексировать временную таблицу, но тут надо смотреть на базе, ибо это может как плюсом пойти так и минусом
|
|||
6
vde69
01.08.17
✎
14:13
|
а... вижу чего нужно оптимизировать.... классика !!!! составной тип субконто!!!
|
|||
7
Fragster
гуру
01.08.17
✎
14:14
|
заменить ИЛИ на объединение
|
|||
8
Fragster
гуру
01.08.17
✎
14:14
|
(6) нет
|
|||
9
Fragster
гуру
01.08.17
✎
14:15
|
(8) хотя да, в выбранных полях вижу
|
|||
10
toypaul
гуру
01.08.17
✎
14:15
|
(7) не факт. от слова совсем
|
|||
11
vde69
01.08.17
✎
14:16
|
(8) типа этого
И Выразить(СубконтоКт1, Справочник.Контрагент) В .... |
|||
12
vi0
01.08.17
✎
14:23
|
(10) так не факт или от слова совсем?
и почему совсем? |
|||
13
vi0
01.08.17
✎
14:24
|
(6) вроде с субконто нет такой проблемы как с составными типами
|
|||
14
toypaul
гуру
01.08.17
✎
14:26
|
(12) совсем не факт. с учетом что "задание от франча". п.1 было достаточно.
ИЛИ это уже для тех кто понимает структуру таблиц и оптимизацию на СКЛе. да и не понятно как в этом запросе правильно получить нужный набор объединением. а в итоге не обязательно, что такой запрос будет быстрее. |
|||
15
toypaul
гуру
01.08.17
✎
14:27
|
(13) а чо это нет-то. очень даже есть. или точнее может быть. если Описание есть не только у контрагентов, то хапнешь все таблицы. а нужны только Контрагенты.
это же задание франча ... |
|||
16
Wirtuozzz
01.08.17
✎
14:32
|
А как же индексировать По контрагенту в первой ВТ? Надо индексировать, ведь по контрагенту будут потом соединяться таблицы.
|
|||
17
vde69
01.08.17
✎
14:34
|
(16) зависит от величины ВТ, если сотня другая - индексировать во вред, если тысячи - индексировать надо, а вообще я уже писал здесь про индексирование ВТ
|
|||
18
Wirtuozzz
01.08.17
✎
14:35
|
(17) Сори, я как истинный гений прочитал вопрос, потом написал что думаю, а только потом начал читать что пишут остальные.
|
|||
19
Buster007
01.08.17
✎
14:39
|
А почему нельзя взять просто таблицу Обороты?
|
|||
20
Fragster
гуру
01.08.17
✎
14:40
|
(11) вот это точно нет
|
|||
21
Мыш
01.08.17
✎
14:43
|
(0) Какие критерии оптимизации? Скорость выполнения, читабельность запроса, угадать желания составителя задачи? )
|
|||
22
Fragster
гуру
01.08.17
✎
14:43
|
(14) как получить - понятно. вообще таблица "движения с субконто" работает немного не так, как другие "виртуальны"
|
|||
23
organizm
01.08.17
✎
14:44
|
Для субконто поставить ВЫРАЗИТЬ
|
|||
24
vde69
01.08.17
✎
14:48
|
(20) почему???
посмотри план запроса в скуле, у меня нет под рукой |
|||
25
organizm
01.08.17
✎
14:52
|
+(24) точно!
|
|||
26
organizm
01.08.17
✎
14:54
|
ВТ можно не индексировать, т.к. все-равно нигде по не отбор соединение не используется.
|
|||
27
organizm
01.08.17
✎
14:56
|
И вообще может лучше ОборотыДтКт использовать?
|
|||
28
organizm
01.08.17
✎
14:57
|
еще можно вложенный запрос сделать, чтобы конструкцию ВЫБОР не делать дважды
|
|||
29
AsadRoman
01.08.17
✎
15:07
|
Сделал вот так:
// По первому запросу: добавил "различные" чтобы избежать дублирования контрагентов // По второму запросу применил внутреннее соединение. Считаю применение его более оптимальным. ТекстЗапроса = "ВЫБРАТЬ различные | ЗакупкиОбороты.Контрагент |ПОМЕСТИТЬ ВТ_Контрагенты |ИЗ | РегистрНакопления.Закупки.Обороты( | &ДатаНачала, | &ДатаОкончания, | , | Организация = &Организация | И Валюта = &Валюта) КАК ЗакупкиОбороты |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВЫБОР | КОГДА УправленческийДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетГруппа) | ТОГДА УправленческийДвиженияССубконто.СубконтоДт1 | ИНАЧЕ УправленческийДвиженияССубконто.СубконтоКт1 | КОНЕЦ КАК Контрагент, | ВЫБОР | КОГДА УправленческийДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетГруппа) | ТОГДА УправленческийДвиженияССубконто.СубконтоДт1.Описание | ИНАЧЕ УправленческийДвиженияССубконто.СубконтоКт1.Описание | КОНЕЦ КАК ОписаниеКонтрагента, | УправленческийДвиженияССубконто.Сумма, | УправленческийДвиженияССубконто.Регистратор, | УправленческийДвиженияССубконто.Содержание |ИЗ | РегистрБухгалтерии.Управленческий.ДвиженияССубконто( | &ДатаНачала, | &ДатаОкончания, | Организация = &Организация | И (СчетДт В ИЕРАРХИИ (&СчетГруппа) | ИЛИ СчетКт В ИЕРАРХИИ (&СчетГруппа)), | , | ) КАК УправленческийДвиженияССубконто | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Контрагенты КАК ВТ_Контрагенты | ПО (ВЫБОР | КОГДА УправленческийДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетГруппа) | ТОГДА УправленческийДвиженияССубконто.СубконтоДт1 | ИНАЧЕ УправленческийДвиженияССубконто.СубконтоКт1 | КОНЕЦ = ВТ_Контрагенты.Контрагент)"; получил ответ: 1. - "По первому запросу: добавил "различные" чтобы избежать дублирования контрагентов" - Не согласен. виртуальные таблицы возвращают результат в максимально сгруппированном виде - "По второму запросу применил внутреннее соединение. Считаю применение его более оптимальным." - Не согласен. Соединение с виртуальными таблицами может очень сильно замедлить время выполнения запроса на некоторых данных. - Обращение через точку к полю составного типа не исправлено. Если по последнему пункту понятно, то по остальному: Что нужно-то? |
|||
30
AsadRoman
01.08.17
✎
15:08
|
Я так с первыми двумя возражениями не согласен. Особенно напрягает слово "может". А может не может?
|
|||
31
vde69
01.08.17
✎
15:17
|
>>>виртуальные таблицы возвращают результат в максимально сгруппированном виде
что-то я сомневаюсь, можно ссылочку? >>>Соединение с виртуальными таблицами может очень сильно замедлить время выполнения запроса на некоторых данных. от части так и есть, проблема вт в том, что по ним оптимизатору скуля сложно построить оптимальный план запросов, но с другой стороны если мы попадаем в кластерезованый индекс по началу ключа - то выигрыш будет существенным... в примере условие не попадает в кластерезованный индекс из-за кучи моментов, по этому при построении виртуальной таблице будет использоватся фул скан, да это не оптимально, но в 1с много чего сделано гораздо хуже... |
|||
32
toypaul
гуру
01.08.17
✎
15:20
|
(30) в 1 ответе какой-то бред написали, во 2 ответе написали правильно. отбирать надо стараться внутри вирт таблицы (особенно если отбор мало записей содержит). тем более ты таблицу криво соединил.
учиться тебе еще ... |
|||
33
vi0
01.08.17
✎
15:22
|
(32) в первом верно
Учится тебе ещё.. |
|||
34
Cyberhawk
01.08.17
✎
15:23
|
(33) http://tsya.ru/
|
|||
35
AsadRoman
01.08.17
✎
15:23
|
(32) Ну и как в этом случае соединять?
|
|||
36
AsadRoman
01.08.17
✎
15:25
|
(34) Да не русский язык мы тут изучаем...
А недоязык недопрограммистов. |
|||
37
vi0
01.08.17
✎
15:25
|
(14) нет логики в твоих словах
У него задача оптимизировать Если тебе что то не понятно то читай документацию |
|||
38
Широкий
01.08.17
✎
15:25
|
Выразить нет - самый главный косяк. Он у тебя типа контрагенты
|
|||
39
vi0
01.08.17
✎
15:27
|
(36) с таким настроем недалеко ты пойдешь
|
|||
40
Широкий
01.08.17
✎
15:27
|
+ (38) Это когда описание достаешь
|
|||
41
X Leshiy
01.08.17
✎
15:27
|
(36) А по каким критериям недоязык и недопрограммисты?
Я вот, обиделся! |
|||
42
Адинэснег
01.08.17
✎
15:28
|
положат субд
СчетДт В ИЕРАРХИИ (&СчетГруппа) |
|||
43
AsadRoman
01.08.17
✎
15:30
|
(39) А что юмор сегодня дома оставил? или на работе забыл?
|
|||
44
AsadRoman
01.08.17
✎
15:31
|
(41) Ну извини. Я ведь себя тоже туда отношу.
|
|||
45
X Leshiy
01.08.17
✎
15:32
|
(44) Ну судя по теме да, ты именно такой ))
|
|||
46
vi0
01.08.17
✎
15:32
|
(43) настрой он ведь в шутках проявляется
|
|||
47
AsadRoman
01.08.17
✎
15:33
|
(42) Тогда еще одна временная таблица?
выбрать счета из плана счетов из этой группы. Тогда не положит? |
|||
48
Широкий
01.08.17
✎
15:36
|
(47) Он со справочником путает. Вложенность у счетов небольшая - трогать не стоит
|
|||
49
toypaul
гуру
01.08.17
✎
15:37
|
(33) чему учиться - всякой бредятине от франчей что ли?
накой скажи грузить зря СКЛ таблицей отбора в 1000 строк, когда по факту в ней всего 2 строки. да СКЛ может за тебя подумать, но факт такой, что может и не подумать. так что в 1 ответе бредятина. ну возвращает сгрупипровано и чо. какая связь тут с оптимизацией-то. |
|||
50
runoff_runoff
01.08.17
✎
15:39
|
(2) РАЗЛИЧНЫЕ не надо.. виртуальные таблицы уже свернуты по умолчанию..
|
|||
51
Cyberhawk
01.08.17
✎
15:41
|
(49) Так в выборе одно поле-измерение, поэтому и вернет одну строку
|
|||
52
Cyberhawk
01.08.17
✎
15:41
|
+(51) не так выразился, ну ты понял :) Я не понял про "грузить зря СКЛ таблицей отбора в 1000 строк"
|
|||
53
toypaul
гуру
01.08.17
✎
15:46
|
(50) а. доперло. ну это так ... может когда-то сработать, а когда-то и нет.
|
|||
54
vi0
01.08.17
✎
15:50
|
(53) интересно, и когда это не сработает?
ты останови поток сознания, сначала думаю потом пиши сюда |
|||
55
ptiz
01.08.17
✎
16:00
|
(29) Нехорошо так.
Подытожу. Условие разбить на объединиие двух запросов: 1) СчетДт В (ВЫБРАТЬ Счет из ВТСчета) И СубконтоДт1 В(...) 2) СчетКт В (ВЫБРАТЬ Счет из ВТСчета) И СубконтоКт1 В(...) |
|||
56
AsadRoman
01.08.17
✎
16:04
|
(55) И соединить с контрагентами, чтобы избавиться от "через точку"
|
|||
57
vi0
01.08.17
✎
16:08
|
(56) ты сначала проверь профайлером, что реально есть такая необходимость
помню, что был ньанс или же так работает если условие по виду субконто задать в параметрах вирт таблицы.. |
|||
58
vde69
01.08.17
✎
16:10
|
(56) поле "описание" лучше вытащить еще во ВТ
|
|||
59
runoff_runoff
01.08.17
✎
16:10
|
(53) всегда, если указаны измерения (без точек с подчиненными полями)..
|
|||
60
Dzenn
гуру
01.08.17
✎
16:16
|
Однозначно убрать ИЛИ — его плохо переносит SQL
|
|||
61
AsadRoman
01.08.17
✎
16:24
|
(58) А вдруг описание - поле неограниченной длины? Тогда только через выразить?
|
|||
62
H A D G E H O G s
01.08.17
✎
17:04
|
Дичь дикая творица.
|
|||
63
Бубр
02.08.17
✎
16:06
|
+к вышесказанному активность = истина поставить в условие движенияссубконто иначе попадут неактивные проводки;
по максимуму убрать из параметра виртуальной таблицы соединение параметров по И (сколько И будет столько сканов таблицы и будет при наложении условий) |
|||
64
Бубр
02.08.17
✎
16:09
|
(31)>>>виртуальные таблицы возвращают результат в максимально сгруппированном виде
за группировку выборки из виртуальной таблицы на экзаменах спец. по платформе баллы режут |
|||
65
rphosts
02.08.17
✎
16:12
|
(62) ну дай свой вариант что ли
|
|||
66
Hmster
02.08.17
✎
16:46
|
Радуйся что тебя туда не взяли. Оптимизировать надо не запросы, а алгоритмы. ДвижениеССубконто, насколько помню, очень тормознутая вещь. я бы вообще обороты счета использовал через левое соединение с контрагентами
|
|||
67
karabas11
02.08.17
✎
17:04
|
Автор запрос сделал еще хуже чем был.
|
|||
68
youalex
02.08.17
✎
17:08
|
можно счета запихнуть в первую же вт(все ко всем и с учетом иерархии счетов)
а параметрах вирта условие переписать на типа (СчетДТ, СубконтоДт1) В (ВЫБРАТЬ ВТ_Контрагенты.Счет, ВТ_Контрагенты.Контрагент ИЗ ВТ_Контрагенты.Контрагент) |
|||
69
youalex
02.08.17
✎
17:11
|
(49) >так что в 1 ответе бредятина.
Это был ответ на использование РАЗЛИЧНЫЕ, которое в данном случае - не имеет смысла. |
|||
70
H A D G E H O G s
02.08.17
✎
17:17
|
(65)
Первым делом - Выбрать Различные в 1 запросе. Если поставщиков мало, считанные единицы и Период мал- сделал бы как автор, ну, естественно, избавившись от В Иерархии в условиях, и, возможно, заменив ИЛИ на Объединение. Если поставщиков дофига, но период мал - то я бы отказался от бессмысленной ВТ и соединял бы ВнутренниеСоединением ДвиженияССубконто с Оборотами по РН, даже если бы разбил запрос на 2 с Объединить. В любом случае, я бы не Индексировал бы ВТ, так как это бессмысленно в 95% случаях и не писал бы какие - то условия в связи таблиц, как в (29). |
|||
71
H A D G E H O G s
02.08.17
✎
17:18
|
пардон, да, Различные тут не нужны.
|
|||
72
H A D G E H O G s
02.08.17
✎
17:18
|
(70) "сделал бы как автор"-> сделал бы как в (0).
|
|||
73
Cyberhawk
02.08.17
✎
17:20
|
(64) "за группировку выборки из виртуальной таблицы на экзаменах спец. по платформе баллы режут" // Если в выборе не измерение, а реквизит измерения, то группировка нужна
|
|||
74
Вафель
02.08.17
✎
17:34
|
(70) двойка тебе. ВТ Обороты сама выбирает различные
|
|||
75
H A D G E H O G s
02.08.17
✎
17:43
|
(74) см (71)
|
|||
76
Бубр
02.08.17
✎
18:29
|
(73) если реквизит то да, но это отдельная история :)
|
|||
77
rphosts
03.08.17
✎
05:06
|
(70) "В иерархии" просто убивает производительность! Почему многие это игнорирут?!
|
|||
78
neckto
03.08.17
✎
08:24
|
Прогнал запрос на рабочей ИБ с замером через профайлер. Наибольший прирост производительность дало "Выразить" у составного субконто и замена "ИЛИ" на объединение запросов. Duration до 1100, после "Выразить" Duration 500, после замены "ИЛИ" Duration 300.
Замена "В иерархии" на ВТ прироста не показало, но, скорей всего, потому что был указан один счет (60). |
|||
79
ИС-2
naïve
03.08.17
✎
08:50
|
1) добавить Различные в:
ВЫБРАТЬ | ЗакупкиОбороты.Контрагент 2) вместо иерархии использовать связь по Родителю (считаем, что может 2 уровня иерхии в плане счетов) |
|||
80
toypaul
гуру
03.08.17
✎
09:00
|
(79) уже выяснили что различные тут лишнее :)
|
|||
81
vi0
03.08.17
✎
09:41
|
(79)
2) дваждый плохой совет мало того, что будет соединение из за родителя, так еще и неустойчивое допущение делаешь насчет количества уровней |
|||
82
milan
03.08.17
✎
09:46
|
(77) В иерархии заменяется списком счетов, получаемым отдельным запросом, в чем там убийство?
|
|||
83
Бубр
03.08.17
✎
14:03
|
в иерархии можно заменить таким запросиком
ВЫБРАТЬ Хозрасчетный.Ссылка ИЗ ПланСчетов.Хозрасчетный КАК Хозрасчетный ГДЕ (Хозрасчетный.Ссылка В (&сСсылка) ИЛИ НЕ 1 В (ВЫБРАТЬ 1 КАК Поле1 ИЗ ПланСчетов.Хозрасчетный КАК Хозрасчетный ГДЕ Хозрасчетный.Ссылка В (&сСсылка))) |
|||
84
Бубр
03.08.17
✎
14:11
|
(82) очень долго будет. в типовых нигде не видел чтобы В ИЕРАРХИИ использовалось...всегда создается СписокСчетов заполняется до запроса и передается в виде параметра.
|
|||
85
aleks_default
03.08.17
✎
14:27
|
(82)Там запрос рекурсивно строится кажется. В этом.
|
|||
86
milan
03.08.17
✎
14:28
|
(84) не поленился, посмотрел, бух корп 3.0 - 736 раз используется условие "в иерархии", это только тексты модулей.
|
|||
87
Бубр
03.08.17
✎
15:29
|
(86) посмотри кассовую книгу например
|
|||
88
senior
03.08.17
✎
15:41
|
(36) Ну так а какого лешего ты ходил устраиваться на недоязык, а теперь еще у недопрограммистов решил спросить почему тебя не взяли?
|
|||
89
Вафель
03.08.17
✎
15:58
|
Неужели 1С до сих пор не поправила В ИЕРАРХИИ, и ужас из (83) лучше?
|
|||
90
Вафель
03.08.17
✎
16:02
|
мне кажется это все предрассудки от версии 8.1
|
|||
91
Бубр
03.08.17
✎
16:04
|
(89) не тестил, но "ужас" из (83) во всех рлс используется тк там в иерархии нет возможности применить)
|
|||
92
Широкий
03.08.17
✎
16:08
|
Навскидку не вижу как этот запрос можно переделать на объединение без потери скорости.
|
|||
93
Вафель
03.08.17
✎
16:10
|
(91) у меня этот запрос не получает иерархию
|
|||
94
Бубр
03.08.17
✎
16:21
|
(93) он не дает иерархию... она работает как иерархия... если сСылка список пустой то запрос вернет весь план (8.3)
в 8.2 не вернет |
|||
95
Господин ПЖ
03.08.17
✎
16:26
|
мне (83) запросы из RLS напоминает...
|
|||
96
Бубр
03.08.17
✎
16:27
|
(93) а если ты выбираешь сСылка не пустой то в выборке будут подчиненные элементы
(95) так и есть |
|||
97
Вафель
03.08.17
✎
16:28
|
Что значит работает как иерархия?
|
|||
98
Вафель
03.08.17
✎
16:28
|
выбрал счет 62. дал только его
|
|||
99
Вафель
03.08.17
✎
16:29
|
||||
100
Вафель
03.08.17
✎
16:30
|
Там вконце родитель, это я уже игрался
|
|||
101
PiterPrg
03.08.17
✎
16:30
|
(0) ИМХО было достаточно предложить:
1. Поменять РегистрБухгалтерии.Управленческий.ДвиженияССубконто На РегистрБухгалтерии.Управленческий.Обороты В этом случае мы отказываемся от ВЫБОР - КОГДА- ТОГДА И на Счет тоже ставим одно условие. 2. Поменять ....Субконто1.Описание на ВЫРАЗИТЬ(.Субконто1 КАК Справочник.Контрагенты).Описание Ну либо явно связать Субконто1 со Справочником Контрагенты и Описание брать из него 3. Задать параметр "Субконто" в вирт. таблице |
|||
102
Бубр
03.08.17
✎
16:35
|
||||
103
Вафель
03.08.17
✎
16:39
|
(102) но причем здесь в ИЕРАРХИИ, когда (83) ???
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |