|
файловая база, запросы и ошибка "недостаточно памяти" | ☑ | ||
---|---|---|---|---|
0
vasbur
07.11.13
✎
07:07
|
Ситуация: у одного из клиентов стоит УТ 10.3, платформа - 8.3.18
база файловая, ежемесячно заводится порядка 5000 РТУ, всего в базе порядка 90 000 РТУ. Столкнулся с проблемой - часть запросов в моей обработке (нетиповой) вылетает с ошибкой "недостаточно памяти". При этом резальтат запроса должен быть небольшой. Подозреваю, что связано это с тем, что файловая версия 1С делает неоптимальные планы выполнения запросов. Возникли следующие вопросы: 1. Насколько типично использование файловой версии для подобных объемов данных? Считать ли ситуацию с данным клиентом частным случаем, или симптомом проблемы (разрабатываемая мной обработка - тиражная, будет использоваться несколькими сотнями разных клиентов). 2. Есть ли дельные статьи и рекомендации по этой проблеме? 3. Возникают ли подобные проблемы в SQL-версиях 1С? С како-нибудь Postgree, например? отдельный вопрос -есть ли у кого базы данных (тестовые или реальные) с подобным объемом данным, которыми вы можете поделиться? Клиент свою БД отдавать не хочет, подготовка стенда - это отдельное развлечение на пару дней. буду признателен за любые дельные комментарии |
|||
1
vasbur
07.11.13
✎
07:07
|
upd: Платформа 8.2.18, выше была опечатка.
|
|||
2
Гефест
07.11.13
✎
07:13
|
Ну показывай свои запросы
|
|||
3
Jonny_Khomich
07.11.13
✎
07:16
|
(0) обычно вылетает из-за большого количества или корявых группировок по строкам и полям.
|
|||
4
vasbur
07.11.13
✎
07:18
|
(2) Запросов дофига, когда смотришь на конкретный запрос - вроде примерно понятно куда копать.
Хочется в принципе понять, насколько нужно этим заморачиваться. Может, такие ситуации редки и проще убедить клиента перейти на сиквел или самому переписать запросы. Щас пару запросов покажу. |
|||
5
vasbur
07.11.13
✎
07:22
|
ВЫБРАТЬ
ЗначенияСвойствОбъектов.Объект КАК Организация, ЗначенияСвойствОбъектов.Значение КАК ИдентификаторОрганизации, НастройкиПФДляТоваров.Значение КАК ПечатнаяФормаДляТоваров, НастройкиПФДляУслуг.Значение КАК ПечатнаяФормаДляУслуг ПОМЕСТИТЬ ТаблицаДанныхОрганизаций ИЗ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК НастройкиПФДляТоваров ПО ЗначенияСвойствОбъектов.Объект = НастройкиПФДляТоваров.Объект И (НастройкиПФДляТоваров.Объект ССЫЛКА Справочник.Организации) И (НастройкиПФДляТоваров.Свойство.Наименование = &ПечатнаяФормаДляТоваров) ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК НастройкиПФДляУслуг ПО ЗначенияСвойствОбъектов.Объект = НастройкиПФДляУслуг.Объект И (НастройкиПФДляУслуг.Объект ССЫЛКА Справочник.Организации) И (НастройкиПФДляУслуг.Свойство.Наименование = &ПечатнаяФормаДляУслуг) ГДЕ ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Организации И ЗначенияСвойствОбъектов.Свойство.Наименование = &ИдентификаторОрганизации И ЗначенияСвойствОбъектов.Значение <> "" |
|||
6
vasbur
07.11.13
✎
07:24
|
ВЫБРАТЬ
ТЗ.Организация, ТЗ.ОтпрНеПроведенные, ТЗ.ПечатьСчетаПоРТУ, ТЗ.ПечатьСчетаПоСчету , ТЗ.ПечатьСчетаПоЗаказу ПОМЕСТИТЬ фильтрПоОрганизациям ИЗ &ТЗ КАК ТЗ ; ВЫБРАТЬ РАЗРЕШЕННЫЕ подзапрос.*, ЕСТЬNULL(подзапрос.ID_, &ПустоеСвойствоОбъекта) ID ИЗ ( ВЫБРАТЬ РеализацияТоваровУслуг.Ссылка КАК Документ, РеализацияТоваровУслуг.Организация КАК Продавец, РеализацияТоваровУслуг.Контрагент КАК Покупатель, РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокументаЗначение, ЕСТЬNULL(СУММА(ТоварныеСтроки.СуммаНДС), 0) КАК СуммаНДСЗначение, МАКСИМУМ(ЗначенияСвойствОбъектов.Значение) КАК ID_, ЛОЖЬ КАК ЭтоСчет ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов ПО РеализацияТоваровУслуг.Ссылка = ЗначенияСвойствОбъектов.Объект И (ЗначенияСвойствОбъектов.Свойство.Наименование = &наименованиеСвойства) ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ТоварыТЧ.Ссылка КАК Ссылка, ТоварыТЧ.СуммаНДС КАК СуммаНДС ИЗ Документ.РеализацияТоваровУслуг.Товары КАК ТоварыТЧ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ УслугиТЧ.Ссылка, УслугиТЧ.СуммаНДС ИЗ Документ.РеализацияТоваровУслуг.Услуги КАК УслугиТЧ) КАК ТоварныеСтроки ПО (ТоварныеСтроки.Ссылка = РеализацияТоваровУслуг.Ссылка) ВНУТРЕННЕЕ СОЕДИНЕНИЕ фильтрПоОрганизациям КАК фильтрПоОрганизациям ПО РеализацияТоваровУслуг.Организация = фильтрПоОрганизациям.Организация ГДЕ (фильтрПоОрганизациям.ОтпрНеПроведенные И РеализацияТоваровУслуг.ПометкаУдаления = ЛОЖЬ ИЛИ НЕ фильтрПоОрганизациям.ОтпрНеПроведенные И РеализацияТоваровУслуг.Проведен) И РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &Датаокончания И РеализацияТоваровУслуг.Контрагент В(&Контрагент) СГРУППИРОВАТЬ ПО РеализацияТоваровУслуг.Ссылка, РеализацияТоваровУслуг.Организация, РеализацияТоваровУслуг.Контрагент, РеализацияТоваровУслуг.СуммаДокумента ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ КорректировкаРеализации.Ссылка, КорректировкаРеализации.Организация, КорректировкаРеализации.Контрагент, КорректировкаРеализации.СуммаДокумента, ЕСТЬNULL(СУММА(ТоварныеСтроки.СуммаНДС), 0), МАКСИМУМ(ЗначенияСвойствОбъектов.Значение), ЛОЖЬ ИЗ Документ.КорректировкаРеализации КАК КорректировкаРеализации ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов ПО КорректировкаРеализации.Ссылка = ЗначенияСвойствОбъектов.Объект И (ЗначенияСвойствОбъектов.Свойство.Наименование = &наименованиеСвойства) ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ТоварыТЧ.Ссылка КАК Ссылка, ТоварыТЧ.СуммаНДС КАК СуммаНДС ИЗ Документ.КорректировкаРеализации.Товары КАК ТоварыТЧ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ УслугиТЧ.Ссылка, УслугиТЧ.СуммаНДС ИЗ Документ.КорректировкаРеализации.Услуги КАК УслугиТЧ) КАК ТоварныеСтроки ПО (ТоварныеСтроки.Ссылка = КорректировкаРеализации.Ссылка) ВНУТРЕННЕЕ СОЕДИНЕНИЕ фильтрПоОрганизациям КАК фильтрПоОрганизациям ПО КорректировкаРеализации.Организация = фильтрПоОрганизациям.Организация ГДЕ (фильтрПоОрганизациям.ОтпрНеПроведенные И КорректировкаРеализации.ПометкаУдаления = ЛОЖЬ ИЛИ НЕ фильтрПоОрганизациям.ОтпрНеПроведенные И КорректировкаРеализации.Проведен) И КорректировкаРеализации.Дата МЕЖДУ &ДатаНачала И &Датаокончания И КорректировкаРеализации.Контрагент В(&Контрагент) И КорректировкаРеализации.ВидОперации = ЗНАЧЕНИЕ(перечисление.ВидыОперацийИсправленияПоступленияРеализации.ИсправлениеОшибки) СГРУППИРОВАТЬ ПО КорректировкаРеализации.Ссылка, КорректировкаРеализации.Организация, КорректировкаРеализации.Контрагент, КорректировкаРеализации.СуммаДокумента ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВозвратТоваровПоставщику.Ссылка, ВозвратТоваровПоставщику.Организация, ВозвратТоваровПоставщику.Контрагент, ВозвратТоваровПоставщику.СуммаДокумента, ЕСТЬNULL(СУММА(ТоварыТЧ.СуммаНДС), 0), МАКСИМУМ(ЗначенияСвойствОбъектов.Значение), ЛОЖЬ ИЗ Документ.ВозвратТоваровПоставщику КАК ВозвратТоваровПоставщику ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов ПО ВозвратТоваровПоставщику.Ссылка = ЗначенияСвойствОбъектов.Объект И (ЗначенияСвойствОбъектов.Свойство.Наименование = &наименованиеСвойства) ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровПоставщику.Товары КАК ТоварыТЧ ПО (ТоварыТЧ.Ссылка = ВозвратТоваровПоставщику.Ссылка) ВНУТРЕННЕЕ СОЕДИНЕНИЕ фильтрПоОрганизациям КАК фильтрПоОрганизациям ПО ВозвратТоваровПоставщику.Организация = фильтрПоОрганизациям.Организация ГДЕ (фильтрПоОрганизациям.ОтпрНеПроведенные И ВозвратТоваровПоставщику.ПометкаУдаления = ЛОЖЬ ИЛИ НЕ фильтрПоОрганизациям.ОтпрНеПроведенные И ВозвратТоваровПоставщику.Проведен) И ВозвратТоваровПоставщику.Дата МЕЖДУ &ДатаНачала И &Датаокончания И ВозвратТоваровПоставщику.Контрагент В(&Контрагент) СГРУППИРОВАТЬ ПО ВозвратТоваровПоставщику.Ссылка, ВозвратТоваровПоставщику.Организация, ВозвратТоваровПоставщику.Контрагент, ВозвратТоваровПоставщику.СуммаДокумента ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ОтчетКомитентуОПродажах.Ссылка, ОтчетКомитентуОПродажах.Организация, ОтчетКомитентуОПродажах.Контрагент, ОтчетКомитентуОПродажах.СуммаВознаграждения, ЕСТЬNULL(СУММА(ТоварыТЧ.СуммаНДСВознаграждения), 0), МАКСИМУМ(ЗначенияСвойствОбъектов.Значение), ЛОЖЬ ИЗ Документ.ОтчетКомитентуОПродажах КАК ОтчетКомитентуОПродажах ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов ПО ОтчетКомитентуОПродажах.Ссылка = ЗначенияСвойствОбъектов.Объект И (ЗначенияСвойствОбъектов.Свойство.Наименование = &наименованиеСвойства) ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтчетКомитентуОПродажах.Товары КАК ТоварыТЧ ПО (ТоварыТЧ.Ссылка = ОтчетКомитентуОПродажах.Ссылка) ВНУТРЕННЕЕ СОЕДИНЕНИЕ фильтрПоОрганизациям КАК фильтрПоОрганизациям ПО ОтчетКомитентуОПродажах.Организация = фильтрПоОрганизациям.Организация ГДЕ (фильтрПоОрганизациям.ОтпрНеПроведенные И ОтчетКомитентуОПродажах.ПометкаУдаления = ЛОЖЬ ИЛИ НЕ фильтрПоОрганизациям.ОтпрНеПроведенные И ОтчетКомитентуОПродажах.Проведен) И ОтчетКомитентуОПродажах.Дата МЕЖДУ &ДатаНачала И &Датаокончания И ОтчетКомитентуОПродажах.Контрагент В(&Контрагент) СГРУППИРОВАТЬ ПО ОтчетКомитентуОПродажах.Ссылка, ОтчетКомитентуОПродажах.Организация, ОтчетКомитентуОПродажах.Контрагент, ОтчетКомитентуОПродажах.СуммаВознаграждения ) как подзапрос ГДЕ (ЕСТЬNULL(подзапрос.ID_, &ПустоеСвойствоОбъекта) = &ПустоеСвойствоОбъекта ИЛИ подзапрос.ID_ = "") Упорядочить по подзапрос.Документ.моментвремени |
|||
7
Feunoir
07.11.13
✎
07:37
|
Во всех запросах крайне не нравится конструкция:
(НастройкиПФДляУслуг.Свойство.Наименование = &ПечатнаяФормаДляУслуг) Переделать на (НастройкиПФДляУслуг.Свойство = &ПечатнаяФормаДляУслуг) И в параметр передавать не наименование свойства, а само свойство |
|||
8
vasbur
07.11.13
✎
07:52
|
(7) Это вчера стало понятно.
Просто запросов много, и сейчас их придется искать экспериментально. Может быть, есть рекомендации, какие запросы точно "плохике"? |
|||
9
kosts
07.11.13
✎
08:12
|
Пиши запросы правильно. Конечно не хватит памяти если тягать все данные без отборов...
Файловые конечно не серверные, но сотни народа на них работают без таких проблем...
|
|||
10
vasbur
07.11.13
✎
08:18
|
а базой ут никто поделиться не может?
|
|||
11
vasbur
07.11.13
✎
10:03
|
Возникает ли такая ошибка в SQL-версиях, или это исключительно особенность файловой версии?
P.s. Доброго утра и вкусного кофе Москвичам. |
|||
12
kosts
07.11.13
✎
10:24
|
(11) Сервер вроде пыхтит, но справляется. В трудных случаях будет увеличиваться время запроса.
Было падение клиента, если клиент получает обратно много данных. Бухгалтер формировала крупный отчет за 9 месяцев, падает. Но там действительно много данных. Десятки тысяч наименований с расшифровками по счетам и пр. |
|||
13
mistеr
07.11.13
✎
10:33
|
(11) Может тупо в темпе места не хватает?
|
|||
14
vasbur
07.11.13
✎
11:31
|
(13) дак по сути запрос простой, и должен вернуть несколько документов.
Но в процессе выполнения запроса 1с видимо гору всего перелопачивает. что плохо и неправильно |
|||
15
H A D G E H O G s
07.11.13
✎
11:33
|
Запрос ужасен.
|
|||
16
H A D G E H O G s
07.11.13
✎
11:34
|
На SQL он не упадет, SQL его отлопатит, че ему.
Сервер 1С получит небольшой результат и радостно вернет выборку клиенту. |
|||
17
vasbur
07.11.13
✎
11:50
|
(15) Есть критерии, позволяющие быстро понять, ужасен запрос или нет?
|
|||
18
H A D G E H O G s
07.11.13
✎
11:56
|
(17) Угу. Например, его текст не нравится H A D G E H O G s
"Хорошо летают только красивые самолёты" ©Туполев |
|||
19
vasbur
07.11.13
✎
12:05
|
(17) если я вам дам всю обработку - вы напишете, какие запросы вам не нравятся? :)
|
|||
20
H A D G E H O G s
07.11.13
✎
12:10
|
(19)
1) Могу еще и написать правильно. 2) После работы. 3) За деньги. |
|||
21
kosts
07.11.13
✎
12:23
|
(17) Несколько принципов
Отборы нужно делать как можно раньше. Тем более в виртуальных таблицах Не таскать лишние колонки. Индексировать временные таблицы. В некоторых случаях ИЛИ в отборе будет тормозить. Получать все нужные данные запросом, т.е. в выборке уже не должно быть получения через точку. Это то, что сходу вспомнил... |
|||
22
kosts
07.11.13
✎
12:27
|
Стараться в отборах в запросах использовать проиндексированные реквизиты. И соответственно, индексировать реквизиты, если по ним будет отбор в запросах.
В часто используемых запросах не использовать данные документов и табличные части, а использовать движения документов. |
|||
23
vasbur
07.11.13
✎
21:51
|
(22) понятно. Рецепт один - арбайтен
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |