Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Проблема с 1sqlite (число прочтений - 3606 )
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Проблема с 1sqlite
01. Июня 2011 :: 10:09
Печать  
При добавлении в запрос 4ого и далее объекта время запроса увеличивается в геометрической прогрессии. С 3-мя объектами работает несколько секунд, при добавлении 4-ого время возрастает до нескольких минут. Может это как то можно пофиксить? а то приходится разбивать запрос на несколько, это не особо удобно)
Если разбиваешь запрос на 2, все работает те же несколько секунд.
Текст запроса:
SELECT
     |РеалСтр.iddoc [Реализация: Документ.Реализация],
     |РеалСтр.Сумма + РеалСтр.СуммаНДС*(1-Реал.СуммаВклНДС) [СуммаРеал],
     |Заказы.parentext [Ном: Справочник.Номенклатура],
     |Заказы.Направление [Направление: Справочник.НаправленияБрендов],
     |Заказы.ДокументЗаказа [Заявка: Документ.ЗаявкаПокупателя],
     |СпрПост.Поступление [ПостТМЦ: Документ.ПоступлениеТМЦ],
     |СпрПост.Количество [ПостКол]
     |from Справочник_ПоступленияПоЗаказам as СпрПост
     |left join Справочник_ВиртуальныеЗаказы as Заказы
     |on СпрПост.parentext = Заказы.id
     |left join Документ_Реализация as Реал
     |on (substr(Реал.ДокОснование,5,9) = Заказы.ДокументЗаказа)
     |left join ДокументСтроки_Реализация as РеалСтр
     |on (РеалСтр.Номенклатура = Заказы.parentext)and(РеалСтр.iddoc = Реал.iddoc)
     |where СпрПост.Поступление in СписокПост

вот. чтобы ограничить даты приходится делать сначала запрос, получая список поступлений за период, и в этот запрос кидать уже список поступлений. Но и так тормозит бешено, такой запрос выполняется пару минут. а без, опустим, СпрПост, выполняется несколько секунд.
Причем это не только в этом запросе, я и раньше часто сталкивался.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Проблема с 1sqlite
Ответ #1 - 01. Июня 2011 :: 11:18
Печать  
у тебя последний лефт джоин превращается в иннер за счет ветки Where
а так, вообще нелепая структура ИБ..
Запрос ко всему справочнику в котором хранятся ссылки на документы.. и еще и доставать потом табличную часть и фильтровать по приходу.
В общем, всё не комильфо.


  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Проблема с 1sqlite
Ответ #2 - 02. Июня 2011 :: 01:40
Печать  
1st писал(а) 01. Июня 2011 :: 10:09:
приходится делать сначала запрос, получая список поступлений за период, и в этот запрос кидать уже список поступлений.

Проблема не с 1sqlite, а с проектированием:
  • Почему поступления хранятся в справочниках?
  • Почему заказы там же хранятся?

По идее надо убить справочники ПоступленияПоЗаказам и ВиртуальныеЗаказы, перенеся необходимые данные в соответствующие документы, а тогда все становится намного проще ...
Кроме того, надо индексировать все поля, которые важны для поиска + составлять запрос с учетом этих индексов...
  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Проблема с 1sqlite
Ответ #3 - 02. Июня 2011 :: 05:09
Печать  
I. А в чем существенная разница хранить данные в документах или в справочниках?
II. А что значит индексировать поля? Значит ставить галочки "сортировка" или "отбор по реквизиту"? И в запросе выбирать только эти поля?
Спасибо.

Эту структуру придумал не я. Перекорячить её конечно можно, но на это требуется существенное количество времени. Если есть реальные причины - это да. А если так просто будет красивее, то нах это не надо)
Но, в принципе, она обоснована, т.к.:
1) В справочник "ВиртуальныеЗаказы" кидают данные разные люди, часто по 1 позиции, затем из этого справочника собирается одна общая корзина, и на её основании делается поступление. Если это будет 20 документов по 1 позиции, то как тогда их связать с поступлением?
2) А "ПоступленияПоЗаказам" нужны, чтобы связать поступления, которые вводились не на основании корзины, с заказами.
Как то так вроде)



  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Проблема с 1sqlite
Ответ #4 - 02. Июня 2011 :: 11:12
Печать  
А если так:
(извиняюсь, проблемы с кодировкой)
  

1_009.jpg ( 43 KB | Загрузки )
1_009.jpg
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Проблема с 1sqlite
Ответ #5 - 02. Июня 2011 :: 11:43
Печать  
Зачем тебе документ_строки в тексте запроса ?, когда и так всё есть в самом регистре.
+ лучше воткнуть в регистр галку быстрая обработка движений и выкинуть журнал документов из текста запроса (или индекс воткнуть по одному из измерений регистра на движения регистра)

ЗЫ:Ну и соединение с табличкой шапки документа тут тоже явно лишнее
  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Проблема с 1sqlite
Ответ #6 - 02. Июня 2011 :: 12:18
Печать  
Да не. Просто это был набросок.
Вот сам запрос в итоге:

SELECT
     |Журнал.iddocdef Документ_Вид,
     |Журнал.iddoc [Документ: Документ],
     |Пост.iddoc [Пост: Документ.ПоступлениеТМЦ],
     |--Рег.debkred,
     |Рег.Номенклатура [Ном: Справочник.Номенклатура],
     |Рег.Количество [КолРеал],
     |РеалСтр.Сумма + РеалСтр.СуммаНДС*(1-Реал.СуммаВклНДС) [СуммаРеал],
     |ПостСтр.Количество [КолПост],
     |(ПостСтр.Сумма + ПостСтр.СуммаНДС*(1-Пост.СуммаВклНДС) + ПостСтр.Сертификация)*(1 + Пост.ПроцентДопРасходов) [СС]
     |from Регистр_ПартииНаличие as Рег
     |inner join Журнал
     |on Рег.iddoc = Журнал.iddoc
     |inner join ДокументСтроки_Реализация as РеалСтр
     |on (РеалСтр.iddoc = Журнал.iddoc)and(РеалСтр.Номенклатура = Рег.Номенклатура)
     |inner join Документ_Реализация as Реал
     |on РеалСтр.iddoc = Реал.iddoc
     |inner join Справочник_Партии as Партии
     |on Рег.Партия = Партии.id
     |inner join Документ_ПоступлениеТМЦ as Пост
     |on (Пост.iddoc = substr(Партии.ПриходныйДокумент,5,9))
     |inner join ДокументСтроки_ПоступлениеТМЦ as ПостСтр
     |on (ПостСтр.Номенклатура = Рег.Номенклатура)and(Пост.iddoc = ПостСтр.iddoc)
     |where Журнал.date between :НачДата and :КонДата
     |and debkred = 1

Проставил все индексы которые нужны и...
акуел
такой запрос за месяц выполняется всего за 1 секунду.
я в шоке.
все вроде работает.
А я как понял документы лучше использовать, т.к. там вообще чтоле все проиндексировано?
  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Проблема с 1sqlite
Ответ #7 - 02. Июня 2011 :: 12:27
Печать  
А что делает галка "Быстрая обработка движений"?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Проблема с 1sqlite
Ответ #8 - 03. Июня 2011 :: 02:23
Печать  
1st писал(а) 02. Июня 2011 :: 12:27:
А что делает галка "Быстрая обработка движений"?

Включает хранение реквизитов даты/времени в таблице движений регистра.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Проблема с 1sqlite
Ответ #9 - 06. Июня 2011 :: 04:39
Печать  
Навскидку 90% тормозов из-за
Код
Выбрать все
on (substr(Реал.ДокОснование,5,9) = Заказы.ДокументЗаказа) 


Заказы.ДокументЗаказа - какой тип ?
Переписать на выборку через 1scrdoc
  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Проблема с 1sqlite
