|
Безбожно тормозит запрос СрезПоследних | ☑ | ||
---|---|---|---|---|
0
user-ok
19.10.17
✎
17:52
|
база УТП для Украины (аналог КА)
после перехода на клиент-серверный вариант работы стали долго (6-10 минут) проводиться некоторые документы "Отчет о розничных продажах" Замер производительности показывает что очень долго выполняется запрос: http://savepic.net/10164459.htm Запрос простой до безобразия, на скрине показаны замеры на двух "соседних" документах, но проблема в том что документ, который перед этим провелся нормально, при перепроведении так же тупит :( 1С 8.3.10.2561. Пробовал на 8.3.9.2233 MS SQL 2012 SP2 пробовал на боевом сервере (Сервер 1С на виртуалке, SQL на железе) и на тестовом сервере (все на железе, на одном сервере, я во время теста на сервере был один) - разницы нет, так что дело не в железе ТиИ прогонял. Не помогло SELECT TOP 10 * FROM [MyBase].[dbo].[_InfoRg13775] WHERE _Period IS NULL пустой (InfoRg13775 - Регистр сведений ЦеныАТТ) куда еще посмотреть???? :( На файловой, ожидаемо, летает... |
|||
1
Волшебник
модератор
19.10.17
✎
17:55
|
Всё на Украине не слава богу...
|
|||
2
xxTANATORxx
19.10.17
✎
17:55
|
(0)составной тип значения в измерениях есть?
|
|||
3
user-ok
19.10.17
✎
18:00
|
(1) Давайте без политики, пожалуйста.
(2) Склад, Номенклатура, ХарактеристикаНоменклатуры, все с типами соответствующих справочников. Не составные. Больше измерений нет |
|||
4
youalex
19.10.17
✎
18:04
|
(0) профайлер, планы запроса что говорят?
(3) Украина без политики - это фантастика. |
|||
5
xxTANATORxx
19.10.17
✎
18:04
|
(3)мошт скуль тупит
регламентные операции на скуле настроены? |
|||
6
PiterPrg
19.10.17
✎
18:04
|
А статистику обновляли?
|
|||
7
Волшебник
модератор
19.10.17
✎
18:05
|
Проиндексируй измерения Номенклатура и Склад
|
|||
8
xxTANATORxx
19.10.17
✎
18:05
|
(0)а что в списках складов и номенклатуры, мошт там треш?
|
|||
9
kiruha
19.10.17
✎
18:10
|
(0)
Список номенклатуры, склад во временную таблицу, проиндексировать в виртуальной (Склад, Номенклатура) В (Выбрать ВрТаб.Склад, ВрТаб.Номенклатура ИЗ ВрТаб) Если организация есть, ее тоже добавить |
|||
10
user-ok
19.10.17
✎
18:15
|
(5) мошт скуль тупит
вполне возможно, даже скорей всего. Но одинаково тупят 2 скуля на двух серверах... (6) А статистику обновляли? Да, забыл указать. После обновления статистики один-два документа проводятся норм. дальше тупняк даже при перепроведении тех же. Но не обновлять же статистику после каждого документа... (8) Нет там треша. Да и один и тот же документ в одной и той же базе проводится то пару сек. то 10 мин. (7) Прямо в регистре? или для начала как в (9). Кстати Номенклатуру в регистре индексировать не дает (Стоит галка "Ведущее") |
|||
11
user-ok
19.10.17
✎
18:16
|
(9) Утром с этого начну. Сейчас нужно бежать, если есть еще мысли - кидайте
|
|||
12
Волшебник
модератор
19.10.17
✎
18:17
|
(10) Прямо в регистре
|
|||
13
H A D G E H O G s
19.10.17
✎
18:17
|
(11) Вы не победите, пока план запроса в xml не соберете. Вот и все мысли.
|
|||
14
kiruha
19.10.17
✎
18:20
|
(11) если вариант (Склад, Номенклатура)
то номенклатуру можно не индексировать - там уже есть индекс по набору измерений |
|||
15
user-ok
19.10.17
✎
18:25
|
В складах ровно 5 элементов, стоит индексировать?
А Номенклатуру, напомню, индексировать не дает |
|||
16
Волшебник
модератор
19.10.17
✎
18:27
|
(15) Убери отбор по складу
|
|||
17
Леха Дум
19.10.17
✎
18:33
|
Нужно попробовать убрать отбор по номенклатуре в условии формирования среза, а уже итоговую таблицу отфильтровать соединением с временной таблицей по полю номенклатура. Индексировать временную не надо. Отбор по складам в срезе оставить - их должно быть относительно мало.
|
|||
18
kiruha
19.10.17
✎
18:43
|
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура, Склады.Ссылка КАК Склад ПОМЕСТИТЬ НоменклатураСклад ИЗ Справочник.Номенклатура КАК Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады ПО (Склады.Ссылка В (&СписокСкладов)) ГДЕ Номенклатура.Ссылка В(&СписокНоменклатуры) ИНДЕКСИРОВАТЬ ПО Номенклатура, Склад ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Номенклатура, ЦеныНоменклатурыСрезПоследних.Цена ИЗ РегистрСведений.ЦеныАТТ.СрезПоследних(&Дата , (Номенклатура, Склад) В (ВЫБРАТЬ НоменклатураСклад.Склад, НоменклатураСклад.Номенклатура ИЗ НоменклатураСклад)) КАК ЦеныНоменклатурыСрезПоследних |
|||
19
g00d
19.10.17
✎
18:46
|
периодические таблицы всегда тормозят при использовании отборов или в соединениях, просто нужно понять что это вирт.таблица не самым простым способом расчета последних.
Самый оптимальный вариант, сделать вирт.таблицу - реальной. делаете второй непериодический регистр сведений копию нужного с таким же названием и приставкой например Текущие, (БлаБла_Текущие). Добавляете подписку на запись периодического регистра пример для ЦеныНоменклатуры ---- Процедура РегистрСведений_ПриЗаписиЦены(Источник, Отказ, Замещение) Экспорт Если Не Отказ Тогда Для Каждого Запись Из Источник.ЭтотОбъект Цикл //При каждом изменении цен Обновляем таблицу текущих цен Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЦеныНоменклатурыСрезПоследних.Номенклатура, | ЦеныНоменклатурыСрезПоследних.ВидЦены, | ЦеныНоменклатурыСрезПоследних.Характеристика, | ЦеныНоменклатурыСрезПоследних.Цена, | ЦеныНоменклатурыСрезПоследних.Упаковка, | ЦеныНоменклатурыСрезПоследних.Валюта |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних( | , | Номенклатура = &Номенклатура | И ВидЦены = &ВидЦены | И Характеристика = &Характеристика) КАК ЦеныНоменклатурыСрезПоследних"; Запрос.УстановитьПараметр("ВидЦены", Запись.ВидЦены); Запрос.УстановитьПараметр("Номенклатура", Запись.Номенклатура); Запрос.УстановитьПараметр("Характеристика", Запись.Характеристика); РезультатЗапроса = Запрос.Выполнить().Выгрузить(); НоваяЗапись = РегистрыСведений.ЦеныНоменклатурыТекущие.СоздатьМенеджерЗаписи(); НоваяЗапись.Номенклатура = Запись.Номенклатура; НоваяЗапись.ВидЦены = Запись.ВидЦены; НоваяЗапись.Характеристика = Запись.Характеристика; Если РезультатЗапроса.Количество() > 0 Тогда НоваяЗапись.Цена = РезультатЗапроса[0].Цена; НоваяЗапись.Валюта = РезультатЗапроса[0].Валюта; НоваяЗапись.Упаковка = РезультатЗапроса[0].Упаковка; НоваяЗапись.Записать(); иначе НоваяЗапись.Удалить(); КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры ---- Правите нужны запросы на новую таблицу. Делаете первичное заполнение и наслаждаетесь необыкновенно высокой скоростью |
|||
20
H A D G E H O G s
19.10.17
✎
18:50
|
(19) Откройте для себя ИтогиПоСрезуПоследних. Вылезайте уже из каменного века.
|
|||
21
g00d
19.10.17
✎
18:51
|
или вот более универсальный пример, добавляем в модуль периодического регистра
Процедура ПриЗаписи(Отказ, Замещение) Если Не Отказ Тогда Для Каждого Строка Из ЭтотОбъект Цикл Запись = РегистрыСведений.ЦеныТекущие.СоздатьМенеджерЗаписи(); ЗаполнитьЗначенияСвойств(Запись, Строка, , "Период"); Запись.Записать(); КонецЦикла; КонецЕсли; КонецПроцедуры |
|||
22
H A D G E H O G s
19.10.17
✎
18:52
|
(19) Ну и вспомните, что нужны и неоперативные записи.
|
|||
23
H A D G E H O G s
19.10.17
✎
18:52
|
Но у автора - другая проблема. Проблема с SQL
|
|||
24
H A D G E H O G s
19.10.17
✎
18:52
|
Особенно позабавил вариант (18). Образчик прям ядского треша.
|
|||
25
g00d
19.10.17
✎
18:57
|
(20) (22) а вы сравнивали скорость работы ИтоговПоСрезуПоследних и регистра сведений с расчетом среза последних при записи?
В особо клинических случаях, помогает даже с регистрами накоплений. в базах большим количеством изменений разница ОЧЕНЬ существенна. |
|||
26
g00d
19.10.17
✎
18:59
|
(25) + регистры сведений позволяют присоединять их через ПВХ как характеристики товаров, т.е. к примеру присоедениить все виды цены или остатки по складам к номенклатуре как свойства. А затем легко использовать их в дин.списках и отчетах
|
|||
27
H A D G E H O G s
19.10.17
✎
19:02
|
(25) "а вы сравнивали скорость работы ИтоговПоСрезуПоследних и регистра сведений с расчетом среза последних при записи? "
Нет. Не сравнивал, так как это - одно и тоже, только 1 вариант - это платформенная фишка и как бы нет необходимости самому пилить костыль. А что - вы сравнивали? Про РегНакопления - нифига не понял. |
|||
28
kiruha
19.10.17
✎
19:03
|
(24)
Я так понимаю провели замеры ? Или так - пальцы покидать |
|||
29
H A D G E H O G s
19.10.17
✎
19:05
|
(28) Конечно провели.
|
|||
30
Student MAI
19.10.17
✎
19:07
|
(0) 1. Запустить реиндексацию базы. Чтобы привести в порядок индексы. Вы дергали галочки индексации или ведущих измерений? Они сами не встанут, только после переиндексации. Может вы и порядок измерений меняли? Возможно, кластерный индекс перестроился при обновлении конфигурации ИБ, возможно нет.
2. Что характеристика номенклатуры вообще делает в регистре??? Если она еще и измерением является - совсем плохо. Используй конструкцию "Выразить". Это облегчит агонию ИБ. 3. PS я б ничего не индексировал, если номенклатура со складом первые 2 измерения регистра. Если это не так - подвинуть их в начало. 4. Уволиться. |
|||
31
Ненавижу 1С
гуру
19.10.17
✎
19:42
|
||||
32
echo77
19.10.17
✎
20:27
|
(0) Сколько сотен тысяч записей в РС?
Помню, на подобную ситуацию натыкался - в РС: 600К записей, всего 3 измерения. Делаем срез с отбором по одному измерению - занимает 20 минут. Делаем срез без отбора - работает быстро. Я так и не разобрался в чем проблема. Прямо интересно |
|||
33
Волшебник
модератор
19.10.17
✎
21:30
|
(32) план запроса разный
|
|||
34
Фрэнки
19.10.17
✎
22:38
|
в силу вечернего времени не вникаю в подробности, но я правильно увидел по топику и по ветке, что в этом срезе последних здесь постгри не виноватый?
|
|||
35
user-ok
20.10.17
✎
08:25
|
(32) стыдно сказать, 8321
|
|||
36
VS-1976
20.10.17
✎
08:51
|
(32) Скорее всего нужно переиндексировать и/или пересоздать итоги.
|
|||
37
xxTANATORxx
20.10.17
✎
09:39
|
(34)как определил что это постгри?
|
|||
38
Волшебник
модератор
20.10.17
✎
09:42
|
Можно создать ещё один регистр, который назвать ЦеныСрезПоследних.
При записи основного регистра (или с какой-то регулярностью) обновлять второй. Запрос ко второму регистру сведений будет моментальный. |
|||
39
user-ok
20.10.17
✎
09:59
|
(37) Ну он же сказал "Постгри не виноватый"
Сделал то, что очень не рекомендуют авторы всех книжек по запросам: Перенес условие из параметров виртуальной таблицы в обычное условие ТекстЗапроса = "ВЫБРАТЬ | ЦеныПродажные.Склад КАК Склад, | ЦеныПродажные.Номенклатура КАК Номенклатура, | ЦеныПродажные.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, | ЦеныПродажные.Цена КАК Цена |ИЗ | РегистрСведений.ЦеныАТТ.СрезПоследних(&Дата, Склад В (&СписокСкладов)) КАК ЦеныПродажные |ГДЕ | ЦеныПродажные.Номенклатура В(&СписокНоменклатуры)"; Что-то похожее рекомендовали выше но с ВТ и индексами. Летает. Все равно остается вопрос как скуль заставить строить здравые планы не только при первом проведении после Update statistics, но и весь день... |
|||
40
Волшебник
модератор
20.10.17
✎
10:01
|
(39) лучше внутри скобок оставь отбор по номенклатуре
|
|||
41
Timon1405
20.10.17
✎
10:04
|
(39) Дополнять список номенклатуры пустыми позициями до 1000 штук. тогда
Номенклатура В(&СписокНоменклатуры) всегда будет конвертироваться в _field IN (&P1,...&P1000) и план для таких запросов будет один. |
|||
42
user-ok
20.10.17
✎
10:05
|
(40) Но тогда включаются тормоза :(
а так 00000000221 Время проведения - 4 00000000222 Время проведения - 5 00000000225 Время проведения - 4 00000000217 Время проведения - 5 00000000218 Время проведения - 4 00000000219 Время проведения - 4 00000000220 Время проведения - 5 00000000221 Время проведения - 3 00000000222 Время проведения - 4 00000000223 Время проведения - 5 Неидеально, но далеко не 10-15 минут Теперь заставить бы скуль здраво строить планы с отбором в скобках... |
|||
43
Волшебник
модератор
20.10.17
✎
10:17
|
(42) Сделай в регистре измерение Номенклатура первым.
|
|||
44
VS-1976
20.10.17
✎
10:36
|
Если список номенклатур большой, то IN работает плохо и возможно стоит сделать примерно так:
ВЫБРАТЬ Номенклатура ПОМЕСТИТЬ тзНоменклатуры ИЗ &тзСписокНоменклатур КАК тзНоменклатуры ИНДЕКСИРОВАТЬ ПО Номенклатура ; ВЫБРАТЬ ЦеныПродажные.Склад КАК Склад, ЦеныПродажные.Номенклатура КАК Номенклатура, ЦеныПродажные.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, ЦеныПродажные.Цена КАК Цена ИЗ РегистрСведений.ЦеныАТТ.СрезПоследних(&Дата, Склад В (&СписокСкладов)) КАК ЦеныПродажные СОЕДИНЕНИЕ тзНоменклатур ПО ЦеныПродажные.Номенклатура = тзНоменклатур.Номенклатура |
|||
45
Timon1405
20.10.17
✎
10:38
|
(44) + план будет одинаковый
|
|||
46
dmrjan
20.10.17
✎
10:54
|
(39) Интересно было бы посмотреть результат запроса в PostgreSQL 10, там они с планом запроса плотно поработали. Как раз подходит для 1С. Бартунов видео выложил. Только когда новую версию под 1с выпустят?
|
|||
47
user-ok
20.10.17
✎
11:50
|
(43) Помогло
Возвращаю порядок измерений назад - тормоза возвращаются Оставлю пока так Всем спасибо (44) не то чтоб большой. в проблемных документах приблизительно по 150 строк Поэкспериментировал с документом на 20 строк - проводится влет, в профайлере при этом один запрос с трудночитаемым для меня планом :(, но одним При проведении обычного документа на 150 строк в профайлере огромная куча мелких запросов, в которых я просто теряюсь :( Соответственно и планов куча... |
|||
48
H A D G E H O G s
20.10.17
✎
14:16
|
(42) Я надеюсь 4-5 - это секунды :-)
|
|||
49
Волшебник
модератор
20.10.17
✎
14:30
|
(47) Одной проблемой на Украине меньше... :)
|
|||
50
Леха Дум
23.10.17
✎
18:16
|
конструкция В() равносильна вроде как отбору по условию ИЛИ. Чем больше элементов в массиве, тем труднее. Потому я взял за правило, что если в массиве не ограниченное и, как правило, не прогнозируемое число элементов, делать через ВТ и последующее соединение большой таблицы с отбором из ВТ. Алгебра множества она такая....
|
|||
51
breezee
23.10.17
✎
19:51
|
А статистику смотрели по запросу? Может у вас там в регистре до сего дня было 10 записей, а сегодня 50 млн, и запрос всю таблицу сканит (Index scan использует в sql). Смотрели запрос в профайлере? Если план (47) "трудночитаемый" то поставьте в профалере отбор по настройке "SHOWPLAN_XML STATISTICS PROFILE" или как-то так, на память не помню. Он план в xml показывает. После того как покажет вас будет интересовать ожидаемая выборка и действительная в операторе и сами операторы. Запрос в ветке не нашел но проблемы основные могут быть: 1)При связи будет оператор "Nested loops" 2)При поиске в таблице будет "Table scan"или еще какой скан.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |