Переключение на Главную Страницу Страницы: 1 2 3 [4] 5 6 ... 8 ОтправитьПечать
Очень популярная тема (более 25 ответов) Выборка остатков прямым запросом (число прочтений - 30194 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #45 - 22. Сентября 2010 :: 13:41
Печать  
(Альтаир) В прямом запросе у Вас идет сравнение
поля PERIOD ( тип datetime ) с строкой.  Это неправильно
(смотри как правильно например в #14 )


PS также надо создавать два независимых теста один для прямого запроса
второй для стандартного запроса.
Перед каждым действием очищать кеш процедур и буфер
а сейчас выполнив сначала прямой запрос Вы разогрели
данные и при стандартном запросе идет только логическое
чтение из кеша.
  
Наверх
 
IP записан
 
Альтаир
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 13
Местоположение: Харьков, Украина
Зарегистрирован: 26. Сентября 2008
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #46 - 22. Сентября 2010 :: 14:20
Печать  
to Z1
т.е. так?

стрдатыТА=строка(формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД"));
глОстТовара = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
|SELECT
|      SUM($Рег.ОстатокТовара)
|FROM
|      $РегистрИтоги.ОстаткиТоваров Рег (NoLock)
|WHERE
|Рег.PERIOD= cast ('"+стрдатыТА+"'as datetime) AND
|      $Рег.Товар = ?
|";

P.S. А как очистить кеш?
по поводу 2 запросов, наверно, в этом есть смысл, но в данном случае я хотел оценить прирост производительности от прямых запросов по сравнению с реальной ситуацией. А сейчас получение остатков идет через Регистр.СводныйОстаток(), с маленькими нюансами - возможны фильтры еще по одному из измерений.
  

Все животные равны, но некоторые равнее других.&&© Джордж Оруэлл "Скотный двор"
Наверх
www  
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #47 - 22. Сентября 2010 :: 14:25
Печать  
У меня кстати на прямых все быстрее забегало. Все СводныеОстатки переписал на параметрические, заработало раза в 2 быстрее. В перспективе буду пытаться еще на ТП форму какую-нибудь сваять, посмотрим, что получится  Улыбка
  
Наверх
 
IP записан
 
Альтаир
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 13
Местоположение: Харьков, Украина
Зарегистрирован: 26. Сентября 2008
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #48 - 22. Сентября 2010 :: 14:33
Печать  
to Z1
а насчет разогрева Вы правы - несколько раз запускал повторно и каждый раз 1 попытка была дольше всех отстальных.
Но это не касается СводныйОстаток  Улыбка
  

Все животные равны, но некоторые равнее других.&&© Джордж Оруэлл "Скотный двор"
Наверх
www  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #49 - 22. Сентября 2010 :: 14:40
Печать  
Альтаир писал(а) 22. Сентября 2010 :: 14:33:
to Z1
а насчет разогрева Вы правы - несколько раз запускал повторно и каждый раз 1 попытка была дольше всех отстальных.
Но это не касается СводныйОстаток  Улыбка


Очистить кеш процедур
DBCC FREEPROCCACHE
очистить буфер данных
dbcc dropcleanbuffers

Сейчас пишу тест. у меня прямой запрос выигрывает.


  
Наверх
 
IP записан
 
Альтаир
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 13
Местоположение: Харьков, Украина
Зарегистрирован: 26. Сентября 2008
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #50 - 22. Сентября 2010 :: 14:42
Печать  
Z1 писал(а) 22. Сентября 2010 :: 14:40:
Сейчас пишу тест. у меня прямой запрос выигрывает.


У меня он тоже выигрывает, но только при включенном Отборе Итогов
И только из кеша.  Улыбка
  

Все животные равны, но некоторые равнее других.&&© Джордж Оруэлл "Скотный двор"
Наверх
www  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #51 - 22. Сентября 2010 :: 14:53
Печать  
Альтаир писал(а) 22. Сентября 2010 :: 14:42:
Z1 писал(а) 22. Сентября 2010 :: 14:40:
Сейчас пишу тест. у меня прямой запрос выигрывает.


У меня он тоже выигрывает, но только при включенном Отборе Итогов
И только из кеша.  Улыбка

у меня нет на этом регистре включенных галок ( ни итоги ни движения)
сейчас выложу результаты.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #52 - 22. Сентября 2010 :: 15:02
Печать  
Перед каждым пестом очищал кеш и буфер
Сформировать1 Стандартный сводный остаток
Сформировать2 Прямой запрос + Параметр как у Вас
(сам так никогда не пишу )
Сформировать3 Прямой запрос + УстановитьТекстовыйПараметр
(сам так всегда пишу )

Код
Выбрать все
Процедура Сформировать1()
 спр=СоздатьОбъект("Справочник.СкладскиеЯчейки");

     Для Инд=1 По 10 Цикл
	     Сообщить("Попытка № "+Инд);

	     спр.ВыбратьЭлементы(0);
	     А=0;
	     ОбщееНачало=_GetPerformanceCounter();
	     Пока Спр.ПолучитьЭлемент()=1 Цикл
		     Если Спр.ЭтоГруппа()=1 Тогда
			     Продолжить;
		     КонецЕсли;
		     );
		     А=А+1;
		     Если А=1000 Тогда
			     Прервать;
		     КонецЕсли;
	     КонецЦикла;
	     ОбщееВремя=(_GetPerformanceCounter()-ОбщееНачало)/1000;
	     Сообщить("Регистр = "+ОбщееВремя);
     КонецЦикла;
КонецПроцедуры


Процедура Сформировать2()
 	спр=СоздатьОбъект("Справочник.СкладскиеЯчейки");
	стрдатыТА=строка(формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД"));
	стрдатыТА = " cast('" + стрдатыТА + "' as " +  ТипДата_sql  + "  )";
    глОстТовара = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
     |SELECT
     |	SUM($Рег.ОстатокТовара)
     |FROM
     |	$РегистрИтоги.ОстаткиТоваров Рег (NoLock)
     |WHERE
     |	Рег.PERIOD="+стрдатыТА+" AND
     |	$Рег.СклЯчейка = ?
     |";
	Если глОстТовара.Подготовить(ТекстЗапроса)=0 тогда
	     сообщить("Ошибка подготовки запроса остатков по складу (гл)! "+глОстТовара.ПолучитьОписаниеОшибки()+РазделительСтрок+"Свяжитесь с админитсратором!!!");
     КонецЕсли;
	глОстТовара.ПостроитьПараметры();
     Для Инд=1 По 10 Цикл
	     Сообщить("Попытка № "+Инд);

	     спр.ВыбратьЭлементы(0);
	     А=0;
	     ОбщееНачало=_GetPerformanceCounter();
	     Пока Спр.ПолучитьЭлемент()=1 Цикл
		     Если Спр.ЭтоГруппа()=1 Тогда
			     Продолжить;
				КонецЕсли;
				глОстТовара.УстПараметр(1, Спр.ТекущийЭлемент() );
			     ост=глОстТовара.ВыполнитьСкалярный();
		     А=А+1;
		     Если А=1000 Тогда
			     Прервать;
		     КонецЕсли;
	     КонецЦикла;
	     ОбщееВремя=(_GetPerformanceCounter()-ОбщееНачало)/1000;
	     Сообщить("Прямойзапрос Параметр = "+ОбщееВремя);
     КонецЦикла;
КонецПроцедуры

Процедура Сформировать3()
 	спр=СоздатьОбъект("Справочник.СкладскиеЯчейки");
	стрдатыТА=строка(формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД"));
	стрдатыТА = " cast('" + стрдатыТА + "' as " +  ТипДата_sql  + "  )";
    глОстТовара = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
     |SELECT
     |	SUM($Рег.ОстатокТовара)
     |FROM
     |	$РегистрИтоги.ОстаткиТоваров Рег (NoLock)
     |WHERE
     |	Рег.PERIOD="+стрдатыТА+" AND
     |	$Рег.СклЯчейка = :Зн_Ячейки
     |";
	 глОстТовара.РежимRPC(1);
     Для Инд=1 По 10 Цикл
	     Сообщить("Попытка № "+Инд);

	     спр.ВыбратьЭлементы(0);
	     А=0;
	     ОбщееНачало=_GetPerformanceCounter();
	     Пока Спр.ПолучитьЭлемент()=1 Цикл
		     Если Спр.ЭтоГруппа()=1 Тогда
			     Продолжить;
				КонецЕсли;
				глОстТовара.УстановитьТекстовыйПараметр("Зн_Ячейки", Спр.ТекущийЭлемент());

			     ост=глОстТовара.ВыполнитьСкалярный();
		     А=А+1;
		     Если А=1000 Тогда
			     Прервать;
		     КонецЕсли;
	     КонецЦикла;
	     ОбщееВремя=(_GetPerformanceCounter()-ОбщееНачало)/1000;
	     Сообщить("Прямойзапрос   УстановитьТекстовыйПараметр= "+ОбщееВремя);
     КонецЦикла;
КонецПроцедуры

 

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #53 - 22. Сентября 2010 :: 15:03
Печать  
Тест1
Попытка № 1
Регистр = 6.565
Попытка № 2
Регистр = 5.961
Попытка № 3
Регистр = 5.927
Попытка № 4
Регистр = 6.373
Попытка № 5
Регистр = 6.225
Попытка № 6
Регистр = 5.944
Попытка № 7
Регистр = 6.352
Попытка № 8
Регистр = 5.975
Попытка № 9
Регистр = 5.978
Попытка № 10
Регистр = 6.256
  
Наверх
 
IP записан
 
Альтаир
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 13
Местоположение: Харьков, Украина
Зарегистрирован: 26. Сентября 2008
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #54 - 22. Сентября 2010 :: 15:03
Печать  
Z1 писал(а) 22. Сентября 2010 :: 14:53:
сейчас выложу результаты.


и код, пожалуйста, тоже
  

Все животные равны, но некоторые равнее других.&&© Джордж Оруэлл "Скотный двор"
Наверх
www  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #55 - 22. Сентября 2010 :: 15:03
Печать  
тест2

Попытка № 1
Прямойзапрос Параметр = 5.107
Попытка № 2
Прямойзапрос Параметр = 4.895
Попытка № 3
Прямойзапрос Параметр = 4.9
Попытка № 4
Прямойзапрос Параметр = 4.919
Попытка № 5
Прямойзапрос Параметр = 4.893
Попытка № 6
Прямойзапрос Параметр = 4.911
Попытка № 7
Прямойзапрос Параметр = 4.892
Попытка № 8
Прямойзапрос Параметр = 4.91
Попытка № 9
Прямойзапрос Параметр = 4.925
Попытка № 10
Прямойзапрос Параметр = 4.901
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #56 - 22. Сентября 2010 :: 15:04
Печать  
тест 3
Попытка № 1
Прямойзапрос   УстановитьТекстовыйПараметр= 0.824
Попытка № 2
Прямойзапрос   УстановитьТекстовыйПараметр= 0.766
Попытка № 3
Прямойзапрос   УстановитьТекстовыйПараметр= 0.764
Попытка № 4
Прямойзапрос   УстановитьТекстовыйПараметр= 0.774
Попытка № 5
Прямойзапрос   УстановитьТекстовыйПараметр= 0.795
Попытка № 6
Прямойзапрос   УстановитьТекстовыйПараметр= 0.762
Попытка № 7
Прямойзапрос   УстановитьТекстовыйПараметр= 0.778
Попытка № 8
Прямойзапрос   УстановитьТекстовыйПараметр= 0.761
Попытка № 9
Прямойзапрос   УстановитьТекстовыйПараметр= 0.765
Попытка № 10
Прямойзапрос   УстановитьТекстовыйПараметр= 0.763
« Последняя редакция: 23. Сентября 2010 :: 14:35 - Z1 »  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #57 - 22. Сентября 2010 :: 15:05
Печать  
Попробуйте сделать у себя тест3.
получается в тест2 неправильно выставлены параметры.
лучше их назначать самому. но точнее не могу сказать как.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #58 - 22. Сентября 2010 :: 17:09
Печать  
Z1 писал(а) 22. Сентября 2010 :: 15:05:
Попробуйте сделать у себя тест3.
получается в тест2 неправильно выставлены параметры.
лучше их назначать самому. но точнее не могу сказать как.


А если вот так вот попробовать:
ТекстЗапроса = "
     |SET NOCOUNT ON
     |declare @ВыбЯчейка as VarChar(9)
     |SET @ВыбЯчейка = ?
     |SELECT
     |      SUM($Рег.ОстатокТовара)
     |FROM
     |      $РегистрИтоги.ОстаткиТоваров Рег (NoLock)
     |WHERE
     |      Рег.PERIOD="+стрдатыТА+" AND
     |      $Рег.СклЯчейка = @ВыбЯчейка
     |";
Сразу скажу - как часто упоминается на форуме sql.ru однозначное описание параметра по типу приводит к правильному построению плана запроса.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #59 - 23. Сентября 2010 :: 04:21
Печать  
leshik писал(а) 22. Сентября 2010 :: 17:09:
Z1 писал(а) 22. Сентября 2010 :: 15:05:
Попробуйте сделать у себя тест3.
получается в тест2 неправильно выставлены параметры.
лучше их назначать самому. но точнее не могу сказать как.


А если вот так вот попробовать:
ТекстЗапроса = "
    |SET NOCOUNT ON
    |declare @ВыбЯчейка as VarChar(9)
    |SET @ВыбЯчейка = ?
    |SELECT
    |      SUM($Рег.ОстатокТовара)
    |FROM
    |      $РегистрИтоги.ОстаткиТоваров Рег (NoLock)
    |WHERE
    |      Рег.PERIOD="+стрдатыТА+" AND
    |      $Рег.СклЯчейка = @ВыбЯчейка
    |";
Сразу скажу - как часто упоминается на форуме sql.ru однозначное описание параметра по типу приводит к правильному построению плана запроса.

во первых тип должен быть char(9)
но все равно так вообще не работает
код :
Код
Выбрать все
Процедура Сформировать21()
 	спр=СоздатьОбъект("Справочник.СкладскиеЯчейки");
	стрдатыТА=строка(формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД"));
	стрдатыТА = " cast('" + стрдатыТА + "' as " +  ТипДата_sql  + "  )";
    глОстТовара = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
	 |SET NOCOUNT ON
     |declare @ВыбЯчейка  Char(9)
     |SET @ВыбЯчейка = ?
     |SELECT
     |	SUM($Рег.ОстатокТовара)
     |FROM
     |	$РегистрИтоги.ОстаткиТоваров Рег (NoLock)
     |WHERE
     |	Рег.PERIOD="+стрдатыТА+" AND
     |	$Рег.СклЯчейка = @ВыбЯчейка
     |";
	Если глОстТовара.Подготовить(ТекстЗапроса)=0 тогда
	     сообщить("Ошибка подготовки запроса остатков по складу (гл)! "+глОстТовара.ПолучитьОписаниеОшибки()+РазделительСтрок+"Свяжитесь с админитсратором!!!");
     КонецЕсли;
	глОстТовара.ПостроитьПараметры();
     Для Инд=1 По 10 Цикл
	     Сообщить("Попытка № "+Инд);

	     спр.ВыбратьЭлементы(0);
	     А=0;
	     ОбщееНачало=_GetPerformanceCounter();
	     Пока Спр.ПолучитьЭлемент()=1 Цикл
		     Если Спр.ЭтоГруппа()=1 Тогда
			     Продолжить;
				КонецЕсли;
				глОстТовара.УстПараметр(1, Спр.ТекущийЭлемент() );
			     ост=глОстТовара.ВыполнитьСкалярный();
		     А=А+1;
		     Если А=1000 Тогда
			     Прервать;
		     КонецЕсли;
	     КонецЦикла;
	     ОбщееВремя=(_GetPerformanceCounter()-ОбщееНачало)/1000;
	     Сообщить("Прямойзапрос Параметр 21 = "+ОбщееВремя);
     КонецЦикла;
КонецПроцедуры
 


Результат :
Попытка № 1
ост=глОстТовара.ВыполнитьСкалярный();                        
{D:\1CPP_TEST\TEST_70_СВОДНЫЙОСТАТОК.ERT(102)}: State 07009, native 0, message [Microsoft][ODBC SQL Server Driver]Недопустимый индекс дескриптора
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 3 [4] 5 6 ... 8
ОтправитьПечать