Ответ #10 - 30. Июня 2011 :: 05:09
Печать  
Вот с этого места поподробней пожалуйста.
Как раз сейчас достаточно остро стоит вопрос о том, как по человечески связать Реквизит Типа "Документ" с реквизитом типа "Документ.ЗаявкаПокупателя".
Как прописано у меня, действительно тормозит не подеццки)
  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Проблема с 1sqlite
Ответ #11 - 30. Июня 2011 :: 06:07
Печать  
Чет порыл форум и ДД-шник, и нифига не понял.
Как этот 1scrdoc подключать то?
  
Наверх
 
IP записан
 
1st
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 07. Апреля 2011
Re: Проблема с 1sqlite
Ответ #12 - 30. Июня 2011 :: 06:48
Печать  
Нашел.
Но толку с него как с козла молока.

Подключил вместо
|on substr(Реал.ДокОснование,5,9) = Заказы.ДокументЗаказа

так
|left join __1s_crdoc as Ссылки
|on Ссылки.parentval = Заказы.ДокументЗаказа
|left join Документ_Реализация as Реал
|on Реал.iddoc = Ссылки.childid

время запроса возросло в 3 раза.
И в выборке осталась 1 строка с непонятной хренью)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Проблема с 1sqlite
Ответ #13 - 30. Июня 2011 :: 08:25
Печать  
Для начала, нужно выкинуть все нелепые соединения с табличной частью документа.
У тебя и так всё уже есть в самом регистре.

  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Проблема с 1sqlite
Ответ #14 - 04. Июля 2011 :: 11:09
Печать  
Попробуй выполнить за несколько проходов:

сначала запрос
Код
Выбрать все
create temp table врем1 as select
СпрПост.Поступление			[ПостТМЦ],
СпрПост.Количество			[ПостКол],
Заказы.parentext			[Ном],
Заказы.Направление			[Направление],
Заказы.ДокументЗаказа		[Заявка]
from Справочник_ПоступленияПоЗаказам as СпрПост
left join Справочник_ВиртуальныеЗаказы as Заказы on СпрПост.parentext = Заказы.id
where СпрПост.Поступление in СписокПост
 



Потом
Код
Выбрать все
create temp table врем2 as select
tt.Заявка,
Ссылки.childid Реализация
from (select distinct Заявка from врем1) tt
left join __1C_crdoc Ссылки
on (Ссылки.mdid='   0' and Ссылки.parentval = 'O1' || :ВидДокумента.ЗаявкаПокупателя || tt.Заявка)
left join __1SJourn Журнал on (Ссылки.childid = Журнал.iddoc and Журнал.iddocdef=:ВидДокумента.Реализация)
 



Далее

Код
Выбрать все
create index звт2 on врем2(Заявка)
 


И результат:

Код
Выбрать все
select
	РеалСтр.iddoc [Реализация: Документ.Реализация],
	РеалСтр.Сумма + РеалСтр.СуммаНДС * (1 - Реал.СуммаВклНДС) [СуммаРеал],
	врем1.Ном [Ном: Справочник.Номенклатура],
	врем1.Направление [Направление: Справочник.НаправленияБрендов],
	врем1.Заявка [Заявка: Документ.ЗаявкаПокупателя],
	врем1.ПостТМЦ [ПостТМЦ: Документ.ПоступлениеТМЦ],
	врем1.ПостКол [ПостКол]
from врем1 left join врем2 on врем1.Заявка = врем2.Заявка
left join Документ_Реализация as Реал on врем2.Реализация = Реал.iddoc
left join ДокументСтроки_Реализация as РеалСтр
on (РеалСтр.Номенклатура = врем1.Ном and РеалСтр.iddoc = Реал.iddoc)
 


Ну и дальше или базу закрыть, или временные таблички дропнуть.

Может я в полях че напутал, но подход я думаю понятен.

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать