|
Ускорить запрос. Пятничный мозговой штурм! | ☑ | ||
---|---|---|---|---|
0
Double_Medved
20.12.19
✎
10:21
|
Добрый день.
Вопрос не влез в заголовок. Сферический конь в вакууме: Есть справочник магазинов. Есть инфа по акциям (сама акция - это документ, в нем период действия , всякие условия, (2 даты - типа с начала декабря по конец декабря), и длинная табличная часть со списком магазинов, тысячи их может быть) Вопрос - как мне ускорить запрос "Какие акции есть 10 декабря в таком-то магазине"? Думаю сделать регистр сведений, с измерением магазин, акция, и ДатаНачала и ДатаКонца. Но меня смущает что 2 даты - регистр делать получается не периодический? Имеет ли смысл делать индексацию полей? Быстрее будет сделать отбор по магазину, положить во временную таблицу, и дальше делать отбор по датам? Или сразу наложить отбор "ДатаЗапроса>=ДатаНачала" и "ДатаЗапроса<=ДатаКонца"? Или лучше вообще при проведении документа типа "акция на декабрь" писать в регистр 31 запись на каждый магазин, на каждый день? Но так что-то совсем дохрена записей будет Пятница, мозговой шторм начинается. Принимаю самые смелые идеи, и буду отписываться какая хрень получается |
|||
1
RomanYS
20.12.19
✎
10:25
|
(0) периодический регистр
или 2 записи: начало и конец с ресурсом состояния, или начало в период конец в ресурс. Проверка в любом случае срезом |
|||
2
Волшебник
20.12.19
✎
10:26
|
Изучи как устроен регистр с кадровыми данными физлиц в ЗУПе.
|
|||
3
Cyberhawk
20.12.19
✎
10:29
|
Так к ТЧ справочника и сделай запрос
|
|||
4
Dmitrii
гуру
20.12.19
✎
10:29
|
Если это задача оперативного учета и необходимо знать текущие действующие прямо сейчас акции, то я бы отказался вообще от дат с указанием периода действия, а хранил бы только актуальные акции, которые действуют.
В другом регистре хранил бы все данные (вместе с периодом действия) и регламентным заданием каждую ночь в 00:01:00 обновлял бы данные из регистра с периодами данные в оперативном регистре. Естественно оперативный регистр не периодический. Но этот изврат имеет смысл, только если производительность действительно критична. В противном случае, например см.(2). |
|||
5
d4rkmesa
20.12.19
✎
10:31
|
(0) Ну допустим: Регистр сведений, периодический(в пределах дня), подчинен регистратору. Измерения: Организация, Получатель (Контрагент или Партнер, или что там у вас в конфе), Номенклатура/Набор номенклатуры, измерение или несколько измерений с условиями акции, Ресурсы: ЗначениеСкидки(если скидка) или Бонус(если скидка натуральная, т.е. другим товаром), Реквизиты: ДатаОкончания(для ограничения результата СрезПоследних).
|
|||
6
Cyberhawk
20.12.19
✎
10:32
|
Самый смак будет, когда захочется узнать какие акции действуют не на конкретный момент времени, а в заданном интервале
|
|||
7
Cyberhawk
20.12.19
✎
10:33
|
+(6) Так что проиндексировать придется оба поля с датами
|
|||
8
Cyberhawk
20.12.19
✎
10:34
|
А уж куда ты их там засунешь - в ТЧ, в реквизиты / ресурсы / измерения периодического / непериодического независимого / зависимого регистра - с этой точки зрения особо не влияет
|
|||
9
Double_Medved
20.12.19
✎
10:43
|
Нужно скорее всего будет и на дату, и на период дат и т.д.
|
|||
10
Double_Medved
20.12.19
✎
10:44
|
(8)То есть скорость будет в основном зависеть от того, индексируемые поля или нет?
|
|||
11
Cyberhawk
20.12.19
✎
10:45
|
(10) Взял бы уже и давно план своего требующего ускорения запроса посмотрел. Сколько строк затронуто, скан там или сик, кластерного или некластерного.
|
|||
12
Double_Medved
20.12.19
✎
10:49
|
(11)База серверная, постгрес. Сколько строк будет пока не знаю, хочется изначально технически правильно сделать.
Насколько я понимаю - лезть в табличную часть документов это совсем не оптимальный запрос, поэтому и спросил - будет ли лучше сделать регистр сведений? |
|||
13
Double_Medved
20.12.19
✎
11:05
|
Создаю тестово 1000 документов по 2000 строк. Не то что фузиновцы
|
|||
14
arsik
гуру
20.12.19
✎
11:07
|
(12) По скорости будет разницы не будет. Что ты по ТЧ запрос сделаешь, что по регистру
|
|||
15
H A D G E H O G s
20.12.19
✎
11:39
|
(0) РС прям как ты описал, порядок измерений другой
Магазин, ДатаНачала и ДатаКонца, акция. Ничего индексировать не надо. |
|||
16
Cyberhawk
20.12.19
✎
11:39
|
(12) "лезть в табличную часть документов это совсем не оптимальный запрос, поэтому и спросил - будет ли лучше сделать регистр сведений?" // С точки зрения производительности чтение ТЧ и чтение регистра - это чтение одной плоской таблицы.
(14) Отличия только в неотключаемых (из коробки) индексах, если читающий запрос в обоих случаях попадает в индекс более-менее одинакового размера и структуры, то отличый быть не должно. |
|||
17
Cyberhawk
20.12.19
✎
11:40
|
(15) Не думаю, что он догадается (по крайней мере планировал) делать дату конца измерением
|
|||
18
Double_Medved
20.12.19
✎
11:56
|
(18)так мне же на Мисте уже так насоветовали. Ща вот проверяю, будет ли толк
|
|||
19
unenu
20.12.19
✎
11:57
|
(0) в ЗУПЕ такие задачи успешно решают технологией "интервальные регистры сведений" и всякие периодические оттуда почти выпилены.
эти механизмы работают быстрее, главное понять как они работают и избавиться от ломки периодических данных. |
|||
20
dk
20.12.19
✎
11:59
|
интересно появятся в 1с произвольные составные индексы? тогда и без регистра сведения можно было бы обойти
|
|||
21
Fragster
гуру
20.12.19
✎
11:59
|
регистр остатков :)
|
|||
22
Fragster
гуру
20.12.19
✎
12:00
|
документ старта акций делает + на начало акции и - на конец
|
|||
23
Double_Medved
20.12.19
✎
12:04
|
Но все равно же пихать в измерение ссылку на сам документ (на акцию).
|
|||
24
Fragster
гуру
20.12.19
✎
12:08
|
(23) ну да
|
|||
25
Double_Medved
20.12.19
✎
12:19
|
Замеры:
1000 документов по 2000 строк Запрос "какие акции действуют на выбранном 1 магазине на конкретную дату" В каждом варианте сделал по 10 замеров времени, выбрал среднее 1)Запрос напрямую к магазину в табличной части + отбор по "ДатаЗапроса>=Акция.ДатаНачала" и "ДатаЗапроса<=Акция.ДатаКонца" В среднем 0.15 секунд 2)Запрос к срезу последних регистра сведений, где ресурс "Статус акции" = Активна/Кончилась В среднем 0.017 секунд Но увеличение объема данных соответственно, за счет записей в регистр + время на проведение документа |
|||
26
arsik
гуру
20.12.19
✎
12:35
|
(25) Покажи запрос 1) Явно где то косяк.
|
|||
27
Fragster
гуру
20.12.19
✎
12:38
|
(25) на самом деле можно отказаться от тч, а сделать вместо неё программную таблицу и заполнять её из регистра при чтении а при записи - распихивать прямо в набор обратно. проведение и непроведение пусть рулит только галочкой активности.
|
|||
28
Fragster
гуру
20.12.19
✎
12:39
|
а сами записи в РС пусть будут всегда
|
|||
29
H A D G E H O G s
20.12.19
✎
12:43
|
(27) Галочка "Активность", не входящая в кластерный индекс, тебе потом спасибо скажет.
|
|||
30
Fragster
гуру
20.12.19
✎
12:51
|
(29) ну зачем-то же её придумали... и в типовых в операции бух она используется.
|
|||
31
Fragster
гуру
20.12.19
✎
12:51
|
в крайнем случае можно пихать у непроведенного документа в тч а при проведении удалять из тч и пихать в рс. при отмене проведения - делать обратное преобразование.
|
|||
32
Fragster
гуру
20.12.19
✎
12:52
|
если размер прям критичен
|
|||
33
Жан Пердежон
20.12.19
✎
13:13
|
(25) пиши каждую дату из периода (РС (Магазин, ДатаДействия, Акция)) - будет самое быстрое
|
|||
34
pechkin
20.12.19
✎
13:21
|
тысячи строк - это нично.
вот если бы миллионы были |
|||
35
singlych
20.12.19
✎
13:26
|
В ЗУПе уже все придумали. Когда уже они пихнут это в БСП...
|
|||
36
Double_Medved
20.12.19
✎
13:37
|
(26)Первый вариант:
Запрос.Текст = "ВЫБРАТЬ | АкцииПокупатели.Ссылка |ИЗ | Документ.Акции.Покупатели КАК АкцииПокупатели |ГДЕ | АкцииПокупатели.ТорговаяТочка = &ТорговаяТочка | И АкцииПокупатели.Ссылка.ДатаН <= &ДатаЗапроса | И АкцииПокупатели.Ссылка.ДатаК >= &ДатаЗапроса"; |
|||
37
Double_Medved
20.12.19
✎
13:38
|
(26)Второй вариант
Запрос.Текст = "ВЫБРАТЬ | АкцияСрезПоследних.Акция КАК Ссылка, | АкцияСрезПоследних.ТорговаяТочка |ИЗ | РегистрСведений.Акция.СрезПоследних(&ДатаЗапроса, ТорговаяТочка = &ТорговаяТочка) КАК АкцияСрезПоследних |ГДЕ | АкцияСрезПоследних.Статус = &Активна"; |
|||
38
Double_Medved
20.12.19
✎
13:40
|
(33)Переживаю что при установке акции на год на 2000 магазинов получу 2000*365 = 730000 записей
|
|||
39
Double_Medved
20.12.19
✎
13:41
|
А так в принципе сделал примерно как ЦеныНоменклатуры регистр
|
|||
40
novichok79
20.12.19
✎
13:45
|
при первом приближении:
зачем эта периодичность вообще? я бы сделал непериодический регистр сведений измерения: магазин, дата начала и дата окончания. ресурс: естьакция - булево или вообще без ресурсов, показатель наличия акции на магазин - присутствие магазина в заданном интервале соответственно, индекс на даты и магазины в измерениях. запрос внутренним джойном по магазинам и по наличию в заданном интервале |
|||
41
palsergeich
20.12.19
✎
13:47
|
(38) Всего то, даже миллиона нет, нашел о чем переживать
|
|||
42
RomanYS
20.12.19
✎
13:53
|
(37) А если дату окончания засунуть в ресурс и заменить условие на статус заменить на АкцияСрезПоследних.ДатаОкончания >= &ДатаЗапроса?
Записей станет в два раза меньше, интересно, асколько условие будет медленнее/быстрее |
|||
43
arsik
гуру
20.12.19
✎
13:56
|
(36) Так неправильно делать. нужно примерно так.
ВЫБРАТЬ
|
|||
44
arsik
гуру
20.12.19
✎
13:56
|
+ (43) Только не "ЛЕВОЕ СОЕДИНЕНИЕ", а "ВНУТРЕННЕЕ СОЕДИНЕНИЕ"
|
|||
45
arsik
гуру
20.12.19
✎
14:01
|
+(44)
ВЫБРАТЬ
|
|||
46
Double_Medved
20.12.19
✎
14:40
|
(45)Примерно тоже самое получилось (по скорости). О,15 секунд
|
|||
47
RomanYS
20.12.19
✎
14:42
|
(45) так может условия тогда в связи перенести? Иначе непонятно для чего явное соединение и чем оно лучше неявного в(36)
|
|||
48
dk
20.12.19
✎
14:51
|
1. а фильтр по товару не интересен?
2. 0,15 сек на получение 1000 записей не такой плохой результат 3. почему период - на практике должна интересовать конкретная дата а не период |
|||
49
Double_Medved
20.12.19
✎
14:51
|
(47)Так мне по датам отбор делать надо, а даты это реквизит документа. То есть если в табличной части делать отбор через ссылку документа - платформе уже надо опять лезть в документ, кроме таблицы табличной части. А если не делать отбор в табличной части - что он потянет? Всю таблицу?
|
|||
50
RomanYS
20.12.19
✎
14:57
|
(49) просто попробуй в (45) "ГДЕ" заменить на "И" и покажи замер
|
|||
51
Кодер
20.12.19
✎
15:00
|
Тебе надо постоянно вычислять список акций текущего магазина, или достаточно раз в сутки его вычислить, а всю смену получать готовый список?
|
|||
52
Double_Medved
20.12.19
✎
15:03
|
(48)
1. Там уже в документе дохренища вариантов этих акций, условий и т.д. Может и нужно будет 2. Ну это да, но в тестовой базе я один сижу, то есть она больше сейчас ничем не нагружена. Потом как установлю - могу для интереса провести тесты еще на боевой базе, под нагрузкой. Наверняка будет медленней. 3. В данном случае нужна конкретная дата, да. Наверняка потом нужны будут отчеты некие и т.д., может потребоваться период. |
|||
53
Double_Medved
20.12.19
✎
15:03
|
(50) 0,16 секунд
|
|||
54
Double_Medved
20.12.19
✎
15:06
|
(51)Нужно много раз в день. Поступают некие документы типа "Заказ" и нужно высчитывать какие там скидки и т.д.
Можно было бы и раз в сутки чтото высчитывать, но всякие маркетологи могут влезть и поправить, поменять, запустить новую акцию с обеда и т.д., так что всегда надо получать точный список |
|||
55
dk
20.12.19
✎
15:08
|
а если в самый быстрый вариант добавить Первые 1
|
|||
56
Fragster
гуру
20.12.19
✎
15:11
|
(52) зато на рабочей базе кэш горячий
|
|||
57
RomanYS
20.12.19
✎
15:15
|
(53) Значит явное соединение плюсов не дает. Можно ещё попробовать сначала выбрать в ВТ документы с нужными периодами, а потом соединить с ТЧ.
(25) Тебя результат с регистром не устраивает? Зачем дальнейшие поиски? |
|||
58
Double_Medved
20.12.19
✎
15:41
|
(55)Акций в магазине может быть несколько (штук 10 например), нужны все, для дальнейших расчетов
|
|||
59
Double_Medved
20.12.19
✎
15:43
|
(57)Кстати с явным соединением вообще все плохо.
Как-то писали в 1С, что "рекомендуем использовать временные таблицы" или чет такое. И сам замечал много раз, что использование временных таблиц в соединениях практически всегда дает повышение производительности, хотя по идее на помещение данных во временную таблицу уходит и время и память, но все равно быстрее получается |
|||
60
Double_Medved
20.12.19
✎
15:44
|
(57)
Ищу истину. |
|||
61
RomanYS
20.12.19
✎
15:48
|
(60) Ну пока что ты нашел - регистр быстрее.
Осталось понять тормоза из-за соединения или из-за индексов регистра. Проверить соединение довольно просто - засунуть даты в ТЧ, соединение не понадобится. По крайней мере пока не надо будет проверять проведенность документа) - для теста пойдет |
|||
62
RomanYS
20.12.19
✎
15:51
|
(59) Что значит "вообще все плохо" - результат же такой же.
В твоем случае объем ВТ будет явно меньше исходных таблиц, поэтому эффект может быть положительным |
|||
63
arsik
гуру
20.12.19
✎
15:51
|
(60) Индексы учего есть?
1) Акции.ДатаН 2) Акции.ДатаК 3) АкцииАкцииПокупатели.ТорговаяТочка |
|||
64
Double_Medved
20.12.19
✎
16:00
|
(63)
Так, стопе В документе ничего не индексировалось, включил индексацию ДатаН, ДатаК, ТорговаяТочка - запрос к документам стал выполняться 0,07 сек То есть раз в 20 быстрее. Ничего не понимаю. Неужели все волшебство в индексах? Чем это чревато может быть? |
|||
65
Double_Medved
20.12.19
✎
16:01
|
(64)Тьфу, не в 20 раз, а в 2 раза.
|
|||
66
Кодер
20.12.19
✎
16:04
|
Когда ты первый раз выполняешь запрос, он выполняется медленно. Следующие разы - быстро. Почти как неравенство Шрёдингера.
|
|||
67
timurhv
20.12.19
✎
16:05
|
(0) Может бред, но регистр накопления (остаток):
+ Дата1, Магазин, Акция, 1 - Дата2, Магазин, Акция, 1 |
|||
68
timurhv
20.12.19
✎
16:14
|
(67) А лучше РСВ по позиции регистратора, т.к. акция же может корректироваться после утверждения и даты поменяться?
Магазин, Акция, Событие +, в ресурсах Дата1. Магазин, Акция, Событие -, в ресурсах Дата2. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |