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


1C++ rocks!

Сообщений: 36
Зарегистрирован: 23. Августа 2010
Запрос в 1sqlite
10. Ноября 2010 :: 08:48
Печать  
Текст запроса:
Код
Выбрать все
SELECT
   SubQuery.Номенклатура [Номенклатура :Справочник.аНоменклатура],
	SubQuery.Склад [Склад :Справочник.Склады],
   SUM(SubQuery.КонечныйОстаток) [КонечныйОстаток :Число]
FROM
(
	SELECT
 	   РегОстатки.Количество [КонечныйОстаток],
 	   РегОстатки.Номенклатура [Номенклатура],
 	   РегОстатки.Склад [Склад]
	FROM    
	    [РегистрИтоги.аОстаткиТМЦ] РегОстатки
	WHERE
	    РегОстатки.Period = '20101001'

	    AND РегОстатки.Номенклатура = '    3CPB '


	UNION ALL

	SELECT
	    РегДвижения.Количество*(1-РегДвижения.Debkred*2),
	    РегДвижения.Номенклатура [Номенклатура],
	    РегДвижения.Склад [Склад]
	FROM
	    [Регистр.аОстаткиТМЦ] РегДвижения
	LEFT JOIN
	    [Журнал] Жур
	ON
	    Жур.IDDOC = РегДвижения.IDDOC
	WHERE
	    Жур.Date BETWEEN '20101101' AND '20101110'

	    AND РегДвижения.Номенклатура = '    3CPB '

) AS SubQuery
GROUP BY
    SubQuery.Склад,
    SubQuery.Номенклатура 


Локально выполняется 0.174с., по сети 24с.
Черный запрос по сети выполняется порядка 3с.
Может я с запросом накосячил?
Непонятно, от чего запрос так долго выполняется...
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Запрос в 1sqlite
Ответ #1 - 10. Ноября 2010 :: 09:05
Печать  
Мои эксперименты показали, что получение итогов регистров штатными средствами эффективнее прямых запросов...
  
Наверх
 
IP записан
 
filh
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 36
Зарегистрирован: 23. Августа 2010
Re: Запрос в 1sqlite
Ответ #2 - 10. Ноября 2010 :: 09:13
Печать  
хм, а на фоксе Запрос длился 0.491с это по сети, на локальной Запрос длился 0.028с
  
Наверх
 
IP записан
 
filh
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 36
Зарегистрирован: 23. Августа 2010
Re: Запрос в 1sqlite
Ответ #3 - 10. Ноября 2010 :: 09:16
Печать  
вот фоксовый запрос, в индексы только даты отправил, номенклатуру не стал.
Код
Выбрать все
|SELECT
|   SubQuery.Номенклатура as [Номенклатура $Справочник.аНоменклатура],
|	SubQuery.Склад as [Склад $Справочник.Склады],
|   SUM(SubQuery.КонечныйОстаток) as КонечныйОстаток
|FROM
|(
|	SELECT
| 	   $РегОстатки.Количество as КонечныйОстаток,
| 	   $РегОстатки.Номенклатура as Номенклатура,
| 	   $РегОстатки.Склад as Склад
|	FROM
|	    $РегистрИтоги.аОстаткиТМЦ as РегОстатки
|	WHERE
|	    РегОстатки.Period = :ПредПериод~~
|	    AND $РегОстатки.Номенклатура = :ВыбаНоменклатура
|
|	UNION ALL
|
|	SELECT
|	    $РегДвижения.Количество*(1-РегДвижения.Debkred*2) as Количество,
|	    $РегДвижения.Номенклатура as Номенклатура,
|	    $РегДвижения.Склад as Склад
|	FROM
|	    $Регистр.аОстаткиТМЦ as РегДвижения
|	LEFT JOIN
|	    1sjourn Жур
|	ON
|	    Жур.IDDOC = РегДвижения.IDDOC
|	WHERE
|		(DTOS(Жур.date)+Жур.time+Жур.iddoc BETWEEN (DTOS(:НачПериод~~)+'		   ') AND (DTOS(:КонДата~~)+'ZZZZZZZZZZZZZZZ'))
|	    AND $РегДвижения.Номенклатура = :ВыбаНоменклатура
|
|) AS SubQuery
|GROUP BY
|    SubQuery.Склад,
|    SubQuery.Номенклатура 

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Запрос в 1sqlite
Ответ #4 - 10. Ноября 2010 :: 09:17
Печать  
я тоже сначала на фоксе игрался ... но в итоге не заметил выигрыша по скорости ... а если нет разницы, зачем уходить от штатных средств?
Скорее всего дело в подзапросе. Попробуй убрать подзапрос, а сворачивать уже результат. поможет? Я делал именно так, но штатные средства давали ту же скорость... Кроме того - такой подход нередко давал нули, когда в итоги гасились движениями. А Штатные средства это учитывают.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Запрос в 1sqlite
Ответ #5 - 10. Ноября 2010 :: 10:22
Печать  
Точно проверял в одинаковых условиях?
Может ты напоролся на "резкое падение скорости при сетевом доступе при входе второго пользователя" ?
Потому как столь резкого проседания по скорости не должно быть.
И кусок из dd давай про структуру регистра, буду посмотреть.
  
Наверх
 
IP записан
 
filh
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 36
Зарегистрирован: 23. Августа 2010
Re: Запрос в 1sqlite
Ответ #6 - 10. Ноября 2010 :: 10:30
Печать  
Проверил еще раз на сетевой базе. Новых пользователей не заходило, проверил по 5 раз(1sqlite и фокс).
фокс в среднем 0.45с, 1sqlite первый прогон 23.633с, второй а дальше примерно по 22.5с.
Код
Выбрать все
#==TABLE no 223    : Регистр аОстаткиТМЦ
# Name    |Descr                         |Type[A/S/U]|DBTableName|ReUsable  
T=RG8109  |Регистр аОстаткиТМЦ           |A          |RG8109     |1        
#-----Fields-------
# Name      |Descr               |Type|Length|Precision
F=PERIOD    |Period Registr      |D   |8     |0        
F=SP8103    |(P)Фирма            |C   |9     |0        
F=SP8104    |(P)Номенклатура     |C   |9     |0        
F=SP8105    |(P)Склад            |C   |9     |0        
F=SP8106    |(P)ЦенаПрод         |N   |16    |2        
F=SP8107    |(P)Количество       |N   |16    |5        
#----Indexes------
# Name     |Descr         |Unique|Indexed fields                                              |DBName    
I=PROP     |PERIOD+PROP   |0     |PERIOD,SP8103,SP8104,SP8105,SP8106                          |PROP      
I=VIA8104  |VIA8104       |0     |PERIOD,SP8104                                               |VIA8104    
#

#==TABLE no 224    : Регистр (Дв.) аОстаткиТМЦ
# Name    |Descr                         |Type[A/S/U]|DBTableName|ReUsable  
T=RA8109  |Регистр (Дв.) аОстаткиТМЦ     |A          |RA8109     |1        
#-----Fields-------
# Name      |Descr               |Type|Length|Precision
F=IDDOC     |ID Document's       |C   |9     |0        
F=LINENO    |LineNo              |N   |4     |0        
F=ACTNO     |Action No           |N   |6     |0        
F=DEBKRED   |Flag Debet/Kredit   |N   |1     |0        
F=SP8103    |(P)Фирма            |C   |9     |0        
F=SP8104    |(P)Номенклатура     |C   |9     |0        
F=SP8105    |(P)Склад            |C   |9     |0        
F=SP8106    |(P)ЦенаПрод         |N   |16    |2        
F=SP8107    |(P)Количество       |N   |16    |5        
F=SP8108    |(P)Внутреннее       |N   |2     |0        
#----Indexes------
# Name     |Descr         |Unique|Indexed fields                                              |DBName    
I=IDLINE   |of IDDOC+LineN|0     |IDDOC,LINENO,ACTNO                                          |IDLINE    
 

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Запрос в 1sqlite
Ответ #7 - 10. Ноября 2010 :: 10:43
Печать  
Ну тут надо либо по номенклатуре поставить "Отбор движений" (лучший вариант), либо left join заменить на inner join и добавить условие
Код
Выбрать все
and Жур.аОстаткиТМЦФР=1
 


а то получается, что из за left join sqlite не может поменять порядок таблиц, и так как в таблице движений нет индекса но номенклатуре, он вынужден перебирать ВСЮ таблицу движений, и для каждого движения с указанной номенклатурой лезть в журнал, проверяя дату движения. А если будет inner join, то sqlite переставит порядок обхода таблиц, и будет идти по журналу в пределах заданного периода.
ЗЫ: Добавив "быструю обработку движений", избавишься от необходимости цеплять журнал.
ЗЫЫ: Используй метод Отладка для запроса, много полезной инфы вываливается.
  
Наверх
 
IP записан
 
filh
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 36
Зарегистрирован: 23. Августа 2010
Re: Запрос в 1sqlite
Ответ #8 - 10. Ноября 2010 :: 10:57
Печать  
Стало 3.2с! Забавно. И опять же, фокс пошустрей и намного.
Пока нет возможности галок "натыкать".
В первом посте код из отладки.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Запрос в 1sqlite
Ответ #9 - 10. Ноября 2010 :: 11:13
Печать  
filh писал(а) 10. Ноября 2010 :: 10:57:
Стало 3.2с! Забавно. И опять же, фокс пошустрей и намного.

Ну, фокс сука умный насчет таблички хитро соединить и просуммировать.
А так получилось вышли на уровень, сопоставимый с самой 1С.

filh писал(а) 10. Ноября 2010 :: 10:57:
Пока нет возможности галок "натыкать".

Ну, дело наживное.

filh писал(а) 10. Ноября 2010 :: 10:57:
В первом посте код из отладки.

Значит, не весь код. Там еще должна быть инфа про подбор индексов.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Запрос в 1sqlite
Ответ #10 - 10. Ноября 2010 :: 11:19
Печать  
Ради интереса, попробуй еще
Запрос.ВыполнятьВТранзакции = 1;

И еще интересно, насколько подскакивает потребление памяти процессом 1С при выполнении запроса фоксом и 1sqlite.
  
Наверх
 
IP записан
 
filh
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 36
Зарегистрирован: 23. Августа 2010
Re: Запрос в 1sqlite
Ответ #11 - 10. Ноября 2010 :: 11:39
Печать  
orefkov писал(а) 10. Ноября 2010 :: 11:19:
Ради интереса, попробуй еще
Запрос.ВыполнятьВТранзакции = 1;

Очень довольный Запрос длился 0.3c!
orefkov писал(а) 10. Ноября 2010 :: 11:19:
И еще интересно, насколько подскакивает потребление памяти процессом 1С при выполнении запроса фоксом и 1sqlite.

фокс порядка 1мб, 1sqlite в 10 раз меньше.
  
Наверх
 
IP записан
 
filh
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 36
Зарегистрирован: 23. Августа 2010
Re: Запрос в 1sqlite
Ответ #12 - 10. Ноября 2010 :: 11:40
Печать  
orefkov писал(а) 10. Ноября 2010 :: 11:13:
Значит, не весь код. Там еще должна быть инфа про подбор индексов.

Это видел, в кратце, что означает?
Код
Выбрать все
Подбор индекса для таблицы RG8109:
	Ограничения: PERIOD=; SP8104[Номенклатура]=;
	Найдено в кэше
	Выбран индекс VIA8104: DTOS(PERIOD)+SP8104
	Стоимость: 16
Подбор индекса для таблицы RA8109:
	Ограничения: SP8104[Номенклатура]=; IDDOC=;
	Найдено в кэше
	Выбран индекс IDLINE: IDDOC+STR(LINENO,4)+STR(ACTNO,6)
	Стоимость: 42
Подбор индекса для таблицы 1SJOURN:
	Ограничения: RF8109[аОстаткиТМЦФр]=; IDDOC=; DATE>=; DATE<=;
	Найдено в кэше
	Выбран индекс IDDOC: IDDOC
	Стоимость: 20
Подбор индекса для таблицы RA8109:
	Ограничения: SP8104[Номенклатура]=;
	Найдено в кэше
	Индекс не выбран.
	Стоимость: 9986
Подбор индекса для таблицы 1SJOURN:
	Ограничения: RF8109[аОстаткиТМЦФр]=; DATE>=; DATE<=;
	Найдено в кэше
	Выбран индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC
	Стоимость: 60
Подбор индекса для таблицы RA8109:
	Ограничения: SP8104[Номенклатура]=; IDDOC=;
	Найдено в кэше
	Выбран индекс IDLINE: IDDOC+STR(LINENO,4)+STR(ACTNO,6)
	Стоимость: 42
Подбор индекса для таблицы RA8109:
	Ограничения: SP8104[Номенклатура]=; IDDOC=;
	Найдено в кэше
	Выбран индекс IDLINE: IDDOC+STR(LINENO,4)+STR(ACTNO,6)
	Стоимость: 42 


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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Запрос в 1sqlite
Ответ #13 - 11. Ноября 2010 :: 02:00
Печать  
filh писал(а) 10. Ноября 2010 :: 11:40:
Стоимость?

Бабки перечисляй! Подмигивание
шучу.
по идее, тут не может быть иной стоимости кроме затрат времени и ресурсов...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать