Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Оптимизация запроса (число прочтений - 5124 )
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Оптимизация запроса
15. Июня 2010 :: 13:53
Печать  
Не знаю, насколько корректно выкладывать сюда этот код, но я рискну Улыбка Не сдайте меня Улыбка)

Короче, есть документ, проведение которого занимает 16-18 минут. 68% времени занимает вот этот запрос:
Код
Выбрать все
	Запрос = Новый Запрос;

	Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
			   |	СписокОС.ОсновноеСредство КАК ОсновноеСредство,
				   |	СписокОС.Ссылка.Организация КАК Организация,
				   |	СписокОС.Ссылка.СистемаУчета КАК СистемаУчета,
				   |	СписокОС.Ссылка.Дата КАК Дата,
				   |	&ЕстьНалоговыйУчет КАК ЕстьНалоговыйУчет,
				   |	&ВедетсяУчетПоПодразделениям КАК ВедетсяУчетПоПодразделениям,
				   |	&СистемаУчетаСтандартна КАК СистемаУчетаСтандартна,
				   |    &ИмяРегистраСУ КАК ИмяРегистраСУ,
			   |	СписокОС.МетодНачисленияАмортизации КАК МетодНачисленияАмортизации,
			   |	СписокОС.ОбъемВыпуска КАК КоличествоВыпущеннойПродукции,
			   |	СведенияОС.ДатаПринятияКУчету КАК ДатаПринятияКУчету,
			   |	СведенияОСАморт.СрокПолезногоИспользования КАК СрокПолезногоИспользования,
			   |	СчетаУчетаОС.СчетУчета КАК СчетУчета,
			   |	СведенияОСАморт.СчетЗатрат КАК СчетЗатрат,
			   |	СчетаУчетаОС.СчетНачисленияАмортизации КАК СчетНачисленияАмортизации,
			   |	СчетаУчетаОС.СчетСниженияСтоимости КАК СчетСниженияСтоимости,
			   |	СведенияОСАморт.ЛиквидационнаяСтоимость КАК ЛиквидационнаяСтоимость,
			   |	СведенияОСАморт.КоэффициентУскорения КАК КоэффициентУскорения,
			   |	СведенияОСАморт.ПредполагаемыйОбъемПродукции КАК ПредполагаемыйОбъемПродукции,
			   |	СведенияОС.ПервоначальнаяСтоимость КАК ПервоначальнаяСтоимость,
			   |	СведенияОСАморт.НачислятьАмортизацию КАК НачислятьАмортизацию,
			   |	СписокОС.СуммаАмортизацииНачисленная КАК СуммаНачисленнойАмортизации,
			   |	СведенияОСАморт.Субконто1 КАК Субконто1,
			   |	СведенияОСАморт.Субконто2 КАК Субконто2,
			   |	СведенияОСАморт.Субконто3 КАК Субконто3,
			   |	СведенияОСАморт.Субконто4 КАК Субконто4,
			   |	СведенияОСАморт.Субконто5 КАК Субконто5,
				   |    " + ТекстСубконто + "
			   |	ВЫБОР
			   |		КОГДА СведенияОС.МетодОценкиАктивов = &ПустойМетодОценки
			   |			ТОГДА УчетнаяПолитика.МетодОценкиАктивов
			   |		ИНАЧЕ СведенияОС.МетодОценкиАктивов
			   |	КОНЕЦ КАК МетодОценкиОсновныхСредств,
				   |	УчетнаяПолитика.ПроизводитьАмортизациюОбесценения КАК ПроизводитьАмортизациюОбесценения,
			   |	СписокОС.СуммаАмортизацииНачисленная,
			   |	СписокОС.СуммаАмортизацииОбесценения,
			   |	СписокОС.СуммаОбесценения
			   |
			   |ИЗ
			   |	Документ.хн_НачисленияАмортизацииОС.ОсновныеСредства КАК СписокОС
			   |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.хн_ОсновныеСредства КАК СведенияОС
			   |			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.хн_СчетаУчетаОС.СрезПоследних(&Дата,СистемаУчета = &СистемаУчета И Организация = &Организация ) КАК СчетаУчетаОС
			   |			ПО СведенияОС.ОсновноеСредство = СчетаУчетаОС.ОсновноеСредство
			   |			ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии." + ИмяРегистраСУ + ".Остатки(&Дата, , , Организация = &Организация) КАК РегистрБухгалтерииОстатки
			   |			ПО ( " + Сред(ТекстУсловиеСубконто,5) + ")
			   |				И (СчетаУчетаОС.СчетУчета = РегистрБухгалтерииОстатки.Счет)
			   |			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.хн_ПараметрыАмортизацииОС.СрезПоследних(&Дата,СистемаУчета = &СистемаУчета И Организация = &Организация) КАК СведенияОСАморт
			   |			ПО (СведенияОСАморт.ОсновноеСредство = СведенияОС.ОсновноеСредство)
			   |				И (СведенияОСАморт.НачислятьАмортизацию)
			   |		ПО (СведенияОС.ОсновноеСредство = СписокОС.ОсновноеСредство
				   |	  И СведенияОС.СистемаУчета = СписокОС.Ссылка.СистемаУчета
				   |	  И СведенияОС.Организация = СписокОС.Ссылка.Организация)
				   |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.хн_УчетнаяПолитикаСУ.СрезПоследних(
			   |				&Дата,
			   |				Организация = &Организация
			   |					И СистемаУчета = &СистемаУчета) КАК УчетнаяПолитика
			   |		ПО (ИСТИНА)
			   |ГДЕ
			   |	СписокОС.Ссылка = &Ссылка";

	Запрос.УстановитьПараметр("Ссылка", 		Ссылка);
	Запрос.УстановитьПараметр("Дата", 			КонецМесяца(СтруктураПараметров.ДатаКон));
	Запрос.УстановитьПараметр("Организация",	СтруктураПараметров.Организация);
	Запрос.УстановитьПараметр("СистемаУчета",	СтруктураПараметров.СистемаУчета);
	Запрос.УстановитьПараметр("ПустойМетодОценки", 	Перечисления.хн_МетодыОценкиАктивов.ПустаяСсылка());
	Запрос.УстановитьПараметр("ЕстьНалоговыйУчет", 				СтруктураПараметров.ЕстьНалоговыйУчет);
	Запрос.УстановитьПараметр("ВедетсяУчетПоПодразделениям", 	СтруктураПараметров.ВедетсяУчетПоПодразделениям);
	Запрос.УстановитьПараметр("СистемаУчетаСтандартна",
СтруктураПараметров.СистемаУчетаСтандартна);
	Запрос.УстановитьПараметр("ИмяРегистраСУ", 					ИмяРегистраСУ);

	Возврат Запрос.Выполнить();
 

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


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса
Ответ #1 - 15. Июня 2010 :: 13:54
Печать  
В документе 29 тысяч строк.

Есть способы оптимизации?
  
Наверх
www  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Оптимизация запроса
Ответ #2 - 15. Июня 2010 :: 14:07
Печать  
Что-то мне подсказывает что основная проблема вот тут:
Код
Выбрать все
				   |	  И СведенияОС.СистемаУчета = СписокОС.Ссылка.СистемаУчета
				   |	  И СведенияОС.Организация = СписокОС.Ссылка.Организация) 


вечером подумаю подробней.
  
Наверх
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса
Ответ #3 - 15. Июня 2010 :: 14:15
Печать  
А вот да, объясните мне, зачем вообще может понадобиться писать через .Ссылка. что-то вроде такого:

Выбрать
СписокОС.Ссылка.Организация КАК Организация,
СписокОС.Ссылка.СистемаУчета КАК СистемаУчета,
СписокОС.Ссылка.Дата КАК Дата,
ИЗ Документ.хн_НачисленияАмортизацииОС.ОсновныеСредства КАК СписокОС
  
Наверх
www  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Оптимизация запроса
Ответ #4 - 15. Июня 2010 :: 14:24
Печать  
Код
Выбрать все
	   |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.хн_УчетнаяПолитикаСУ.СрезПоследних(
			   |				&Дата,
			   |				Организация = &Организация
			   |					И СистемаУчета = &СистемаУчета) КАК УчетнаяПолитика
			   |		ПО (ИСТИНА) 


Вроде здесь ошибка.
Т.е. к имеющейся к таблице к каждой строке присоеденяем
всю таблицу из среза последних.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса
Ответ #5 - 15. Июня 2010 :: 14:31
Печать  
Звучит логично. А вот это вот:
(Организация = &Организация
И СистемаУчета = &СистемаУчета) - это что?
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса
Ответ #6 - 15. Июня 2010 :: 14:36
Печать  
fez писал(а) 15. Июня 2010 :: 14:15:
А вот да, объясните мне, зачем вообще может понадобиться писать через .Ссылка. что-то вроде такого:

