Переключение на Главную Страницу Страницы: [1] 2 3 ... 6 ОтправитьПечать
Очень популярная тема (более 25 ответов) Можно ли ускорить процесс выборки (число прочтений - 13838 )
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Можно ли ускорить процесс выборки
04. Сентября 2011 :: 10:09
Печать  
Перевели базу на SQL, работать работает, но есть проблема в подборе очень сильно тормозит. Проанализировав по замерам производительности обнаружил две процедуры которые портят все дело:
глВернутьЦену()
глПолчитьОстатокНоменклатуры()

переработав данные процедуры на прямые запросы, я выяснил что процдура получения остатко на прямых запросах работает в 8 раз медленнее (и то на втором  далее тесте. на первом тормоза аж в 16 раз)

Вот какие запросы я наваял
Код
Выбрать все
//Сформируем переменные строки для текстов запроса
	СтрокаСкладУсловие = "";
	СтрокаСкладИзмерение = "";
	СтрокаФирмаУсловие = "";
	СтрокаДоговорУсловие = "";
	СтрокаДоговорИзмерение = "";
	СтрокаЗаявкаУсловие = "";
	СтрокаЗаявкаИзмерение = "";
	Если ПустоеЗначение(Склад) = 0 Тогда
		СтрокаСкладУсловие 		= " AND Склад = :ВыбСклад";
		СтрокаСкладИзмерение 	= ",Склад";
	КонецЕсли;
	Если ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда
		СтрокаФирмаУсловие = "Фирма = :ВыбФирма";
	ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "СписокЗначений" Тогда
		СтрокаФирмаУсловие = "Фирма IN (Select VAL FROM #СписокФирм)";
	КонецЕсли;
	Если ПустоеЗначение(Договор) = 0 Тогда
		СтрокаДоговорУсловие   = " AND ДоговорПокупателя = :ВыбДоговор";
		СтрокаДоговорИзмерение = ",ДоговорПокупателя";
	КонецЕсли;
	Если ПустоеЗначение(Заявка) = 0 Тогда
		СтрокаЗаявкаУсловие 		= " AND ЗаявкаПокупателя = :ВыбЗаявка";
		СтрокаЗаявкаИзмерение 	= ",ЗаявкаПокупателя";
	КонецЕсли;
//Сформируем тексты запросов
	------------------
	ТекстЗапросаОстаткиНаСкладе = "
	|SELECT
	|	SUM(РегОстатки.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.ОстаткиТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл " + СтрокаСкладУсловие + ",
	|	(Фирма,Номенклатура"+ СтрокаСкладИзмерение +"),Количество) as РегОстатки
	|";
	------------------
	ТекстЗапросаОстаткиНаФирме = "
	|SELECT
	|	SUM(РегОстатки.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.ОстаткиТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл,
	|	(Фирма, Номенклатура), Количество) as РегОстатки
	|";
	------------------
	ТекстЗапросаРезервыНаСкладе = "
	|SELECT
	|	SUM(РегРезервы.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.РезервыТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл " + СтрокаСкладУсловие + ",
	|	(Фирма,Номенклатура"+ СтрокаСкладИзмерение +"),Количество) as РегРезервы
	|";
	------------------
	ТекстЗапросаРезервыНаФирме = "
	|SELECT
	|	SUM(РегРезервы.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.РезервыТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл,
	|	(Фирма,Номенклатура),Количество) as РегРезервы
	|";
	------------------
	ТекстЗапросаРезервыПоДоговоруНаСкладе = "
	|SELECT
	|	SUM(РегРезервы.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.РезервыТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл
	|" + СтрокаСкладУсловие + СтрокаДоговорУсловие + ",
	|	(Фирма,Номенклатура"+ СтрокаСкладИзмерение + СтрокаДоговорИзмерение + "),Количество) as РегРезервы
	|";
	------------------
	ТекстЗапросаРезервыПоЗаявкеНаСкладе = "
	|SELECT
	|	SUM(РегРезервы.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.РезервыТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл
	|" + СтрокаСкладУсловие + СтрокаЗаявкаУсловие + ",
	|	(Фирма,Номенклатура"+ СтрокаСкладИзмерение + СтрокаЗаявкаИзмерение + "),Количество) as РегРезервы
	|";
	------------------
	ТекстЗапросаРезервыПоДоговоруНаФирме = "
	|SELECT
	|	SUM(РегРезервы.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.РезервыТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл
	|" + СтрокаДоговорУсловие + ",
	|	(Фирма,Номенклатура" + СтрокаДоговорИзмерение + "),Количество) as РегРезервы
	|";
	------------------
	ТекстЗапросаРезервыПоЗаявкеНаФирме = "
	|SELECT
	|	SUM(РегРезервы.КоличествоОстаток) as Количество
	|FROM
	|	$РегистрОстатки.РезервыТМЦ(:ВыбДата~,," + СтрокаФирмаУсловие + " AND Номенклатура = :ВыбНоменкл
	|" + СтрокаЗаявкаУсловие +",
	|	(Фирма,Номенклатура" + СтрокаЗаявкаИзмерение + "),Количество) as РегРезервы
	|";
	------------------
 



