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



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #30 - 08. Сентября 2011 :: 07:57
Печать  
на первый взгляд может быть здесь
Код
Выбрать все
...:ВыбДата~~" + СтрокаФи... 

(может нет пробела при подстановке условия). А вообще, не видя что в СтрокаФирмаУсловиеОстаток сложно сказать.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #31 - 08. Сентября 2011 :: 07:58
Печать  
"AND

тут пробела нет в строке условий
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #32 - 08. Сентября 2011 :: 08:00
Печать  
Eprst писал(а) 08. Сентября 2011 :: 07:58:
"AND

тут пробела нет в строке условий

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #33 - 08. Сентября 2011 :: 08:01
Печать  
|      (ОстНаСкладе - РезервНаСкладе) ОстатокСклад,
     |      (ОстНаФирме - РезервНаФирме) ОстатокФирма

А это что за фигня ?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #34 - 08. Сентября 2011 :: 08:06
Печать  
И это, выложи лучше, что показывает Запрос.Отладка(1)
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #35 - 08. Сентября 2011 :: 08:09
Печать  
Eprst писал(а) 08. Сентября 2011 :: 08:01:
|      (ОстНаСкладе - РезервНаСкладе) ОстатокСклад,
     |      (ОстНаФирме - РезервНаФирме) ОстатокФирма

А это что за фигня ?


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


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #36 - 08. Сентября 2011 :: 08:11
Печать  
Eprst писал(а) 08. Сентября 2011 :: 08:06:
И это, выложи лучше, что показывает Запрос.Отладка(1)


Код
Выбрать все
{call sp_executesql(N'
SELECT
	SUM(ОстНаСкладе) ОстНаСкладе,
	SUM(ОстНаФирме) ОстНаФирме,
	SUM(РезервНаСкладе) РезервНаСкладе,
	SUM(РезервНаФирме) РезервНаФирме,
	(ОстНаСкладе - РезервНаСкладе) ОстатокСклад,
	(ОстНаФирме - РезервНаФирме) ОстатокФирма
FROM
(SELECT
	РегОстатки.sp411 ОстНаСкладе,
	0 ОстНаФирме,
	0 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg405 as РегОстатки
WHERE
	РегОстатки.Period = @ВыбДата2 AND РегОстатки.sp4062 = @ВыбФирма0 AND РегОстатки.sp408 = @ВыбНоменкл0  AND РегОстатки.sp418 = @ВыбСклад0
UNION ALL
SELECT
	0 ОстНаСкладе,
	РегОстатки.sp411 ОстНаФирме,
	0 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg405 as РегОстатки
WHERE
	РегОстатки.Period = @ВыбДата2 AND РегОстатки.sp4062 = @ВыбФирма0 AND РегОстатки.sp408 = @ВыбНоменкл0
UNION ALL
SELECT
	0 ОстНаСкладе,
	0 ОстНаФирме,
	РегРезервы.sp4479 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg4480 as РегРезервы
WHERE
	РегРезервы.Period = @ВыбДата2 AND РегРезервы.sp4475 = @ВыбФирма0 AND РегРезервы.sp4477 = @ВыбНоменкл0  AND РегРезервы.sp4476 = @ВыбСклад0
UNION ALL
SELECT
	0 ОстНаСкладе,
	0 ОстНаФирме,
	РегРезервы.sp4479 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg4480 as РегРезервы
WHERE
	РегРезервы.Period = @ВыбДата2 AND РегРезервы.sp4475 = @ВыбФирма0 AND РегРезервы.sp4477 = @ВыбНоменкл0)
', N'@ВыбДата2 datetime,@ВыбФирма0 char(9),@ВыбНоменкл0 char(9),@ВыбСклад0 char(9)'
,{d '2011-09-01'},'     2   ','   BEL   ','     1   ')}
 


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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #37 - 08. Сентября 2011 :: 08:21
Печать  
Суммы забыл добавить двум последним полям, в которых разность
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #38 - 08. Сентября 2011 :: 08:24
Печать  
Сделай алияс на подзапрос, воткни в селект листе всё в сумму,
выкини 2 юниона, заместо них, тупо в case  условие на склад.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #39 - 08. Сентября 2011 :: 08:26
Печать  
Dmitry The Wing писал(а) 08. Сентября 2011 :: 08:21:
Суммы забыл добавить двум последним полям, в которых разность

Вроде как не нужны там SUM ...
попробовал нет не работает
и вычисляемые поля  тоже отключал таже беда
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #40 - 08. Сентября 2011 :: 08:32
Печать  
Eprst писал(а) 08. Сентября 2011 :: 08:24:
Сделай алияс на подзапрос, воткни в селект листе всё в сумму,
выкини 2 юниона, заместо них, тупо в case  условие на склад.

воткнул алиас на подзапрос и вот что вышло, точно дело в нем было
Код
Выбрать все
{Глобальный модуль(144)}: State 42000, native 8120, message [Microsoft][ODBC SQL Server Driver][SQL Server]Column 'Выборка.ОстНаСкладе' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
{call sp_executesql(N'
SELECT
	SUM(Выборка.ОстНаСкладе) ОстНаСкладе,
	SUM(Выборка.ОстНаФирме) ОстНаФирме,
	SUM(Выборка.РезервНаСкладе) РезервНаСкладе,
	SUM(Выборка.РезервНаФирме) РезервНаФирме,
	(ОстНаСкладе - РезервНаСкладе) ОстатокСклад,
	(ОстНаФирме - РезервНаФирме) ОстатокФирма
FROM
(SELECT
	РегОстатки.sp411 ОстНаСкладе,
	0 ОстНаФирме,
	0 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg405 as РегОстатки
WHERE
	РегОстатки.Period = @ВыбДата2 AND РегОстатки.sp4062 = @ВыбФирма0 AND РегОстатки.sp408 = @ВыбНоменкл0  AND РегОстатки.sp418 = @ВыбСклад0
UNION ALL
SELECT
	0 ОстНаСкладе,
	РегОстатки.sp411 ОстНаФирме,
	0 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg405 as РегОстатки
WHERE
	РегОстатки.Period = @ВыбДата2 AND РегОстатки.sp4062 = @ВыбФирма0 AND РегОстатки.sp408 = @ВыбНоменкл0
UNION ALL
SELECT
	0 ОстНаСкладе,
	0 ОстНаФирме,
	РегРезервы.sp4479 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg4480 as РегРезервы
WHERE
	РегРезервы.Period = @ВыбДата2 AND РегРезервы.sp4475 = @ВыбФирма0 AND РегРезервы.sp4477 = @ВыбНоменкл0  AND РегРезервы.sp4476 = @ВыбСклад0
UNION ALL
SELECT
	0 ОстНаСкладе,
	0 ОстНаФирме,
	РегРезервы.sp4479 РезервНаСкладе,
	0 РезервНаФирме
FROM
	rg4480 as РегРезервы
WHERE
	РегРезервы.Period = @ВыбДата2 AND РегРезервы.sp4475 = @ВыбФирма0 AND РегРезервы.sp4477 = @ВыбНоменкл0) as Выборка
', N'@ВыбДата2 datetime,@ВыбФирма0 char(9),@ВыбНоменкл0 char(9),@ВыбСклад0 char(9)'
,{d '2011-09-01'},'     2   ','   BEL   ','     1   ')}
СтруктураОстатков = НаборЗаписей.ВыполнитьСкалярный(ТекстЗапроса);
{Глобальный модуль(144)}: State 42000, native 8120, message [Microsoft][ODBC SQL Server Driver][SQL Server]Column 'Выборка.ОстНаСкладе' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
 


Я так понимаю ему группировку подавай
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #41 - 08. Сентября 2011 :: 08:35
Печать  
Сумму сделай на разность в селекте!
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Можно ли ускорить процесс выборки
Ответ #42 - 08. Сентября 2011 :: 08:41
Печать  
Eprst писал(а) 08. Сентября 2011 :: 08:35:
Сумму сделай на разность в селекте!

Ага догадался все робит щас тест скорости сделаю )))
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли ускорить процесс выборки
Ответ #43 - 08. Сентября 2011 :: 08:47
Печать  
и выкини 2 лишних юниона.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

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

Бестрей !!
Если раньше около 0.295 - 0.312 то сейчас 0.15 - 0.16

Только по прошествии времени получение цены работает все медленнее чем дальше от начала месяца тем хуже или это от чего то другого зависит
Код
Выбрать все
Функция глВернутьЦену(Номенклатура, ТипЦены, ДатаЦены = 0, ЦенаЦены = 0, ЕдЦены = 0, ВалЦены = 0, НаценкаЦены = 0, НайденнаяЦена = 0) Экспорт
	Перем ЦеныНоменклатуры;
	Перем Рассчетная;
	Перем НужныйТипЦен;
	Перем ЕстьУдаленные;


	Рез = 1;
	НайденнаяЦена = ПолучитьПустоеЗначение("Справочник.Цены");

	Если ПустоеЗначение(ДатаЦены) = 1 Тогда
		ДатаЦены = РабочаяДата();
	КонецЕсли;

	// Найдет или нужную цену в справочнике
	// если она рассчитывается, то найдем базовую цену
	Рассчетная		= ТипЦены.Рассчитывается;
	НужныйТипЦен	= ?(ПустоеЗначение(Рассчетная) = 1, ТипЦены, ТипЦены.БазовыйТипЦен);

	НаборЗаписей = СоздатьОбъект("ODBCRecordset");
	НаборЗаписей.РежимRPC(1);
	ТекстЗапросаЦены = "
	|SELECT
	|  СпрН.Descr Наименование,
	|  СпрЦ.ID [Ссылка $Справочник.Цены],
	|  $ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) Цена,
	|  $ПоследнееЗначение.Цены.Единица(СпрЦ.ID, :ВыбДата) [Единица $Справочник.Единицы],
	|  $СпрЦ.Валюта [Валюта $Справочник.Валюты],
	|  $СпрЦ.Процент Процент,
	|  СпрЦ.IsMark Пометка
	|FROM
	|  $Справочник.Номенклатура СпрН
	|LEFT JOIN
	|  $Справочник.Цены СпрЦ ON СпрЦ.ParentExt = СпрН.ID AND
	|				   $СпрЦ.ТипЦен = :ТипЦен
	|WHERE
	|  СпрН.ID = :ВыбНом
	|";


	НаборЗаписей.УстановитьТекстовыйПараметр("ВыбДата",ДатаЦены);
	НаборЗаписей.УстановитьТекстовыйПараметр("ТипЦен",НужныйТипЦен);
	НаборЗаписей.УстановитьТекстовыйПараметр("ВыбНом",Номенклатура);
	Структура = НаборЗаписей.ВыполнитьСкалярный(ТекстЗапросаЦены);

	Если Структура.Пометка = 1 Тогда
		Рез = - 1;
	КонецЕсли;

	НайденнаяЦена = Структура.Ссылка.ТекущийЭлемент();
	Если ПустоеЗначение(НайденнаяЦена) = 1 Тогда

		// Нет такой цены
		Возврат 0;
	КонецЕсли;

	// Заполним все ценовые характериситики

	// если не задана единица цены на эту дату, то потом придется обрабатывать случай нулевого коэффициента у  пустой единицы
	ЕдЦены		= Структура.Единица;

	Если ПустоеЗначение(Рассчетная) = 1 Тогда

		//Если цена не рассчитывается
		ЦенаЦены	= Структура.Цена;

		// элемент справочника существует Валюту и Наценку возьмем из него
		ВалЦены		= Структура.Валюта;
		НаценкаЦены	= Структура.Процент;
	Иначе

		//Если цена рассчитывается
		БазоваяЦена 	= Структура.Цена;
		БазоваяВалюта	= Структура.Валюта;

		// Цены у базового типа могут отличаться
		ЦенаЦены    = глПересчет(БазоваяЦена, БазоваяВалюта, ДатаЦены, ТипЦены.Валюта, ДатаЦены);
		ЦенаЦены    = глОкруглить(ЦенаЦены * (100 + ТипЦены.Процент) / 100, ТипЦены.ПорядокОкругления);

		// элемент справочника Цены не существует (расчетный). Валюту и Наценку возьмем из типа цены
		ВалЦены		= ТипЦены.Валюта;
		НаценкаЦены	= ТипЦены.Процент;
	КонецЕсли;

	Возврат Рез;
КонецФункции // глВернутьЦену()
 

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