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


1C++ rocks!

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


не сможет, у него это всё вызывается в текстовой колонке в форме списка справочника, скорее всего.

Так и есть!
Цитата:
Переписать подбор на табличное поле, где поставщиком будет прямой запрос не предлагать ?

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


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #16 - 06. Сентября 2011 :: 06:37
Печать  
Eprst писал(а) 06. Сентября 2011 :: 05:57:
Переписать подбор на табличное поле, где поставщиком будет прямой запрос не предлагать ?
Подмигивание

ЗЫ: ну или хотя бы использовать параметезированный запрос что-ли.


Я здесь задавал этот вопрос
http://www.1cpp.ru/forum/YaBB.pl?num=1314950844

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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #17 - 06. Сентября 2011 :: 06:43
Печать  
Eprst писал(а) 06. Сентября 2011 :: 06:14:
не сможет, у него это всё вызывается в текстовой колонке в форме списка справочника, скорее всего.

Ну я же смог.  Улыбка
  

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


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #18 - 06. Сентября 2011 :: 06:47
Печать  
berezdetsky писал(а) 06. Сентября 2011 :: 06:43:
Eprst писал(а) 06. Сентября 2011 :: 06:14:
не сможет, у него это всё вызывается в текстовой колонке в форме списка справочника, скорее всего.

Ну я же смог.  Улыбка

КАК ? ОБЪЯСНИ !

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



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

А подробности ?
Как ты получил список номенклатуры, например, в обычной форме списка справочника и без использования ТП ?

ЗЫ: Штатно, это делается (извратом с текстовой колонкой, у меня есть примерчик).

Не штатно, есть вроде у ромикса перехват, где он подсовывает свой запрос к скулю.


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


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #20 - 06. Сентября 2011 :: 06:49
Печать  
Eprst писал(а) 06. Сентября 2011 :: 06:48:
berezdetsky писал(а) 06. Сентября 2011 :: 06:43:
Ну я же смог.  Улыбка

А подробности ?
Как ты получил список номенклатуры, например, в обычной форме списка справочника и без использования ТП ?

ЗЫ: Штатно, это делается (извратом с текстовой колонкой, у меня есть примерчик).



Хотелось бы увидеть примерчик. И насколько быстрей работает
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #21 - 06. Сентября 2011 :: 07:34
Печать  
Eprst писал(а) 06. Сентября 2011 :: 05:57:
Переписать подбор на табличное поле, где поставщиком будет прямой запрос не предлагать ?
Подмигивание

ЗЫ: ну или хотя бы использовать параметезированный запрос что-ли.

Я так понял, что в поставщике данных реализован только интерфейс.
Реализация на C++ делается пользователем или я что то не допонял?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Можно ли ускорить процесс выборки
Ответ #22 - 06. Сентября 2011 :: 07:56
Печать  
berezdetsky писал(а) 06. Сентября 2011 :: 06:43:
Eprst писал(а) 06. Сентября 2011 :: 06:14:
не сможет, у него это всё вызывается в текстовой колонке в форме списка справочника, скорее всего.

Ну я же смог.  Улыбка


Вариант 1)
Выводя текущую строку проверяем вхождение текущего элемента справочника в подготовленный список.
Если он в список не входит - выбираем запросом список элементов как текущий элемент + "экран" вверх + "экран" вниз (где "экран" - это количество элементов влезающих в форму; или просто взять с запасом). По этому списку сразу собираем и остатки.

Вариант 2) - но не уверен, что этот путь к чему-нить приведет:
При выводе строки ставим флаг, добавляем элемент в СЗ + активизируем обработку ожидания/внешнее событие. После вывода всех строк вызванное событием/обработчиком ожидания процедура по подготовленному списку собирает остатки + вызывает перевывод строк (скорее всего, Форма.Обновить(0)). При повторном выводе строк выводим остатки из подготовленных запросом данных.


tl;dr:
1) ведем себя как Табличное поле с поставщиком-запросом - подготавливаем данные на 2 экрана.
2) в первой отрисовке строк собираем список элементов, по нему собираем остатки, активизируем вторую отрисовку строк, где уже выводим остатки из собранных данных.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Можно ли ускорить процесс выборки
Ответ #23 - 06. Сентября 2011 :: 08:01
Печать  
mozer писал(а) 06. Сентября 2011 :: 07:34:
Я так понял, что в поставщике данных реализован только интерфейс.
Реализация на C++ делается пользователем или я что то не допонял?


Ну почему же - есть несколько готовых поставщиков данных
http://www.1cpp.ru/docum/icpp/html/TableField.html#id108
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #24 - 06. Сентября 2011 :: 08:04
Печать  
mozer писал(а) 06. Сентября 2011 :: 06:49:
Хотелось бы увидеть примерчик. И насколько быстрей работает


Тут просто вывод в СЗ то, что на экранчике в данный момент отображено в форме списка справочника.
  

_______003.rar ( 579 KB | Загрузки )
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #25 - 06. Сентября 2011 :: 08:51
Печать  
Спасибо всем пошел "Курить". буду пробовать.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #26 - 06. Сентября 2011 :: 09:02
Печать  
Eprst писал(а) 06. Сентября 2011 :: 06:48:
А подробности ?
Как ты получил список номенклатуры, например, в обычной форме списка справочника и без использования ТП ?

ЗЫ: Штатно, это делается (извратом с текстовой колонкой, у меня есть примерчик).

Ну.. Это было давно и неправда.  Улыбка
Там при входе в группу кешировались остатки по всей группе. Сейчас бы делал через API курсоров, получая за раз по N записей (есть там такая полудокументированная фишка). Извратом с текстовой колонкой, ага.
  

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


1C++ rocks!

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

Union All

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

Union all
...
) 



Только вряд ли это будет быстрее.
Попробуй сделать скулевую реиндексацию + обнови статистику.


вот переделал вот в это не работает

Код
Выбрать все
ТекстЗапроса = "
	|SELECT
	|	SUM(ОстНаСкладе) ОстНаСкладе,
	|	SUM(ОстНаФирме) ОстНаФирме,
	|	SUM(РезервНаСкладе) РезервНаСкладе,
	|	SUM(РезервНаФирме) РезервНаФирме,
	|	(ОстНаСкладе - РезервНаСкладе) ОстатокСклад,
	|	(ОстНаФирме - РезервНаФирме) ОстатокФирма
	|FROM
	|(SELECT
	|	$РегОстатки.Количество ОстНаСкладе,
	|	0 ОстНаФирме,
	|	0 РезервНаСкладе,
	|	0 РезервНаФирме
	|FROM
	|	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
	|WHERE
	|	РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстаток + " AND $РегОстатки.Номенклатура = :ВыбНоменкл " + СтрокаСкладУсловиеОстаток + "
	|UNION ALL
	|SELECT
	|	0 ОстНаСкладе,
	|	$РегОстатки.Количество ОстНаФирме,
	|	0 РезервНаСкладе,
	|	0 РезервНаФирме
	|FROM
	|	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
	|WHERE
	|	РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстаток + " AND $РегОстатки.Номенклатура = :ВыбНоменкл
	|UNION ALL
	|SELECT
	|	0 ОстНаСкладе,
	|	0 ОстНаФирме,
	|	$РегРезервы.Количество РезервНаСкладе,
	|	0 РезервНаФирме
	|FROM
	|	$РегистрИтоги.РезервыТМЦ as РегРезервы
	|WHERE
	|	РегРезервы.Period = :ВыбДата~~" + СтрокаФирмаУсловиеРезерв + " AND $РегРезервы.Номенклатура = :ВыбНоменкл " + СтрокаФирмаУсловиеРезерв + "
	|UNION ALL
	|SELECT
	|	0 ОстНаСкладе,
	|	0 ОстНаФирме,
	|	$РегРезервы.Количество РезервНаСкладе,
	|	0 РезервНаФирме
	|FROM
	|	$РегистрИтоги.РезервыТМЦ as РегРезервы
	|WHERE
	|	РегРезервы.Period = :ВыбДата~~" + СтрокаФирмаУсловиеРезерв + " AND $РегРезервы.Номенклатура = :ВыбНоменкл)
	|";
 



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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #28 - 08. Сентября 2011 :: 07:53
Печать  
РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстато

вот тут and пропущен..
Ну и далее везде по тексту.
Если конечно, в СтрокаФирмаУсловиеОстато его тоже нет.
А так, алиясы везде выкини:
Код
Выбрать все
ТекстЗапроса = "
	|SELECT
	|	SUM(ОстНаСкладе) ОстНаСкладе,
	|	SUM(ОстНаФирме) ОстНаФирме,
	|	SUM(РезервНаСкладе) РезервНаСкладе,
	|	SUM(РезервНаФирме) РезервНаФирме,
	|	(ОстНаСкладе - РезервНаСкладе) ОстатокСклад,
	|	(ОстНаФирме - РезервНаФирме) ОстатокФирма
	|FROM
	|(SELECT
	|	$РегОстатки.Количество ОстНаСкладе,
	|	0 ОстНаФирме,
	|	0 РезервНаСкладе,
	|	0 РезервНаФирме
	|FROM
	|	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
	|WHERE
	|	РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстаток + " AND $РегОстатки.Номенклатура = :ВыбНоменкл " + СтрокаСкладУсловиеОстаток + "
	|UNION ALL
	|SELECT
	|	0,
	|	$РегОстатки.Количество,
	|	0,
	|	0
	|FROM
	|	$РегистрИтоги.ОстаткиТМЦ as РегОстатки
	|WHERE
	|	РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстаток + " AND $РегОстатки.Номенклатура = :ВыбНоменкл
	|UNION ALL
	|SELECT
	|	0,
	|	0,
	|	$РегРезервы.Количество,
	|	0
	|FROM
	|	$РегистрИтоги.РезервыТМЦ as РегРезервы
	|WHERE
	|	РегРезервы.Period = :ВыбДата~~" + СтрокаФирмаУсловиеРезерв + " AND $РегРезервы.Номенклатура = :ВыбНоменкл " + СтрокаФирмаУсловиеРезерв + "
	|UNION ALL
	|SELECT
	|	0,
	|	0,
	|	$РегРезервы.Количество,
	|	0
	|FROM
	|	$РегистрИтоги.РезервыТМЦ as РегРезервы
	|WHERE
	|	РегРезервы.Period = :ВыбДата~~" + СтрокаФирмаУсловиеРезерв + " AND $РегРезервы.Номенклатура = :ВыбНоменкл)
	|";
 

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


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #29 - 08. Сентября 2011 :: 07:56
Печать  
Eprst писал(а) 08. Сентября 2011 :: 07:53:
РегОстатки.Period = :ВыбДата~~" + СтрокаФирмаУсловиеОстато

вот тут and пропущен..
Ну и далее везде по тексту.

не пропушел говорит ошибка около )
или на английском
State 42000, native 102, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near ')'

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

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