Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Выборка остатков прямым запросом (число прочтений - 30522 )
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Выборка остатков прямым запросом
16. Сентября 2010 :: 04:56
Печать  
Перешли с dbf на SQL (1С 7.7). Все по скорости нормально работает, кроме одной вещи: в списке справочника Номенклатура (подбор из документа) в колонке остатки рассчитывается остаток на ТА и дико тормозит. Попытался сделать это прямым запросом:

//********************************************************
Функция ВернутьОстаток(Знач парНом, Знач парСклад)
     Перем Таб_Ост, Таб_Рез;
     
     ТекстЗапроса = "
     |SELECT
     |      $Рег.Количество as Количество
     |FROM
     |      $Регистр.ОстаткиТМЦ as Рег
     |WHERE
     |      $Рег.Номенклатура = ? AND
     |      $Рег.Склад IN (SELECT Val From #ГруппаСкладов) AND
     |      $Рег.Фирма IN (SELECT Val From #ГруппаФирм) ";
     
     RS.УложитьСписокОбъектов(парСклад,"#ГруппаСкладов","Склады");
     RS.УложитьСписокОбъектов(ФирмаДляОстатковТМЦ,"#ГруппаФирм","Фирмы");
     RS.Подготовить(ТекстЗапроса);
     RS.ПостроитьПараметры();
     RS.УстПараметр(1,парНом);
     
     КолОст = RS.ВыполнитьСкалярный();
     
     Возврат КолОст;
КонецФункции // ВернутьОстаток

парНом - элемент Спр.Номенклатура
парСклад - СписокЗначений с элементами типа Спр.Склады
ФирмаДляОстатковТМЦ - СписокЗначений с элементами типа Спр.Фирмы

При открытии списка справочника и развертке до элементов 1С вылетает с ошибкой
"подключение занято до получения результатов для другого hstmt"

В чем может быть дело? Раньше прямыми запросами не пользовался никогда. Просьба помочь...
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #1 - 16. Сентября 2010 :: 05:47
Печать  
Забыли условие на period, это как минимум и лучше написать sum($Рег.Количество)
У нас так (это в ПриНачалеРаботыСистемы()):
Код
Выбрать все
Перем глОстТовара  Экспорт;

стрдатыТА=строка(формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД"));

глОстТовара = СоздатьОбъект("ODBCRecordset");  
ТекстЗапроса = "
|SELECT
|	SUM($Рег.Остаток)
|FROM
|	$РегистрИтоги.Остатки Рег (NoLock)
|WHERE
|	Рег.PERIOD='"+стрдатыТА+"' AND
|	$Рег.Товар = ? AND  
|	$Рег.Склад = ?
|";

Если глОстТовара.Подготовить(ТекстЗапроса)=0 тогда
	сообщить("Ошибка подготовки запроса остатков по складу (гл)! "+глОстТовара.ПолучитьОписаниеОшибки()+РазделительСтрок+"Свяжитесь с админитсратором!!!");
КонецЕсли;
глОстТовара.ПостроитьПараметры();  



А в форме списка - вызов:
Код
Выбрать все
Функция глОстатокТовара(товар,склад) Экспорт
	ост=0;
	глОстТовара.УстПараметр(1, товар);
	глОстТовара.УстПараметр(2, склад);
	ост=глОстТовара.ВыполнитьСкалярный();
	Возврат ост;
КонецФункции  

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



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #2 - 16. Сентября 2010 :: 05:51
Печать  
Запрос возвращает много строк. Может
Код
Выбрать все
SUM($Рег.Количество) as Количество 


Упс, не успел
  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #3 - 16. Сентября 2010 :: 05:59
Печать  
Цитата из учебника: (подчёркивания мои)

Глава 5: Вывод остатков в форме списка
Для этой цели больше всего подходят параметризированные запросы(только для СКЛ!).

Выглядит такой запрос так:
Код
Выбрать все
ТекстЗапроса = "
|SELECT
|	$Рег.Количество as Количество
|FROM
|	$РегистрИтоги.ОстаткиТоваров as Рег
|WHERE
|	Рег.Period = {d’2005-01-01’} AND
|	$Рег.Склад = ? AND
|	$Рег.Товар = ?"; 



Суть состоит в том, что запрос компилируется только 1 раз, а в остальные разы меняются только параметры, помеченные знаком “?”. За счет этого достигается некоторый выигрыш в скорости.

Для того, чтобы воспользоваться этой хорошей штукой поступим следующим образом:
В модуле формы заведем переменную RS. В процедуре ПриОткрытии() проинициализируем ее:

Код
Выбрать все
Процедура ПриОткрытии()
	RS = СоздатьОбъект("ODBCRecordset");
	ТекстЗапроса = // … смотри выше
	RS.Подготовить(ТекстЗапроса);
	RS.ПостроитьПараметры();
	RS.УстПараметр(1, ВыбСклад);
КонецПроцедуры 


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

Код
Выбрать все
Функция ПолучитьОстаток()
	RS.УстПараметр(2, ТекущийЭлемент());
	Возврат RS.ВыполнитьСкалярный();
КонецФункции 



Здесь нужно помнить, что запрос нужно писать такой, который вернет только одну позицию. Это можно всегда сделать с помощью функции SUM(). Опять же для того чтобы это быстро бегало необходимо наиболее точно попасть в индекс, т.е указать все поля участвующие в индексе. В данном случае это все измерения.

В этом примере мы использовали метод ВыполнитьСкалярный() который возвращает не таблицу, а единственное значение или структуры, если выбирается несколько колонок.
Вы конечно спросите: А почему не использовали ВТ Остатки? Да, это единственное место где ее применять не очень хорошо, т.к. там присутствует метод GROUP BY, что несколько снижает скорость работы.
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Выборка остатков прямым запросом
Ответ #4 - 16. Сентября 2010 :: 06:52
Печать  
Добавил SUM - заработало, только медленно. Логично, что инициализацию запроса можно вынести в глобальный модуль или в ПриОткрытии формы.
Сделал так.
ПриОткрытии:
ТекстЗапроса = "
     |SELECT
     |      SUM($Рег.Количество) as Количество
     |FROM
     |      $Регистр.ОстаткиТМЦ as Рег
     |WHERE
     |      $Рег.Номенклатура = ? AND
     |      $Рег.Склад IN (SELECT Val From #ГруппаСкладов) AND
     |      $Рег.Фирма IN (SELECT Val From #ГруппаФирм) ";
     
     RS.УложитьСписокОбъектов(ФирмаДляОстатковТМЦ,"#ГруппаФирм","Фирмы");
     RS.Подготовить(ТекстЗапроса);
     RS.ПостроитьПараметры();

А функцию, возвращающую остаток:
//********************************************************
Функция ВернутьОстаток(Знач парНом, Знач парСклад, парСтрокой)
     
RS.УложитьСписокОбъектов(парСклад,"#ГруппаСкладов","Склады");
     RS.УстПараметр(1,парНом);
     
     КолОст = RS.ВыполнитьСкалярный();
     
     Возврат СокрЛП(КолОст);
КонецФункции // ВернутьОстаток

При работе 1С выдает ошибку:
RS.УстПараметр(1,парНом);
{Справочник.Номенклатура.ФормаСписка.ДляПодбора.Модуль(571)}: Недопустимое значение индекса параметра

И не понятно зачем Period. Ведь выборка на ТА идет
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка остатков прямым запросом
Ответ #5 - 16. Сентября 2010 :: 06:55
Печать  
Улыбка)
без периода тебе подсчитает сумму всех промежуточных итогов с начала ведения базы.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #6 - 16. Сентября 2010 :: 07:07
Печать  
Цитата:
сумму всех промежуточных итогов

если бы еще итогов... Улыбка
  

1&&2&&3
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Выборка остатков прямым запросом
Ответ #7 - 16. Сентября 2010 :: 07:09
Печать  
И почему
стрдатыТА=строка(формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД"));
а не
стрдатыТА=строка(формат(ПолучитьДатуТА(),"ДГГГГММДД"));
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка остатков прямым запросом
Ответ #8 - 16. Сентября 2010 :: 07:17
Печать  
trad писал(а) 16. Сентября 2010 :: 07:07:
Цитата:
сумму всех промежуточных итогов

если бы еще итогов... Улыбка


а чорт, вижу, что про останки говорят, а на сам текст запроса и не глядел даже .. Улыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #9 - 16. Сентября 2010 :: 07:20
Печать  
Foma писал(а) 16. Сентября 2010 :: 07:09:
И почему
стрдатыТА=строка(формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД"));
а не
стрдатыТА=строка(формат(ПолучитьДатуТА(),"ДГГГГММДД"));

Да потому что надо приводить к типу который в sql таблице.
поле PERIOD имеет тип DATETIME ( полученную строку надо
обрамлять в одиночные кавычки еще лучше явный cast ).

Раз заговорил о скорости то когда склад ( фирма ) только один элемент(это не папка)  вместо in надо формировать =

Еще совет ставь в текст
RS.Отладка(1);
и выполняй получившийся запрос через qa.

Также для единичного запроса не имеет смысла строить параметризированный запрос ( где есть ? )

PS ну и в #4 надо
$РегистрИтоги.ОстаткиТМЦ as Рег
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка остатков прямым запросом
Ответ #10 - 16. Сентября 2010 :: 07:20
Печать  
Foma писал(а) 16. Сентября 2010 :: 07:09:
И почему
стрдатыТА=строка(формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД"));
а не
стрдатыТА=строка(формат(ПолучитьДатуТА(),"ДГГГГММДД"));



Фома, а не пробовал в начале хотя бы разобраться, как устроен регистр в 1с ?
Что регистр, это 2 таблички, RA - для всех движений регистра, а RG - для промежуточных итогов.
http://www.script-coding.info/v77tables.html#3.4.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка остатков прямым запросом
Ответ #11 - 16. Сентября 2010 :: 07:23
Печать  
Z1 писал(а) 16. Сентября 2010 :: 07:20:
Да потому что надо приводить к типу который в sql таблице.



Да не, он просто не понимает, почему нужно начало месяца пихать, а не саму дату ТА..
Про периодичность хранения останков не слышал автор видать, и со структурой регистра не знаком.



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


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Выборка остатков прямым запросом
Ответ #12 - 16. Сентября 2010 :: 07:36
Печать  
Со структурой регистров знаком и что это 2 файлика тоже знаю. С 1С++ не знаком вообще. Вот и прошу помочь разобраться.
Честно говоря думал, что 1с++ как-то скрывает внутрянку и что прямыми запросами вытащить остатки на ТА довольно просто. Видимо я ошибался.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка остатков прямым запросом
Ответ #13 - 16. Сентября 2010 :: 07:43
Печать  
Foma писал(а) 16. Сентября 2010 :: 07:36:
Со структурой регистров знаком и что это 2 файлика тоже знаю. С 1С++ не знаком вообще. Вот и прошу помочь разобраться.
Честно говоря думал, что 1с++ как-то скрывает внутрянку и что прямыми запросами вытащить остатки на ТА довольно просто. Видимо я ошибался.


И сейчас ошибаешься. Еще проще чем ты думаешь.
Посмотри FAQ по прямым запросам - там всё есть.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #14 - 16. Сентября 2010 :: 07:50
Печать  
Foma писал(а) 16. Сентября 2010 :: 07:36:
Со структурой регистров знаком и что это 2 файлика тоже знаю. С 1С++ не знаком вообще. Вот и прошу помочь разобраться.
Честно говоря думал, что 1с++ как-то скрывает внутрянку и что прямыми запросами вытащить остатки на ТА довольно просто. Видимо я ошибался.


Цитата:
Со структурой регистров знаком и что это 2 файлика тоже знаю.

раз речь об sql то это не два файла а две таблицы.


Цитата:
1с++ как-то скрывает внутрянку

1с++ это практически чистый t-sql.
добавлен метапарсер подстановка имен в терминах 1с
( все что начинается с $ ).
Также результат выполнения запроса можно получить типизированным в объектах 1с ( наверно это непонятно и непривычно)


1с хранит итоги по месяцам ( в 99% процентах ).
итоги хранятся в таблице rg...
Поля этой таблицы
PERIOD
все измерения
все ресурсы

итоги на ТА хранятся в последнем ( по возрастанию периоде ).
поэтому для получения остатков на ТА надо в WHERE надо обязательно указать этот период.
например
WHERE PERIOD =  cast ('20100901' as datetime )  and ...
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Выборка остатков прямым запросом
Ответ #15 - 16. Сентября 2010 :: 08:26
Печать  
Получилось таким вот образом:
стрдатыТА=строка(формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД"));
   
     //RS.Отладка(1);
     
     ТекстЗапроса = "
     |SELECT
     |      SUM($Рег.Количество) as Количество
     |FROM
     |      $РегистрИтоги.ОстаткиТМЦ as Рег
     |WHERE
     |      Рег.PERIOD= cast ('"+стрдатыТА+"'as datetime) AND
     |      $Рег.Номенклатура = ? AND
     |      $Рег.Склад IN (SELECT Val From #ГруппаСкладов) AND
     |      $Рег.Фирма IN (SELECT Val From #ГруппаФирм) ";
     
     RS.УложитьСписокОбъектов(парСклад,"#ГруппаСкладов","Склады");
     RS.УложитьСписокОбъектов(ФирмаДляОстатковТМЦ,"#ГруппаФирм","Фирмы");
     RS.Подготовить(ТекстЗапроса);
     RS.ПостроитьПараметры();
     RS.УстПараметр(1,парНом);
     
     КолОст = RS.ВыполнитьСкалярный();
     
     Возврат КолОст;

Спасибо всем огромное!!!
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #16 - 16. Сентября 2010 :: 10:19
Печать  
И что, так быстрее работает, чем СводныйОстаток на ТА?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #17 - 16. Сентября 2010 :: 10:23
Печать  
Neo писал(а) 16. Сентября 2010 :: 10:19:
И что, так быстрее работает, чем СводныйОстаток на ТА?

А разве сводный остаток считает по любому
подмножеству складов и/или фирм ?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка остатков прямым запросом
Ответ #18 - 16. Сентября 2010 :: 10:29
Печать  
Z1 писал(а) 16. Сентября 2010 :: 10:23:
Neo писал(а) 16. Сентября 2010 :: 10:19:
И что, так быстрее работает, чем СводныйОстаток на ТА?

А разве сводный остаток считает по любому
подмножеству складов и/или фирм ?

Ну вообще то да, если перед этим на регистр фильтр наложить.
Только вот не быстрее, это точно
Улыбка
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #19 - 16. Сентября 2010 :: 10:30
Печать  
Нет,
я имел в виду в принципе, будет ли такой механизм в форме списка (через параметризованный прямой запрос) работать быстрее, чем СводныйОстаток на ТА (берем самый просто случай, когда надо брать 1 склад)? Просто интересно, так как у нас пока все стандартно, и стоит ли этим заморачиваться...
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #20 - 16. Сентября 2010 :: 10:32
Печать  
Eprst писал(а) 16. Сентября 2010 :: 10:29:
Z1 писал(а) 16. Сентября 2010 :: 10:23:
Neo писал(а) 16. Сентября 2010 :: 10:19:
И что, так быстрее работает, чем СводныйОстаток на ТА?

А разве сводный остаток считает по любому
подмножеству складов и/или фирм ?

Ну вообще то да, если перед этим на регистр фильтр наложить.
Только вот не быстрее, это точно
Улыбка

Об этом вообще (наложить фильтр на регистр ) уже забыл.
улучшить #15 можно если
1.если можно заменить in на =  в случае когда склад и/или фирма  )  только один элемент ( не папка ).




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


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #21 - 16. Сентября 2010 :: 10:39
Печать  
Просто где-то встречал, по-моему, даже на этом форуме, мысль о том, что СводныйОстаток на ТА уже некуда оптимизировать, и быстрее не получится. Вот и думаю, стоит ли овчинка выделки?

У автора топика каковы результаты, стало быстрее?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #22 - 16. Сентября 2010 :: 10:44
Печать  
Neo писал(а) 16. Сентября 2010 :: 10:30:
Нет,
я имел в виду в принципе, будет ли такой механизм в форме списка (через параметризованный прямой запрос) работать быстрее, чем СводныйОстаток на ТА (берем самый просто случай, когда надо брать 1 склад)? Просто интересно, так как у нас пока все стандартно, и стоит ли этим заморачиваться...

Ну тогда нужно точное описание Вашей задачи.
Склад один Склад это элемент или папка.
Если элемент то надо обязательно in заменять на #

Если папка то надо как минимум знать какой из вариантов
1.Произвольная папка
2. Внутри заданной папки находятся только элементы
тогда можно сделать условие на parentid
3.У заданной папки может быть много вложений но листья и группы не могут иметь одного родителя - Тогда надо строить дерево папок во временную таблицу и  in на parentid к этой вр.таблице.
( не знаю насколько написанное понятно ).
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #23 - 16. Сентября 2010 :: 10:45
Печать  
Neo писал(а) 16. Сентября 2010 :: 10:39:
Просто где-то встречал, по-моему, даже на этом форуме, мысль о том, что СводныйОстаток на ТА уже некуда оптимизировать, и быстрее не получится. Вот и думаю, стоит ли овчинка выделки?

У автора топика каковы результаты, стало быстрее?

не куда оптимизировать и имеет ли смысл оптимизировать
вот в чем вопрос. а куда оптимизировать смотри #22

PS еще можно оптимизировать саму укладку
УложитьСписокОбъектов - т.е. переписав ее скрипт заполнения временной таблицы ( об этом была моя ветка в курилке ) - но
это надо делать внутри 1с++.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #24 - 16. Сентября 2010 :: 10:51
Печать  
Да задача такая же, как у автора в теме.

Есть форма списка справочника товары. Есть текстовая колонка с функцией, которая возвращает остаток по текущему товару (например, на конкретном складе, либо по группе складов). Остаток считается как СводныйОстаток на ТА.

Вопрос в том, будет ли работать быстрее, если это переписать как-то так, как сделано в (15)? Интересует опыт практической реализации данной задачи у других участников.
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Выборка остатков прямым запросом
Ответ #25 - 16. Сентября 2010 :: 10:53
Печать  
Стандартными методами 1С СводныйОстаток или ВыгрузитьИтоги на SQL были жуткие тормоза. Выше приведенным способом - быстрее. Наверняка еще можно оптимизировать этот запрос (т.к. он только по остаткам, а еще нужно вычитать Резервы), но и это уже отлично работает.
Стандартными методами 1С:
переход со строки на строку = 3-5 сек
Прямым запросом:
< 1 сек
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #26 - 16. Сентября 2010 :: 10:59
Печать  
Цитата:
Стандартными методами 1С:
переход со строки на строку = 3-5 сек


Ну так здесь наверное не в сводном остатке дело... у нас в форме списка уйма расчетов (и остатки, и резервы, и по группе складов, и во отдельным). Есть колонки, и есть еще расчеты по текущей позиции. Переход между строками мгновенный. Правда поиск идет не быстро и прокрука подтормаживает.

Может у вас там какие-то временные итоги высчитывает, или регистр незакрывается, вот оно так и тормозит
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка остатков прямым запросом
Ответ #27 - 16. Сентября 2010 :: 11:01
Печать  
Переходи на табличное поле, там расчет будет для всех видимых строк сразу, 1 запрос летит на сервер, а не куча мелких для каждой строки.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #28 - 16. Сентября 2010 :: 11:02
Печать  
Neo писал(а) 16. Сентября 2010 :: 10:51:
Да задача такая же, как у автора в теме.

Есть форма списка справочника товары. Есть текстовая колонка с функцией, которая возвращает остаток по текущему товару (например, на конкретном складе, либо по группе складов). Остаток считается как СводныйОстаток на ТА.

Вопрос в том, будет ли работать быстрее, если это переписать как-то так, как сделано в (15)? Интересует опыт практической реализации данной задачи у других участников.

конечно будет быстрее. (Если список склад  фирм не изменился
с предыдущего раза  то его не нужно заново вычислять вот тебе и еще один выигрыш только назвать как нибудь длиннее
#МойСписокСкладовДляСтандартнСпискаТовары)
Также если узнать каким либо образом все отображенные товары
то остатки по ним можно вытащить одним запросом , а не столько
раз сколько товаров.

Также в #15 можно поставить (nolock). Нужно ли это делать зависит от Вашей  задачи.

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


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #29 - 16. Сентября 2010 :: 11:06
Печать  
Цитата:
Переходи на табличное поле, там расчет будет для всех видимых строк сразу, 1 запрос летит на сервер, а не куча мелких для каждой строки.


Ну это понятно, просто рассматриваю все варианты)) Если на ТП переходить, то это же надо вообще всю форму переделывать (всякие панельки, дерево групп, механизм копирования и т.п.). Чувствую, много гемороя предстоит  Очень довольный
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка остатков прямым запросом
Ответ #30 - 16. Сентября 2010 :: 11:26
Печать  
Neo писал(а) 16. Сентября 2010 :: 11:06:
Цитата:
Переходи на табличное поле, там расчет будет для всех видимых строк сразу, 1 запрос летит на сервер, а не куча мелких для каждой строки.


Ну это понятно, просто рассматриваю все варианты)) Если на ТП переходить, то это же надо вообще всю форму переделывать (всякие панельки, дерево групп, механизм копирования и т.п.). Чувствую, много гемороя предстоит  Очень довольный


Возьми готовый класс  - там усё реализовано.
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Выборка остатков прямым запросом
Ответ #31 - 16. Сентября 2010 :: 12:04
Печать  
Переходить на ТП - по вкусу.
Мне почему нужен расчет по каждой строчке каждый раз: работает порядка 30 продавцов в единой базе и скоро планируется еще 10-15. И продажа единицы товара двум покупателям (срок поставки может доходить до 3 месяцев) из наличия, хотя товара всего одна единица, может привести к выплате неустойки приличного размера. Поэтому, расчет остатка нужен постоянный.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #32 - 16. Сентября 2010 :: 12:26
Печать  
Foma писал(а) 16. Сентября 2010 :: 12:04:
Переходить на ТП - по вкусу.
Мне почему нужен расчет по каждой строчке каждый раз: работает порядка 30 продавцов в единой базе и скоро планируется еще 10-15. И продажа единицы товара двум покупателям (срок поставки может доходить до 3 месяцев) из наличия, хотя товара всего одна единица, может привести к выплате неустойки приличного размера. Поэтому, расчет остатка нужен постоянный.

не понимаю предположим один склад один товар
всего количество 30
первый продавец завел строку на 20 ( на остатках 30 )
в это же время второй тоже завел строку на 20  ( на остатках 30 )
первый продавец покурил
второй продавец покурил
первый продавец сохранил и провел
второй начал записывать и что должно происходить ?
или Вы после каждой строки записываете и перепроводите документ ?
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Выборка остатков прямым запросом
Ответ #33 - 17. Сентября 2010 :: 03:01
Печать  
Да, согласен. При проведении документа 1С ругнется на отсутствие остатков. Но у нас не 30 штук на остатке, а 1-2, и стоимость обычно более 50т.р.. Один продавец скажет клиенту, что есть в наличии и второй. Первый оформит и проведет, а второй в итоге скажет, извините, оказывается нет в наличии, а только под заказ со сроком поставки 45 дней. Человек скорее всего развернется и уйдет, т.к. его обманули. А вот если бы ему сказали сразу, мол нет в наличии и только под заказ, дали бы доп. скидку и пр., то наверняка он бы согласился. Процесс оформления договора может длиться и пол часа, т.к. товар дорогой. Поэтому чем актуальней информация, тем лучше.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #34 - 17. Сентября 2010 :: 05:54
Печать  
Цитата:
Поэтому чем актуальней информация, тем лучше.


А чем тут ТП будет хуже стандартного механизма? В ТП же вроде можно настраивать таймаут обновления, как нужно. Чем меньше таймаут, тем быстрее происходит обновление.

Кстати, попутно вопрос возник по поводу ТП. Если взять стандартную форму списка и вывод остатков в текстовую колонку, то если движения по справочнику нет, то колонки-реквизиты обновляются автоматически (и если были изменения, то мы их сразу увидим). А вот остатки пересчитаются, только если будет движение по строкам. Как с этим обстоит в ТП? Если поставить таймаут обновления, то когда движения по справочнику не будет, информация по остаткам будет все равно обновляться?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка остатков прямым запросом
Ответ #35 - 17. Сентября 2010 :: 06:32
Печать  
Neo писал(а) 17. Сентября 2010 :: 05:54:
Цитата:
Поэтому чем актуальней информация, тем лучше.


А чем тут ТП будет хуже стандартного механизма? В ТП же вроде можно настраивать таймаут обновления, как нужно. Чем меньше таймаут, тем быстрее происходит обновление.



Тем более, что обычные формы списка тоже имеют таймаут обновления, который задается в Сервис-параметры.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #36 - 17. Сентября 2010 :: 07:24
Печать  
Цитата:
обычные формы списка тоже имеют таймаут обновления, который задается в Сервис-параметры.


При этом колонки с функциями не пересчитываются. Поэтому если пользователь не будет перемещаться по позициям, то он не увидит, что кто-то уже списал этот товар
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка остатков прямым запросом
Ответ #37 - 17. Сентября 2010 :: 07:29
Печать  
Neo писал(а) 17. Сентября 2010 :: 07:24:
Цитата:
обычные формы списка тоже имеют таймаут обновления, который задается в Сервис-параметры.


При этом колонки с функциями не пересчитываются. Поэтому если пользователь не будет перемещаться по позициям, то он не увидит, что кто-то уже списал этот товар


Можно принудительно обновлять форму списка по таймауту.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #38 - 17. Сентября 2010 :: 08:00
Печать  
Цитата:
Можно принудительно обновлять форму списка по таймауту.


- Ну это понятно. Я просто к тому, что стандартные формы по умолчанию тоже не гарантируют актуальности.

Хотя я как раз таки напротив, стараюсь по возможности уменьшить число запросов к базе при работе со справочниками. Т.к. народу много, многие распахивают форму списка всерьез и надолго, даже когда со справочником не работают. Сделал даже, чтобы при перемещениями между окнами (опять таки, раскроют справочник и начинают работать в других окнах) проверялось, изменился ли текущий товар. Если не изменился, то остатки берутся из ИТЗ и к базе обращений нет. А по поводу актуальности... исхожу из того, что если человек активно работает, набивает товары в документ, перемещается по номенклатуре, то обновление нужно (в разумных пределах), если нет, то и нафиг не нужна куча лишних запросов к базе.

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка остатков прямым запросом
Ответ #39 - 17. Сентября 2010 :: 08:23
Печать  
У нас останки только в подборе. А больше они никому и не упали.
Всё можно отчетом поглядеть.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #40 - 17. Сентября 2010 :: 08:35
Печать  
Цитата:
А больше они никому и не упали.


У нас все иначе, всем нужно все и сразу. Привычка видеть сразу остатки при работе со справочником у многих уже отложилась на генетическом уровне и этого уже не победить  Улыбка Так что остается только оптимизировать то, что есть..
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #41 - 17. Сентября 2010 :: 13:53
Печать  
Хочу параметрическим запросом получить из регистра ПартииНаличие себестоимость рублевую (СуммаРуб/Кол) и долларовую (СуммаУпр/Кол). Можно ли это (и лучше ли) сделать в одном запросе или лучше сделать 3 раза ВыполнитьСкалярный?      

Т.е., просто остатки получаю как-то так:

//Остатки товара в партиях
           RS_СебестКол=СоздатьОбъект("ODBCRecordset");
           ТекстЗапроса_СебестКол = "
           |SELECT
           |SUM($Рег.Количество) as Количество
           |FROM
           |$РегистрИтоги.ПартииНаличие as Рег With (NOLOCK)
           |WHERE
           |Рег.PERIOD= cast('"+стрдатыТА+"'as datetime) AND
           |$Рег.Товар = ?";
           
           RS_СебестКол.Подготовить(ТекстЗапроса_СебестКол);
RS_СебестКол.ПостроитьПараметры();

                             RS_СебестКол.УстПараметр(1,Тов);
Ост=RS_СебестКол.ВыполнитьСкалярный();

Как получить обе себестоимости наиболее оптимально, чтобы было меньше обращений к базе, т.к., будет юзаться в форме списка?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #42 - 17. Сентября 2010 :: 14:41
Печать  
Код
Выбрать все
RS_СебестКол=СоздатьОбъект("ODBCRecordset");
	     ТекстЗапроса_СебестКол = "
	     |SELECT
	     | SUM($Рег.Количество) as Количество
	     |,SUM($Рег.СуммаРуб) as СуммаРуб
	     |,SUM($Рег.СуммаУпр) as СуммаУпр
	     |FROM
	     |$РегистрИтоги.ПартииНаличие as Рег With (NOLOCK)
	     |WHERE
	     |Рег.PERIOD= cast('"+стрдатыТА+"'as datetime) AND
	     |$Рег.Товар = ?";

	     RS_СебестКол.Подготовить(ТекстЗапроса_СебестКол);
RS_СебестКол.ПостроитьПараметры();

				     RS_СебестКол.УстПараметр(1,Тов);
ТЗ=RS_СебестКол.ВыполнитьИнструкцию(); 


получишь ТЗ из одной строки и трех колонок
  
Наверх
 
IP записан
 
Альтаир
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 13
Местоположение: Харьков, Украина
Зарегистрирован: 26. Сентября 2008
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #43 - 22. Сентября 2010 :: 13:08
Печать  
У меня тоже появилась такая необходимость.
Сделал тестовую обработку. Выполнил ее не монопольно на рабочем сервере в копии рабочей базы при активной работе пользователей (в других базах).
Конфигурация: Windows 2008 Server, MS SQL 2008, 1С 27 релиз патченный-перепатченный  Подмигивание

Код:

Перем глОстТовара  Экспорт;

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

//*******************************************
Функция глОстатокТовара(товар) Экспорт
     ост=0;
     глОстТовара.УстПараметр(1, товар);
     ост=глОстТовара.ВыполнитьСкалярный();
     Возврат ост;
КонецФункции

//*******************************************
Процедура Сформировать()
     спр=СоздатьОбъект("Справочник.Номенклатура");

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

//*******************************************

Результаты как-то не порадовали  Улыбка
Попытка № 1
Прямой запрос = 39.703
Регистр = 43.021
Попытка № 2
Прямой запрос = 44.288
Регистр = 40.961
Попытка № 3
Прямой запрос = 38.426
Регистр = 39.642
Попытка № 4
Прямой запрос = 41.505
Регистр = 42.717
Попытка № 5
Прямой запрос = 41.22
Регистр = 38.238
Попытка № 6
Прямой запрос = 41.178
Регистр = 41.793
Попытка № 7
Прямой запрос = 38.793
Регистр = 40.759
Попытка № 8
Прямой запрос = 39.377
Регистр = 39.712
Попытка № 9
Прямой запрос = 40.323
Регистр = 39.845
Попытка № 10
Прямой запрос = 40.099
Регистр = 40.799
  

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


I Love YaBB 2!

Сообщений: 13
Местоположение: Харьков, Украина
Зарегистрирован: 26. Сентября 2008
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #44 - 22. Сентября 2010 :: 13:27
Печать  
Предыдущий замер делался при отлюченном отборе итогов в регистре по измерению Товар.
При включенном все горазде лучше  Очень довольный

Попытка № 1
Прямой запрос = 2.766
Регистр = 1.23
Попытка № 2
Прямой запрос = 0.714
Регистр = 1.203
Попытка № 3
Прямой запрос = 0.753
Регистр = 1.263
Попытка № 4
Прямой запрос = 0.84
Регистр = 1.355
Попытка № 5
Прямой запрос = 0.714
Регистр = 1.356
Попытка № 6
Прямой запрос = 0.824
Регистр = 1.245
Попытка № 7
Прямой запрос = 0.734
Регистр = 1.333
Попытка № 8
Прямой запрос = 0.705
Регистр = 1.239
Попытка № 9
Прямой запрос = 0.751
Регистр = 1.331
Попытка № 10
Прямой запрос = 0.871
Регистр = 1.38

тут уже видно преимущество прямых запросов
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #60 - 23. Сентября 2010 :: 05:02
Печать  
(leshik) получилось надо выполнитьскалярный() заменить на выполнить(). Здесь это принципиально.
Код
Выбрать все
Процедура Сформировать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
Прямойзапрос Параметр 21 = 1.133
Попытка № 2
Прямойзапрос Параметр 21 = 0.797
Попытка № 3
Прямойзапрос Параметр 21 = 0.779
Попытка № 4
Прямойзапрос Параметр 21 = 0.879
Попытка № 5
Прямойзапрос Параметр 21 = 0.751
Попытка № 6
Прямойзапрос Параметр 21 = 0.744
Попытка № 7
Прямойзапрос Параметр 21 = 0.77
Попытка № 8
Прямойзапрос Параметр 21 = 0.905
Попытка № 9
Прямойзапрос Параметр 21 = 0.887
Попытка № 10
Прямойзапрос Параметр 21 = 0.753
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #61 - 23. Сентября 2010 :: 05:45
Печать  
А если текст запроса оставить старым и добавить такую строку:
Код
Выбрать все
глОстТовара.ДобПараметр(1,14,9,0); 


?
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #62 - 23. Сентября 2010 :: 05:57
Печать  
Z1 писал(а) 23. Сентября 2010 :: 05:02:
(leshik) получилось надо выполнитьскалярный() заменить на выполнить().

Ну вот и вполне ожидаемые результаты. Однако конечно же на столь простом запросе не видно затрат на время компиляции при использовании обычного запроса (без параметров). Главное результат достигнут и с запросом с параметрами.
  
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #63 - 23. Сентября 2010 :: 05:58
Печать  
JohnyDeath писал(а) 23. Сентября 2010 :: 05:45:
А если текст запроса оставить старым и добавить такую строку:
Код
Выбрать все
глОстТовара.ДобПараметр(1,14,9,0); 


?

Уверен что будет с замедлением.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #64 - 23. Сентября 2010 :: 05:58
Печать  
JohnyDeath писал(а) 23. Сентября 2010 :: 05:45:
А если текст запроса оставить старым и добавить такую строку:
Код
Выбрать все
глОстТовара.ДобПараметр(1,14,9,0); 


?

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

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



Результат

Попытка № 1
Прямойзапрос Параметр 22 = 5.912
Попытка № 2
Прямойзапрос Параметр 22 = 5.915
Попытка № 3
Прямойзапрос Параметр 22 = 5.929
Попытка № 4
Прямойзапрос Параметр 22 = 5.978
Попытка № 5
Прямойзапрос Параметр 22 = 6.043
Попытка № 6
Прямойзапрос Параметр 22 = 5.942
Попытка № 7
Прямойзапрос Параметр 22 = 6.044
Попытка № 8
Прямойзапрос Параметр 22 = 6.038
Попытка № 9
Прямойзапрос Параметр 22 = 6.325
Попытка № 10
Прямойзапрос Параметр 22 = 6.033
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #65 - 23. Сентября 2010 :: 06:04
Печать  
Интересно. Не знал.
leshik, может в FAQ по прямым запросам закинешь?
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #66 - 23. Сентября 2010 :: 06:07
Печать  
JohnyDeath писал(а) 23. Сентября 2010 :: 06:04:
Интересно. Не знал.
leshik, может в FAQ по прямым запросам закинешь?

Эээ а как? Просто взять и написать? Туда просто смертным писать можно? И надо же тогда подумать как это правильно оформить...
  
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #67 - 23. Сентября 2010 :: 06:13
Печать  
Да, там можно писать всем.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #68 - 23. Сентября 2010 :: 07:14
Печать  
офф/2

чёйто вы с периодом мудрите. Так не проще?:
     |WHERE
     |      Рег.PERIOD=:Период~~ AND
     |      $Рег.СклЯчейка = @ВыбЯчейка
     |";
     глОстТовара.УстановитьТекстовыйПараметр("Период", НачМесяца(ПолучитьДатуТА()));
     Если глОстТовара.Подготовить(ТекстЗапроса)=0 тогда
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #69 - 23. Сентября 2010 :: 07:19
Печать  
trad писал(а) 23. Сентября 2010 :: 07:14:
офф/2

чёйто вы с периодом мудрите. Так не проще?:
     |WHERE
     |      Рег.PERIOD=:Период~~ AND
     |      $Рег.СклЯчейка = @ВыбЯчейка
     |";
     глОстТовара.УстановитьТекстовыйПараметр("Период", НачМесяца(ПолучитьДатуТА()));
     Если глОстТовара.Подготовить(ТекстЗапроса)=0 тогда

это же ничего не меняет принципиально.
я обычно не смешиваю параметрич. запросы с УстановитьТекстовыйПараметр.
Либо все через параметры либо все через УстановитьТекстовыйПараметр
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #70 - 23. Сентября 2010 :: 07:26
Печать  
Z1 писал(а) 23. Сентября 2010 :: 07:19:
это же ничего не меняет принципиально.

да, конечно. потому и офф/2


Цитата:
я обычно не смешиваю параметрич. запросы с УстановитьТекстовыйПараметр.
Либо все через параметры либо все через УстановитьТекстовыйПараметр

непонятная предубежденность
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #71 - 23. Сентября 2010 :: 07:31
Печать  
офф/1
trad писал(а) 23. Сентября 2010 :: 07:14:
офф/2
чёйто вы с периодом мудрите.

и вообще ВТ проще применить и не заниматься вычислением начала периода ТА, к тому же не безопасным с точки зрения смены периодичности хранения итогов.

повторяю - это почти офф.
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #72 - 23. Сентября 2010 :: 07:45
Печать  
И странно, у меня ВыполнитьСкалярный не проигрывает Выполнить почти на порядок. Всего то около 40%
Улыбка
  

1&&2&&3
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #73 - 23. Сентября 2010 :: 08:01
Печать  
trad писал(а) 23. Сентября 2010 :: 07:45:
И странно, у меня ВыполнитьСкалярный не проигрывает Выполнить почти на порядок. Всего то около 40%
Улыбка

как не значительно - всего то 40%  Круглые глаза
  
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #74 - 23. Сентября 2010 :: 09:20
Печать  
бегло посмотрел.
ВыполнитьСкалярный несколько сложнее устроен внутри. Зато безопаснее. Например при его использовании гарантированно не наступишь на "подключение занято ... hstmt"
А вот при Выполнить - вполне.
  

1&&2&&3
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #75 - 23. Сентября 2010 :: 11:26
Печать  
А у меня в таком варианте, как в (60), вообще ничего не считает, результат постоянно выдает нулевой:

-------------------------------------------------------------------------            стрдатыТА=строка(формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД"));
           
           //Остатки на основном складе
           RS_ОстНаСкладе=СоздатьОбъект("ODBCRecordset");
           ТекстЗапроса_ОстНаСкладе = "
           |SET NOCOUNT ON
           |declare @ВыбТовар Char(9)
           |SET @ВыбТовар = ?
           |SELECT
           |SUM($Рег.Количество) as Количество
           |FROM
           |$РегистрИтоги.ОстаткиТоваров as Рег With (NOLOCK)
           |WHERE
           |Рег.PERIOD= cast('"+стрдатыТА+"'as datetime) AND
           |$Рег.Товар = @ВыбТовар AND
           |$Рег.Склад = :спСкладОсновной";
           
           RS_ОстНаСкладе.УстановитьТекстовыйПараметр("спСкладОсновной",спСкладОсновной);
           RS_ОстНаСкладе.Подготовить(ТекстЗапроса_ОстНаСкладе);
           RS_ОстНаСкладе.ПостроитьПараметры();

                                         RS_ОстНаСкладе.УстПараметр(1,Тов);
                                         чОстатокНаСкладе=RS_ОстНаСкладе.Выполнить();

------------------------------------------------------------------

А в варианте (15) все было нормально...
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #76 - 23. Сентября 2010 :: 11:42
Печать  
Код
Выбрать все
чОстатокНаСкладе=RS_ОстНаСкладе.ВыполнитьСкалярный(); 

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


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #77 - 23. Сентября 2010 :: 11:46
Печать  
так пишет:

{Справочник.Товары.ФормаСписка.ФормаСписка.Модуль(1047)}: State 07009, native 0, message [Microsoft][ODBC SQL Server Driver]Недопустимый индекс дескриптора
чОстатокНаСкладе=RS_ОстНаСкладе.ВыполнитьСкалярный();
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #78 - 23. Сентября 2010 :: 11:48
Печать  
leshik писал(а) 23. Сентября 2010 :: 11:42:
Код
Выбрать все
чОстатокНаСкладе=RS_ОстНаСкладе.ВыполнитьСкалярный(); 


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



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #79 - 23. Сентября 2010 :: 11:55
Печать  
Я думаю что надо не использовать
ПостроитьПараметры()
А использовать ДобПараметр в явном виде
http://www.1cpp.ru/forum/YaBB.pl?num=1253692023/0#0
  
Наверх
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #80 - 23. Сентября 2010 :: 11:55
Печать  
бумс...

Выполнить / Execute

Синтаксис: Выполнить(ТекстSQL)

Параметры:
ТекстSQL - тип: Строка. SQL запрос не возвращающий результат набор данных.

Возвращает: тип: Число. 1 - запрос выполнился успешно, 0 - безуспешно, описание ошибки можно получить, вызвав метод ПолучитьОписаниеОшибки.

Описание: позволяет выполнить SQL запрос, без возврата результата выборки. Метод в основном предназначен для выполнения запросов вставки, обновления, вызова процедур.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #81 - 23. Сентября 2010 :: 12:00
Печать  
Цитата:
А использовать ДобПараметр в явном виде


так же дольше выходит в разы, ниже результаты теста приводились...
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #82 - 23. Сентября 2010 :: 12:02
Печать  
Neo писал(а) 23. Сентября 2010 :: 12:00:
Цитата:
А использовать ДобПараметр в явном виде


так же дольше выходит в разы, ниже результаты теста приводились...

не у всех в разы. у меня в пол раза всего
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #83 - 23. Сентября 2010 :: 12:03
Печать  
leshik писал(а) 23. Сентября 2010 :: 11:55:
Я думаю что надо не использовать
ПостроитьПараметры()
А использовать ДобПараметр в явном виде
http://www.1cpp.ru/forum/YaBB.pl?num=1253692023/0#0

так  плохо смотри №64
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #84 - 23. Сентября 2010 :: 12:05
Печать  
Цитата:
у меня в пол раза всего


В полраза, это то есть быстрее?   Подмигивание
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #85 - 23. Сентября 2010 :: 12:23
Печать  
А вот это что означает?

Цитата:
глОстТовара.РежимRPC(1);


что запрос будет выполняться как параметрический?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #86 - 23. Сентября 2010 :: 12:34
Печать  
Neo писал(а) 23. Сентября 2010 :: 12:05:
Цитата:
у меня в пол раза всего


В полраза, это то есть быстрее?   Подмигивание

сори, в полтора
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #87 - 23. Сентября 2010 :: 14:38
Печать  
Разобрался тест из #56 неправильный результат
там был
текстзапроса = "....";
запрос без параметров ( ?  )
а вызов был
ост=глОстТовара.ВыполнитьСкалярный();  // Текст запроса не указан

т.е выполнялся пустой запрос

Сейчас еще раз сделаю серию тестов.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #88 - 23. Сентября 2010 :: 15:13
Печать  
Вот новый тест
перед каждой серией очищал кеш процедур и буфер данных
Сервер боевой. Сейчас работает почти без нагрузки
т.е занят только тестом

количество строк всего в ТА = 13387

SELECT count(*)
FROM   rg99 as Рег (NoLock)
WHERE  Рег.PERIOD= cast('20101001' as datetime)
  

test_70_______________.ert ( 33 KB | Загрузки )
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #89 - 23. Сентября 2010 :: 15:15
Печать  
результат
Стандартный Сводный остаток
8.198   7.415   6.905   6.258   6.179   6.303   6.309   6.609   6.618   6.015  

Прямой запрос  + Параметр + ПостроитьПараметры
5.128   5.288   5.738   5.444   5.491   5.187   5.12   5.069   4.963   5.029  

Прямой запрос  + УстановитьТекстовыйПараметр
6.87   5.132   5.292   5.344   5.457   5.464   5.152   5.14   5.14   5.152  

Прямой запрос  + Параметр + ДобПараметр
5.503   5.149   5.114   5.123   5.025   5.153   5.086   4.97   4.952   5.182  

Прямой запрос  + Вызов хранимой процедуры  test5
6.176   5.911   5.042   6.19   6.05   6.137   5.762   7.062   6.483   5.087  

-
PS Могу прогнать завтра днем под нагрузкой когда все будут работать.
А также завтра вечером монопольно
а то результат все равно плывет
только что запустил xp
Прямой запрос  + Параметр + ДобПараметр
5.013   5.089   4.988   4.982   5.002   5.263   5.451   5.413   5.43   4.999  
Прямой запрос  + Вызов хранимой процедуры  test5
5.102   5.051   5.03   5.033   5.041   5.048   5.036   5.041   5.031   5.201  
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #90 - 23. Сентября 2010 :: 17:41
Печать  
Z1, открой для себя это Улыбка
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #91 - 24. Сентября 2010 :: 08:02
Печать  
немного реабилитировал стандартный сводный остаток.
Значения через две точки вычисляются хуже  ( медленнее ) чем через одну точку
т.е. вместо
);

гораздо лучше использовать
Рег = СоздатьОбъект("Регистр.ОстаткиТоваров");
........
Ост=Рег.СводныйОстаток(,,Спр.ТекущийЭлемент(),"ОстатокТовара");


Результаты
Стандартный Сводный остаток Рег через одну точку
Сред = 14.6282   15.408   17.542   12.961   12.73   16.192   14.767   15.605   13.319   12.494   15.264   

Стандартный Сводный остаток
Сред = 18.2442   16.436   16.956   22.22   23.782   22.733   13.698   18.524   17.791   15.778   14.524   

Прямой запрос  + Параметр + ПостроитьПараметры
Сред = 15.9765   17.087   22.121   18.286   16.598   16.208   15.575   12.524   12.728   13.298   15.34   




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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #92 - 24. Сентября 2010 :: 08:17
Печать  
Также стандартный запрос
Код
Выбрать все
Процедура Сформировать111()
Ост=Рег.СводныйОстаток(,,КонктерЯч,"ОстатокТовара");
Сообщить("Рег.СводныйОстаток Ост = " + Ост);
КонецПроцедуры
 


генерит код sql
Цитата:
exec sp_executesql
N'Select SUM(SP102)
from RG99 (NOLOCK)
where PERIOD=''20101201'' and SP4021 = @P1
GROUP BY PERIOD,SP4021',
N'@P1 varchar(9)', '   5JKZZZ'


Может кто ответит
1. почему нет преобразования периода PERIOD к datetime
2.зачем здесь нужен GROUP BY PERIOD,SP4021
3. почему входном параметр объявлен как varchar(9) а не  char(9)
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

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


при этом на sql подает код
Цитата:
{call sp_executesql(N'
SELECT
     SUM(Рег.sp102)
FROM
     rg99 Рег (NoLock)
WHERE
     Рег.PERIOD= cast(''20101201'' as  datetime   ) AND
     Рег.sp4021 = @Зн_Ячейки0
', N'@Зн_Ячейки0 char(9)'
,'   5JKZZZ')}
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #94 - 24. Сентября 2010 :: 09:43
Печать  
Z1 писал(а) 24. Сентября 2010 :: 08:17:
Может кто ответит
1. почему нет преобразования периода PERIOD к datetime
2.зачем здесь нужен GROUP BY PERIOD,SP4021
3. почему входном параметр объявлен как varchar(9) а не  char(9)

1. PERIOD уже datetime. А текстовый параметр здесь преобразовывать смысла нет.
2. Получи итог через виртуальную таблицу - там тоже будет GROUP BY.  Подмигивание
3. А почему бы нет? Разве что из эстетических соображений..

Z1 писал(а) 24. Сентября 2010 :: 08:36:
вот как работает 1с++
...
при этом на sql подает код

К.О. подсказывает, что именно так ты его и написал.  Смех
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #95 - 24. Сентября 2010 :: 10:02
Печать  
berezdetsky писал(а) 24. Сентября 2010 :: 09:43:
Z1 писал(а) 24. Сентября 2010 :: 08:17:
Может кто ответит
1. почему нет преобразования периода PERIOD к datetime
2.зачем здесь нужен GROUP BY PERIOD,SP4021
3. почему входном параметр объявлен как varchar(9) а не  char(9)

1. PERIOD уже datetime. А текстовый параметр здесь преобразовывать смысла нет.
2. Получи итог через виртуальную таблицу - там тоже будет GROUP BY.  Подмигивание
3. А почему бы нет? Разве что из эстетических соображений..

Z1 писал(а) 24. Сентября 2010 :: 08:36:
вот как работает 1с++
...
при этом на sql подает код

К.О. подсказывает, что именно так ты его и написал.  Смех


первый вопрос неправильно сформулирован
почему константу типа char '20101201' явно не преобразовали
к datetime. Ведь все равно будет неявное преобразование типов,
а этого надо избегать.


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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #96 - 24. Сентября 2010 :: 10:03
Печать  
вопрос 2.
посмотрел в qa стоимость планов
когда есть group by стоимость = 6
когда нет  group by стоимость = 5
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #97 - 24. Сентября 2010 :: 10:11
Печать  
вопрос номер 3
как я понимаю при вызове процедуру
константа текстовая
'   5JKZZZ' с типом char(9)
будет преобразована к  varchar(9)
при этом левые пробелы обрежуться и мы получим на входе в процедуру '5JKZZZ' с varchar(9)
далее в условие where идет сравнение
колонки таблицы SP4021 с типом char(9) c константой
'5JKZZZ' с varchar(9)
sql  будет вынужден сделать неявное преобразование
и преобразовать константу '5JKZZZ' с varchar(9) к
char(9)  для чего необходимо снова дополнить
'5JKZZZ' ведущими пробелами и после чего снова получаем
'   5JKZZZ' с типом char(9)


Может такие преобразования и нужны когда длина переменной больше 100 ( экономим трафик)  но явно не для длины =  9.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #98 - 24. Сентября 2010 :: 10:15
Печать  
Z1 писал(а) 24. Сентября 2010 :: 10:02:
первый вопрос неправильно сформулирован
почему константу типа char '20101201' явно не преобразовали
к datetime. Ведь все равно будет неявное преобразование типов,
а этого надо избегать.

Вопрос скорее религиозный. SQL Server сделает такое же преобразование, так зачем нажимать лишние кнопки?

Z1 писал(а) 24. Сентября 2010 :: 10:03:
вопрос 2.
посмотрел в qa стоимость планов
когда есть group by стоимость = 6
когда нет  group by стоимость = 5

Конечно, в этом частном случае без GROUP BY можно было бы обойтись.

Off: Стоимости разных запросов несопоставимы. Можно сравнивать только стоимости разных планов одного запроса.
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #99 - 24. Сентября 2010 :: 10:20
Печать  
berezdetsky писал(а) 24. Сентября 2010 :: 10:15:
Z1 писал(а) 24. Сентября 2010 :: 10:02:
первый вопрос неправильно сформулирован
почему константу типа char '20101201' явно не преобразовали
к datetime. Ведь все равно будет неявное преобразование типов,
а этого надо избегать.

Вопрос скорее религиозный. SQL Server сделает такое же преобразование, так зачем нажимать лишние кнопки?

Z1 писал(а) 24. Сентября 2010 :: 10:03:
вопрос 2.
посмотрел в qa стоимость планов
когда есть group by стоимость = 6
когда нет  group by стоимость = 5

Конечно, в этом частном случае без GROUP BY можно было бы обойтись.

Off: Стоимости разных запросов несопоставимы. Можно сравнивать только стоимости разных планов одного запроса.

1. про преобразование типов - ну если это вопрос религиозный
то обсуждать не будем все равно каждый будет придерживаться своей религии.

про стоимость запросов Вы конечно правы но эти два запроса практически идентичны и выполняют одну и ту же базовую операцию cluster index seek над одном и том же значении периода
и одном и том же доп условию по складской ячейке.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #100 - 24. Сентября 2010 :: 10:20
Печать  
Z1 писал(а) 24. Сентября 2010 :: 10:11:
при этом левые пробелы обрежуться

Чёта ржу.  Смех
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #101 - 24. Сентября 2010 :: 10:25
Печать  
berezdetsky писал(а) 24. Сентября 2010 :: 10:20:
Z1 писал(а) 24. Сентября 2010 :: 10:11:
при этом левые пробелы обрежуться

Чёта ржу.  Смех

проверил.
да не обрезает но преобразовывать все равно будет
тогда это тоже вопрос религии
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #102 - 24. Сентября 2010 :: 11:13
Печать  
Z1 писал(а) 24. Сентября 2010 :: 10:25:
да не обрезает но преобразовывать все равно будет

Кстати да, если понимать BOL буквально, преобразование здесь должно быть. Но на практике его нет. Озадачен Почему - не знаю.
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #103 - 24. Сентября 2010 :: 11:20
Печать  
berezdetsky писал(а) 24. Сентября 2010 :: 11:13:
Z1 писал(а) 24. Сентября 2010 :: 10:25:
да не обрезает но преобразовывать все равно будет

Кстати да, если понимать BOL буквально, преобразование здесь должно быть. Но на практике его нет. Озадачен Почему - не знаю.

это Вы согласились по первому или по третьему вопросу?
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #104 - 24. Сентября 2010 :: 11:22
Печать  
Эко зацепили высокие материи...
я правда так и не понял - по опыту тестов Параметризованный запрос медленнее обыкновенного?
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #105 - 24. Сентября 2010 :: 11:23
Печать  
про group by тоже околонаучное объяснение :
итератор то быть должен для group by и он должен что либо обработать ему какая разница сколько строк обрабатывать
одну или тысячу.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #106 - 24. Сентября 2010 :: 11:25
Печать  
Это обсуждение 3-го вопроса, как следует из цитат. Но согласия там нет - просто утверждение, основанное на планах выполнения, показанных профайлером.
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #107 - 24. Сентября 2010 :: 11:30
Печать  
leshik писал(а) 24. Сентября 2010 :: 11:22:
Эко зацепили высокие материи...
я правда так и не понял - по опыту тестов Параметризованный запрос медленнее обыкновенного?

с точки зрения клиента ( конкретно работающей сессии)
под нагрузкой все работает одинаково и определяется доступностью ресурсов sql сервера.
если копать глубже то надо смотреть на сервере
по всем этим случаям  количество логических READ WRITE
и по ним уже выбирать ( ну все это без учета тонких материй ) победителя дающего наименьшую нагрузку на sql server.

ну а о тонких(тончайших) материях 1с++ по крайней мере выигрывает у стандартной 1с что делает более правильный тип char(9) а не varchar(9), а также если сообщество согласится со мной то в виртуальных функциях можно доработать 1с++ и не делать в некоторых случаях лишний group by

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #108 - 24. Сентября 2010 :: 11:32
Печать  
Z1 писал(а) 24. Сентября 2010 :: 11:23:
про group by тоже околонаучное объяснение :
итератор то быть должен для group by и он должен что либо обработать ему какая разница сколько строк обрабатывать
одну или тысячу.

О. А можно про "околонаучное" поподробнее, в свете #98?

На самом деле, совершенно не важно, что и как делают штатные методы. Благодаря 1С++ результат всегда может быть получен оптимальным способом. К примеру, впервые на работу бух. подсистемы через профайлер я посмотрел из любопытства уже после выхода AccountsRecordset.  Улыбка
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #109 - 24. Сентября 2010 :: 11:43
Печать  
berezdetsky писал(а) 24. Сентября 2010 :: 11:32:
Z1 писал(а) 24. Сентября 2010 :: 11:23:
про group by тоже околонаучное объяснение :
итератор то быть должен для group by и он должен что либо обработать ему какая разница сколько строк обрабатывать
одну или тысячу.

О. А можно про "околонаучное" поподробнее, в свете #98?

На самом деле, совершенно не важно, что и как делают штатные методы. Благодаря 1С++ результат всегда может быть получен оптимальным способом. К примеру, впервые на работу бух. подсистемы через профайлер я посмотрел из любопытства уже после выхода AccountsRecordset.  Улыбка

научного объяснения нет
вроде попытался на это ответить в #99
Еще два Ненаучных аргумента текст запроса меньше чуть чуть
чуть быстрее его передадим
второе т.к. запрос меньше ( по количеству лексем ) то и его
синтаксический разбор будет быстрее ну и на эту дельту короче компиляция запроса.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #110 - 24. Сентября 2010 :: 11:57
Печать  
Кстати еще одно ненаучное обоснование пункта 1
Рассуждения абстрактные но имеют право на существование
оптимизатор запросов может неправильно выполнить
неявное преобразование типов и из-за этого вообще не попадем в индекс PERIOD.
Особенно возможность именно такой ситуации возрастает при работе
под sql2005, sql2008 потому что оптимизатор запросов работает в режиме эмуляции для совместимости с форматом базы 80.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #111 - 24. Сентября 2010 :: 15:08
Печать  
berezdetsky писал(а) 24. Сентября 2010 :: 10:20:
Z1 писал(а) 24. Сентября 2010 :: 10:11:
при этом левые пробелы обрежуться

Чёта ржу.  Смех

вспомнил пример трудных ошибок неявного  преобразования типов
char(9) varchar(9) правда к конкретному случаю это не относится но тем не менее (пример верен и для передаваемых параметров )

Код
Выбрать все
declare @v_ch varchar(9)
declare @ch char(9)
set @v_ch = '4567'
select '!!!' + @v_ch + '!!!'
set @ch = @v_ch
--  большой блок вычислений
set @v_ch = @ch
select '!!!' + @v_ch + '!!!'
 


значение @v_ch в начале
!!!4567!!!

значение @v_ch в конце
!!!4567     !!!

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #112 - 24. Сентября 2010 :: 17:49
Печать  
Результаты тестов.
База в монопольном режиме
перед каждой серией очищал кэш проц и буфер данных

Стандартный Сводный остаток Рег через одну точку
Сред = 6.0769  Серия 6.234   6.049   6.049   6.04   6.067   6.083   6.068   6.063   6.064   6.052  

Стандартный Сводный остаток
Сред = 6.0825  Серия 6.189   6.071   6.082   6.066   6.08   6.063   6.083   6.086   6.05   6.055  

Прямой запрос  + Параметр + ПостроитьПараметры
Сред = 5.0485  Серия 5.105   5.034   5.039   5.042   5.033   5.022   5.059   5.032   5.048   5.071  

Прямой запрос  + УстановитьТекстовыйПараметр
Сред = 5.1971  Серия 5.226   5.212   5.203   5.195   5.185   5.182   5.179   5.21   5.203   5.176  

Прямой запрос  + Параметр + ДобПараметр
Сред = 5.068  Серия 5.127   5.066   5.051   5.064   5.064   5.049   5.075   5.055   5.054   5.075  

Прямой запрос  + Вызов хранимой процедуры  test5
Сред = 5.103  Серия 5.15   5.1   5.085   5.1   5.1   5.084   5.129   5.087   5.088   5.107


Можно сделать чуть объективнее тест загнать ячейки в ТЗ и обращаться к базе только для вычисления СводногоОстатка.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выборка остатков прямым запросом
Ответ #113 - 27. Сентября 2010 :: 07:04
Печать  
Так что, с "построить параметры" чуть побыстрее выходит, чем с ручным добавлением параметра? Или каждый раз по разному получается?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выборка остатков прямым запросом
Ответ #114 - 27. Сентября 2010 :: 07:45
Печать  
Neo писал(а) 27. Сентября 2010 :: 07:04:
Так что, с "построить параметры" чуть побыстрее выходит, чем с ручным добавлением параметра? Или каждый раз по разному получается?

так параметр и должен работать быстрее.
вопрос насколько быстрее зависит от множества факторов.
также если будет время то усовершенствую тест ( список
для сводного остатка  будет подготавливаться заранее  а в тестах будет только цикл по этому списку.)

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