Вопрос как ускорить все это хозяйство!

при 46 повторениях процедура выполняется 1,5 секунды
хотелось бы где то почитать вообще про методы оптимизации подобных вещей.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #1 - 04. Сентября 2011 :: 11:24
Печать  
В списке измерений оставь только номенклатуру, убери sum, установи отбор движений и итогов по номенклатуре и включи rpcmode.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #2 - 04. Сентября 2011 :: 15:23
Печать  
berezdetsky писал(а) 04. Сентября 2011 :: 11:24:
В списке измерений оставь только номенклатуру, убери sum, установи отбор движений и итогов по номенклатуре и включи rpcmode.


Все сделал штатная процедура работает в 2 раза быстрей
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #3 - 04. Сентября 2011 :: 16:08
Печать  
Значит, она отличается не только способом получения итогов.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #4 - 04. Сентября 2011 :: 16:20
Печать  
berezdetsky писал(а) 04. Сентября 2011 :: 16:08:
Значит, она отличается не только способом получения итогов.


Это все что есть в стандартной процедуре ... естественно что в нее передаются уже рассчитанные регистры. Возможно что то подобное на прямых запросах, что бы не рассчитывать их каждый раз?

ОстатокНаСкладе = 
                       ОстатокПоФирме  = ОстаткиТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,,,"Количество");
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #5 - 04. Сентября 2011 :: 16:35
Печать  
Можно выгрузить расчитанные итоги во временную таблицу или таблицу значений - по обстановке.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #6 - 05. Сентября 2011 :: 02:46
Печать  
berezdetsky писал(а) 04. Сентября 2011 :: 16:35:
Можно выгрузить расчитанные итоги во временную таблицу

Поясни.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #7 - 05. Сентября 2011 :: 05:45
Печать  
mozer писал(а) 05. Сентября 2011 :: 02:46:
berezdetsky писал(а) 04. Сентября 2011 :: 16:35:
Можно выгрузить расчитанные итоги во временную таблицу

Поясни.


SELECT A, B, C INTO #tmp_remains FROM $РегистрОстатки(и т.д.)
  
Наверх
ICQ  
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #8 - 05. Сентября 2011 :: 05:51
Печать  
Salimbek писал(а) 05. Сентября 2011 :: 05:45:
mozer писал(а) 05. Сентября 2011 :: 02:46:
berezdetsky писал(а) 04. Сентября 2011 :: 16:35:
Можно выгрузить расчитанные итоги во временную таблицу

Поясни.


SELECT A, B, C INTO #tmp_remains FROM $РегистрОстатки(и т.д.)

Спасибо буду копать!
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #9 - 06. Сентября 2011 :: 04:35
Печать  
можно ли это хозяйство объединить в один запрос:
Код
Выбрать все
	НаборЗаписей = СоздатьОбъект("ODBCRecordset");
	НаборЗаписей.РежимRPC(1);
	//Сформируем переменные строки для текстов запроса
	СтрокаСкладУсловиеОстаток = "";
	СтрокаСкладУсловиеРезерв = "";
	СтрокаФирмаУсловиеОстаток = "";
	СтрокаФирмаУсловиеРезерв = "";
	Если ПустоеЗначение(Склад) = 0 Тогда
		СтрокаСкладУсловиеОстаток = " AND $РегОстатки.Склад = :ВыбСклад";
		СтрокаСкладУсловиеРезерв = " AND $РегРезервы.Склад = :ВыбСклад";
	КонецЕсли;
	Если ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда
		СтрокаФирмаУсловиеОстаток = " AND $РегОстатки.Фирма = :ВыбФирма";
		СтрокаФирмаУсловиеРезерв = " AND $РегРезервы.Фирма = :ВыбФирма";
	ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "СписокЗначений" Тогда
		СтрокаФирмаУсловиеОстаток = "AND $РегОстатки.Фирма IN (Select VAL FROM #СписокФирм)";
		СтрокаФирмаУсловиеРезерв = " AND $РегРезервы.Фирма IN (Select VAL FROM #СписокФирм)";
	КонецЕсли;
	//Сформируем тексты запросов
	------------------
	ТекстЗапросаОстаткиНаСкладе = "
	|SELECT
	|	SUM($РегОстатки.Количество) as Количество
	|FROM
	|	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
	|WHERE
	|	РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстаток + " AND $РегОстатки.Номенклатура = :ВыбНоменкл " + СтрокаСкладУсловиеОстаток + "
	|";
	------------------
	ТекстЗапросаОстаткиНаФирме = "
	|SELECT
	|	SUM($РегОстатки.Количество) as Количество
	|FROM
	|	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
	|WHERE
	|	РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстаток + " AND $РегОстатки.Номенклатура = :ВыбНоменкл
	|";
	------------------
	ТекстЗапросаРезервыНаСкладе = "
	|SELECT
	|	SUM($РегРезервы.Количество) as Количество
	|FROM
	|	$РегистрИтоги.РезервыТМЦ as РегРезервы
	|WHERE
	|	РегРезервы.Period = :ВыбДата~~" + СтрокаФирмаУсловиеРезерв + " AND $РегРезервы.Номенклатура = :ВыбНоменкл " + СтрокаСкладУсловиеРезерв + "
	|";
	------------------
	ТекстЗапросаРезервыНаФирме = "
	|SELECT
	|	SUM($РегРезервы.Количество) as Количество
	|FROM
	|	$РегистрИтоги.РезервыТМЦ as РегРезервы
	|WHERE
	|	РегРезервы.Period = :ВыбДата~~" + СтрокаФирмаУсловиеРезерв + " AND $РегРезервы.Номенклатура = :ВыбНоменкл
	|"; 

  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Можно ли ускорить процесс выборки
Ответ #10 - 06. Сентября 2011 :: 05:14
Печать  
Код
Выбрать все
select
	sum(ОстНаСкладе) ОстНаСкладе,
	sum(ОстНаФирме) ОстНаФирме,
	sum(РезервНаСкладе) РезервНаСкладе,
	sum(РезервНаФирме) РезервНаФирме
From
(
SELECT
	$РегОстатки.Количество ОстНаСкладе,
	0 ОстНаФирме,
	0 РезервНаСкладе,
	0 РезервНаФирме
FROM
	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
WHERE
...

Union All

SELECT
	0 ОстНаСкладе,
	0 ОстНаФирме,
	$РегРезервы.Количество РезервНаСкладе,
	0 РезервНаФирме
FROM
	$РегистрИтоги.РезервыТМЦ as РегРезервы
WHERE
...

Union all
...
) 



Только вряд ли это будет быстрее.
Попробуй сделать скулевую реиндексацию + обнови статистику.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #11 - 06. Сентября 2011 :: 05:45
Печать  
Satans Claws писал(а) 06. Сентября 2011 :: 05:14:
Только вряд ли это будет быстрее.
Попробуй сделать скулевую реиндексацию + обнови статистику.

Спасибо попробую, о такой реализации что то я не догадался, попробовал с под запросами такая фигня получилась.

Реиндексацию делал + статистику обновлял. не помогает!

При вызове процедуры получения остатков (48 вызовов) время затраченое на выполнение 0,3 секунды + получение цены 0.09 итого 0,4 это много пользователи жалуются на тормоза в подпоре номенклатуры. Вот и выискиваю разные способы. попробывать использовать один запрос в место 4.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #12 - 06. Сентября 2011 :: 05:57
Печать  
Переписать подбор на табличное поле, где поставщиком будет прямой запрос не предлагать ?
Подмигивание

ЗЫ: ну или хотя бы использовать параметезированный запрос что-ли.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #13 - 06. Сентября 2011 :: 05:59
Печать  
mozer писал(а) 06. Сентября 2011 :: 05:45:
(48 вызовов)

Фигасе..  Ужас Получай 48 итогов одним запросом в таблицу значений.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #14 - 06. Сентября 2011 :: 06:14
Печать  
berezdetsky писал(а) 06. Сентября 2011 :: 05:59:
Фигасе..  Ужас Получай 48 итогов одним запросом в таблицу значений.


не сможет, у него это всё вызывается в текстовой колонке в форме списка справочника, скорее всего.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 6
ОтправитьПечать