Так, тут понятно, на Мисте растолковали, что это штатный способ обращения к реквизитам шапки из табличной части.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса
Ответ #7 - 15. Июня 2010 :: 14:39
Печать  
fez писал(а) 15. Июня 2010 :: 14:31:
Звучит логично. А вот это вот:
(Организация = &Организация
И СистемаУчета = &СистемаУчета) - это что?

Ага, это параметры метода СрезПоследних.
  
Наверх
www  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Оптимизация запроса
Ответ #8 - 15. Июня 2010 :: 21:44
Печать  
В общем могу посоветовать путь которым 1С пошла в 2.0.
В пакетном запросе:
1. Выборка ОС во временную таблицу с индексом по ОС
2. Выборка (в несколько запросов) всей информации (местонахождение, счетучета, счетамортизации, счетизноса) во временные таблицы где то с индексами по ОС где то без
3. Выборка Остатков во временную таблицу
4. Выборка из врем. таблицы ОС  с соединением со всеми таблицами + информация из шапки (ее лучше подставлять параметрами, поскольку она заранее считывается в структуру СтруктураШапкиДокумента).
Собственно результат тот же, а запрос куда более читабельный и его проще проверять/тестировать, и искать "затыки".

А вообще я не знаю почему 1С тоже балуется точками (т.е. "Поле.Поле.Поле") большинство таких запросов я пересборал конструктором или переписал самостоятельно ибо не совсем уверен что парсер правильно прописывает соединения.

Пы.сы. это все на базе версии Бухгалтерия 1.6? В 2.0 одноэссники заметно умнее стали.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса
Ответ #9 - 16. Июня 2010 :: 04:26
Печать  
vandalsvq писал(а) 15. Июня 2010 :: 21:44:
В общем могу посоветовать путь которым 1С пошла в 2.0.
В пакетном запросе:
1. Выборка ОС во временную таблицу с индексом по ОС
2. Выборка (в несколько запросов) всей информации (местонахождение, счетучета, счетамортизации, счетизноса) во временные таблицы где то с индексами по ОС где то без
3. Выборка Остатков во временную таблицу
4. Выборка из врем. таблицы ОС  с соединением со всеми таблицами + информация из шапки (ее лучше подставлять параметрами, поскольку она заранее считывается в структуру СтруктураШапкиДокумента).
Собственно результат тот же, а запрос куда более читабельный и его проще проверять/тестировать, и искать "затыки".

Да, запрос лучше разложить на запрос с временными таблицами.

vandalsvq писал(а) 15. Июня 2010 :: 21:44:
А вообще я не знаю почему 1С тоже балуется точками (т.е. "Поле.Поле.Поле") большинство таких запросов я пересборал конструктором или переписал самостоятельно ибо не совсем уверен что парсер правильно прописывает соединения.

Технологический журнал юзай, с его помощью точно увидишь, какой запрос идет к СУБД.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса
Ответ #10 - 16. Июня 2010 :: 04:33
Печать  
Z1 писал(а) 15. Июня 2010 :: 14:24:
Код
Выбрать все
	   |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.хн_УчетнаяПолитикаСУ.СрезПоследних(
			   |				&Дата,
			   |				Организация = &Организация
			   |					И СистемаУчета = &СистемаУчета) КАК УчетнаяПолитика
			   |		ПО (ИСТИНА) 


Вроде здесь ошибка.
Т.е. к имеющейся к таблице к каждой строке присоеденяем
всю таблицу из среза последних.

Нет, это мелочь на самом деле.
Нужно смотреть регистры сведений (РС) и регистр бухгалтерии.
1. проверить порядок измерений - например, Организация идет первым, а СчетУчета третьим. в этом случае индексы не сработают, будет полный перебор.
2. на работу РС очень часто влияет периодичность регистра.
Например, в одной самописной конфе очень медленно работали разные запросы.
Начал разбираться, увидел, что проблема связана с РС Цены, периодичность которого была "по позиции регистратора".
На самом деле в жизни мы же не будем менять цены на один товар несколько раз в день.
Поэтому исправил периодичность на "в пределах дня", программа сразу залетала Улыбка - производительность запросов выросла в несколько раз.
3. Здесь очень тяжелые запросы + часть условий спрятана в тексте, нам неизвестном.
Нужно разбивать запрос на части и анализировать их производительность.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Оптимизация запроса
Ответ #11 - 16. Июня 2010 :: 08:28
Печать  
vandalsvq писал(а) 15. Июня 2010 :: 21:44:
Пы.сы. это все на базе версии Бухгалтерия 1.6?

Да. Но это не код 1С Улыбка
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать