Имя: Пароль:
1C
1С v8
Ускорение запроса
,
0 Amiralnar
 
06.10.11
06:08
Запрос получает остатки регистру бухгалтерии. Как понять, почему он выполняется не очень быстро?


   Запрос = Новый Запрос;
   Запрос.Текст = "
       |ВЫБРАТЬ
       |    ЭкономическийОстатки.Организация КАК Организация,
       |    ЭкономическийОстатки.Счет КАК Счет,
       |    ЭкономическийОстатки.Субконто1,
       |    ЭкономическийОстатки.Субконто2,
       |    ЭкономическийОстатки.Субконто3,
       |    ЭкономическийОстатки.СуммаОстатокДт,
       |    ЭкономическийОстатки.СуммаОстатокКт
       |ИЗ
       |    РегистрБухгалтерии.Экономический.Остатки(&ДатаОтчета, Счет В ИЕРАРХИИ (&Счет), , Субконто1 = &ЛицевойСчет) КАК ЭкономическийОстатки
       |ИТОГИ ПО
       |    Организация,
       |    Счет";

   Запрос.УстановитьПараметр("ДатаОтчета",ДатаКонтроля);
   Запрос.УстановитьПараметр("Счет", Счет_ВкладыРасчеты); // группа счетов 76.50
   Запрос.УстановитьПараметр("ЛицевойСчет", ЛицевойСчет.Ссылка);
1 walp
 
06.10.11
06:33
Могу предложить вместо
Счет В ИЕРАРХИИ (&Счет)
использовать
Счет В (&СписокСчетов)
или этот список счетов получать предыдущим запросом и загонять в виртуальную таблицу
Счет В (ВЫБРАТЬ Счет ИЗ ВТ_Счетов)
У меня так некоторые запросы начинали работать поживее, не люблю "В ИЕРАРХИИ", удобная штука, но, имхо, тормозная

как-то так
надеюсь, кто-нибудь расскажет, как надо было :)
2 Amiralnar
 
06.10.11
07:15
Сделал так:


ВЫБРАТЬ
   ЭкономическийОстатки.Организация КАК Организация,
   ЭкономическийОстатки.Счет КАК Счет,
   ВЫРАЗИТЬ(ЭкономическийОстатки.Субконто1 КАК Справочник.кпкДоговорыВклада) КАК Субконто1,
   ВЫРАЗИТЬ(ЭкономическийОстатки.Субконто2 КАК Перечисление.кпкСтруктураВклада) КАК Субконто2,
   ВЫРАЗИТЬ(ЭкономическийОстатки.Субконто3 КАК Перечисление.кпкВкладыВидКомпВыплатПоНДФЛ) КАК Субконто3,
   ЭкономическийОстатки.СуммаОстатокДт,
   ЭкономическийОстатки.СуммаОстатокКт
ИЗ
   РегистрБухгалтерии.Экономический.Остатки(&ДатаОтчета, Счет В (&Счет), , (ВЫРАЗИТЬ(Субконто1 КАК Справочник.кпкДоговорыВклада)) = &ЛицевойСчет) КАК ЭкономическийОстатки
ИТОГИ ПО
   Организация,
   Счет


Время выполнения не изменилось: 0.2 - 0.25 сек. Нужно 0.05 сек.
3 Escander
 
06.10.11
07:17
(2) курим (1)!  а зачем Вам так быстро нужно? Это запрос выполняется не в цикле?
4 Amiralnar
 
06.10.11
07:20
(3) Что-то в (1) есть такое, чего нет в (2).
В цикле. Обработка по созданию документов. Переделывать под один запрос - очень трудоемко. Трудоемкость в часах - на 40 часов.
5 Escander
 
06.10.11
07:22
(4)"Орешек знаний твёрд, но всё-же мы не привыкли отступать!"

Выполнение запроса в цикле считается грубейшей ошибкой!
6 Escander
 
06.10.11
07:24
+(5) нет лучшего способа ускорить выполнение запроса выполняемого в цикле кроме как переписать сам запрос с целью его выполнения однократно.

Нет более эффективного способа ускорить!
7 Amiralnar
 
06.10.11
07:25
(6) Ты умный, давай ты перепишешь? Тебе заплатят за пять часов. И дальше сам решай, какой способ эффективный, ок?
8 Рэйв
 
06.10.11
07:29
(7)Эффективность выражается не в полученных деньгах, а в скорости выполнения. Если тебя больше интересует сколько тебе заплатят зачем тогда тему создавать? Ты спросил - тебе ответили, не нравится- наслаждайся тем, что есть и нечего грубить тут.
9 Amiralnar
 
06.10.11
07:32
(8) Предлагаю не продолжать дискуссию, если вам нечего сказать по теме.
10 GROOVY
 
06.10.11
07:33
Предлагаю типизировать субконто.
11 Amiralnar
 
06.10.11
07:34
Запрос в профайлере выглядит так:

http://paste.netsago.org/ru/view/2773407211/
CPU: 204, READS 30400, DURATOIN 200
12 unknown181538
 
06.10.11
07:34
40??! За вынос этого простого запроса из цикла?
А если не вписывать его в большой запрос, а выполнить отдельно в целом по счету, а потом обращаться к результатам?
13 GROOVY
 
06.10.11
07:34
(2) Это на единицу по пятибельной шкале.
14 Amiralnar
 
06.10.11
07:34
(10) Да, см. (2)
15 Amiralnar
 
06.10.11
07:35
(13) Не понял...
16 Amiralnar
 
06.10.11
07:42
(12) Я не могу просто переписать. Кроме этого нужно утвердить серьезное изменение в логике работы документа, привлечь сотрудников и выборочно проверить несколько счетов, и ответить материально за ошибки в расчетах операций по вкладам.
17 Amiralnar
 
06.10.11
07:53
Проблема следующая:
На сервере SQL необходимо выполнить трассировку запроса.
Запрос обращается с временной таблице #tt2

Для трассировки создания таблицы - нужно перезапускать сервер 1С, что недопустимо.
В tembdb таких таблиц десять. Как быть?
- дропнуть все #tt2?
- выяснить, какая правильня?
- свой вариант
18 Escander
 
06.10.11
08:01
(10) что имеется в виду под "типизировать субконто"?

(12) сохранить в менеждере временных таблиц отсортировав как нужно а потом оттуда выбирать? Ну профит скорее всего будет несколько менее чем от сложного запроса - всё-же там можно в 1 запросе для результата построить индекс и тогда в последующем (последующих) отбор нужного результата будет реально быстрым
19 Amiralnar
 
06.10.11
08:03
(18) Про менеджер мысль хорошая. Надо попробовать.
20 Amiralnar
 
06.10.11
08:20
(18) Спасибо за ценную идею. Результат: 0.00 - 0.05 сек.
21 Escander
 
06.10.11
08:42
(19)писать пакетный не намного сложнее чем разнести его на 2 части с менеджером временных таблиц... имхо...
22 Escander
 
06.10.11
08:45
+(21) как-бы самое место менеждеру - когда нужно выполнить пару запросов с общей частью... тогда эту часть в менеждер и выносят....
Ошибка? Это не ошибка, это системная функция.