Имя: Пароль:
1C
1С v8
Ускорить запрос
0 дущ
 
07.12.11
02:01
В 1С:Рознице есть такой вот запрос заполнения регистра ТоваарыВККМ

ВЫБРАТЬ РАЗЛИЧНЫЕ
   Ном.*,
   СпрКассы.Ссылка КАК Касса
ИЗ
   (

ВЫБРАТЬ
   СпрНоменклатура.Ссылка КАК Номенклатура,

   СпрНоменклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,

   ЕСТЬNULL(СпрХарактеристики.Ссылка, СпрНоменклатура.ХарактеристикаНоменклатуры) КАК ХарактеристикаНоменклатуры,

   СпрНоменклатура.СерияНоменклатуры КАК СерияНоменклатуры

ИЗ
   (ВЫБРАТЬ
       СпрНоменклатура.Ссылка КАК Ссылка,
       СпрНоменклатура.ЕдиницаХраненияОстатков КАК ЕдиницаХраненияОстатков,
       ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК ХарактеристикаНоменклатуры,
       &ПустаяСерия КАК СерияНоменклатуры
   ИЗ
       Справочник.Номенклатура КАК СпрНоменклатура
   ГДЕ
       НЕ СпрНоменклатура.ЭтоГруппа И СпрНоменклатура.Ссылка В (&СписокПоследнейНоменклатуры)
       {ГДЕ СпрНоменклатура.Ссылка.* КАК Номенклатура}
   ) КАК СпрНоменклатура

ЛЕВОЕ СОЕДИНЕНИЕ
   (ВЫБРАТЬ
       СпрХарактеристики.Ссылка КАК Ссылка,
       СпрХарактеристики.Владелец КАК Владелец
   ИЗ
       Справочник.ХарактеристикиНоменклатуры КАК СпрХарактеристики
   ОБЪЕДИНИТЬ
   ВЫБРАТЬ
       ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка),
       NULL
   )КАК СпрХарактеристики
ПО
   СпрХарактеристики.Владелец = СпрНоменклатура.Ссылка
   ИЛИ СпрХарактеристики.Ссылка = СпрНоменклатура.ХарактеристикаНоменклатуры

) КАК Ном

ВНУТРЕННЕЕ СОЕДИНЕНИЕ
   Справочник.КассыККМ КАК СпрКассы
ПО
   СпрКассы.Ссылка В (&КассыККМ)
ЛЕВОЕ СОЕДИНЕНИЕ
   РегистрСведений.ТоварыНаККМ КАК ТоварыНаККМ
ПО
   ТоварыНаККМ.Номенклатура = Ном.Номенклатура
   И ТоварыНаККМ.ХарактеристикаНоменклатуры = Ном.ХарактеристикаНоменклатуры
   И ТоварыНаККМ.СерияНоменклатуры = Ном.СерияНоменклатуры
   И ТоварыНаККМ.ЕдиницаИзмерения = Ном.ЕдиницаИзмерения
   И ТоварыНаККМ.КассаККМ = СпрКассы.Ссылка

ГДЕ
   ТоварыНаККМ.Номенклатура ЕСТЬ NULL
   И Не Ном.Номенклатура.Набор

Собственно основная проблема вот в этом последнем соединении, которое призвано отфильтровать те позиции которые уже имеются в регистре ТоварыНаККМ. В этом регистре уже 50000 записей. При этом запрос выбирает из характеристик номенклатуры эти же 50000 записей. Естественно при их соединении программа висит часами. У кого-какие мысли есть по оптимизации запроса?
1 Immortal
 
07.12.11
02:03
предлагаю переписать)
2 дущ
 
07.12.11
02:06
(1) Весь вопрос - как? :)
Честно говоря, вроде и так запрос верх лаконичности
3 дущ
 
07.12.11
02:09
Вот это

И СпрНоменклатура.Ссылка В (&СписокПоследнейНоменклатуры)

уже я добавил что бы хоть как-нибудь уменьшить выборки по номенклатуре. Но хотелось бы запрос улучшить не уменьшая его подмножества исходных данных.
4 Immortal
 
07.12.11
02:17
база какая?
5 Immortal
 
07.12.11
02:17
файловая, клиент-серверная?
6 дущ
 
07.12.11
02:19
файло
7 Immortal
 
07.12.11
02:19
посмотри поля, по которым осуществляется соединения таблиц - они все проиндексированы?
8 Bober
 
07.12.11
02:19
раз есть такая вещь {ГДЕ СпрНоменклатура.Ссылка.* КАК Номенклатура}, то это какой-то отчет? или обработка? откуда этот запрос и какая версия 1С:Розницы
9 Immortal
 
07.12.11
02:22
версия сильно старая..его потом переделали(offline обмен)
10 дущ
 
07.12.11
02:23
(7) Это сразу глянул. Естественно нет. Розница - базовая :(
(8) Это обработка. Там построитель используется типа что бы пользователю дать возможность свои отборы в форме заполнения накладывать.
11 Bober
 
07.12.11
02:24
как я понял это запрос, берется вся номенклатура с детализацией до характеристики, далее результат тупо умножается на количество касс - мега таблица сравнивается со значениями в РС.ТоварыНаККМ
12 Bober
 
07.12.11
02:25
это а-ля список того, что мы должны выгрузить на фронтол кассы?
13 Immortal
 
07.12.11
02:25
тогда надо сначала поместить результаты первого и второго запросов (данные расчета и данные из базы) во временные таблицы - с фильтрами, проиндексировать эти таблицы и потом уже соединять
14 Immortal
 
07.12.11
02:26
ну и по логике посмотреть, может там и не нужно столько всего
15 Bober
 
07.12.11
02:32
кусок говна
(
   ВЫБРАТЬ
       СпрНоменклатура.Ссылка КАК Номенклатура,
       СпрНоменклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,
       ЕСТЬNULL(СпрХарактеристики.Ссылка, СпрНоменклатура.ХарактеристикаНоменклатуры) КАК ХарактеристикаНоменклатуры,
       СпрНоменклатура.СерияНоменклатуры КАК СерияНоменклатуры

   ИЗ
   (
   ВЫБРАТЬ
           СпрНоменклатура.Ссылка КАК Ссылка,
           СпрНоменклатура.ЕдиницаХраненияОстатков КАК ЕдиницаХраненияОстатков,
           ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК ХарактеристикаНоменклатуры,
           &ПустаяСерия КАК СерияНоменклатуры
       ИЗ
           Справочник.Номенклатура КАК СпрНоменклатура
       ГДЕ
             НЕ СпрНоменклатура.ЭтоГруппа
       И СпрНоменклатура.Ссылка В (&СписокПоследнейНоменклатуры)
       {ГДЕ СпрНоменклатура.Ссылка.* КАК Номенклатура}
       ) КАК СпрНоменклатура

   ЛЕВОЕ СОЕДИНЕНИЕ
       (ВЫБРАТЬ
           СпрХарактеристики.Ссылка КАК Ссылка,
           СпрХарактеристики.Владелец КАК Владелец
       ИЗ
           Справочник.ХарактеристикиНоменклатуры КАК СпрХарактеристики
       ОБЪЕДИНИТЬ
       ВЫБРАТЬ
           ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка),
           NULL
       )КАК СпрХарактеристики
ПО
   СпрХарактеристики.Владелец = СпрНоменклатура.Ссылка
   ИЛИ СпрХарактеристики.Ссылка = СпрНоменклатура.ХарактеристикаНоменклатуры

) КАК Ном

смело меняй на
(ВЫБРАТЬ
           СпрНоменклатура.Ссылка КАК Номенклатура,
           СпрНоменклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,
           ЕстьNULL(СпрХарактеристики.Ссылка, ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК ХарактеристикаНоменклатуры,
       ИЗ
           Справочник.Номенклатура КАК СпрНоменклатура
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК СпрХарактеристики
   ПО
           СпрНоменклатура.Ссылка = СпрХарактеристики.Владелец
    {ГДЕ СпрНоменклатура.Ссылка.* КАК Номенклатура}) КАК Ном
16 дущ
 
07.12.11
02:35
(12) Нет, это мы должны добавить в РС.ТоварыНаККМ. Там для этого и соединение это, что бы типа в РС не добавлять то, что уже там есть.
(13) А вот с пакетным запросом с индексацией - подумаю. Это действительно может дать результат.
(14)(15) Да там просто этот текст запроса набирается кусками в зависимости от кучи галочек на форме, поэтому и выглядит так странно. Мне кажется, все эти вложенные запросы не сильно на результат влияют.
17 Immortal
 
07.12.11
02:38
наверное, да.
ну и не забыть
ГДЕ
  НЕ СпрНоменклатура.ЭтоГруппа
18 Bober
 
07.12.11
02:39
(16) не сильно, оно и видно в (0) "Естественно при их соединении программа висит часами"
19 Immortal
 
07.12.11
02:40
вложенные-влияют, если клиент-серверный вариант - субд может выбрать неоптимальный план запроса, как работает 1с-овский движок, неизвестно.
20 Bober
 
07.12.11
02:42
а вообще, сколько в спр номенклатура, в спр характеристики и  сколько в КассыККМ.
21 дущ
 
07.12.11
02:49
в КассыККМ 50000 в Номенклатуре тыщ 10, в Характеристиках те же 50
22 Bober
 
07.12.11
10:40
(21) что это за предприятие с 50000 кассами ккм?
23 chingiz
 
07.12.11
10:44
+(22) еще и с файловой базой. По личному опыту - запрос, который еле ворочается на файловой, на скуле выполняется раза в 3 быстрее.
24 dk
 
07.12.11
10:51
обычно разбиваю запрос на блоки и отключаю блоки по очереди пока не найду тормоза
или место тормозов определено 100%?
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой