Имя: Пароль:
1C
1С v8
Помогите с запросом
0 ivant
 
27.01.16
10:26
День добрый.
Есть у меня две таблицы, по 50т записей примерно.
Структура, у обеих таблиц такая:

Номенклатура, наименование номенклатуры, Слово из наименование

Задача найти в двух таблицах максимальное количество совпадений по словам.

Вот мой запрос. Когда записей в исходной таблице мало, то отрабатывает моментом. А когда 50к, то можно ждать часами..

ВЫБРАТЬ
    МассивНоменклатуры.Номенклатура КАК Номенклатура,
    МассивНоменклатуры.Характеристика КАК Характеристика,
    ВЫРАЗИТЬ(МассивНоменклатуры.Слово КАК СТРОКА(30)) КАК Слово,
    МассивНоменклатуры.Наименование КАК Наименование
ПОМЕСТИТЬ втМассивНоменклатуры
ИЗ
    &МассивНоменклатуры КАК МассивНоменклатуры

ИНДЕКСИРОВАТЬ ПО
    Слово
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МассивНоменклатурыПоставщиков.НоменклатураПоставщика КАК НоменклатураПоставщика,
    МассивНоменклатурыПоставщиков.ХарактеристикаПоставщика КАК ХарактеристикаПоставщика,
    ВЫРАЗИТЬ(МассивНоменклатурыПоставщиков.Слово КАК СТРОКА(30)) КАК Слово,
    МассивНоменклатурыПоставщиков.НаименованиеПоставщика
ПОМЕСТИТЬ втМассивНоменклатурыПоставщиков
ИЗ
    &МассивНоменклатурыПоставщиков КАК МассивНоменклатурыПоставщиков

ИНДЕКСИРОВАТЬ ПО
    Слово
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втСопоставленнаяНоменклатура.НоменклатураХарактеристика КАК НоменклатураХарактеристика,
    втСопоставленнаяНоменклатура.НоменклатураХарактеристикаПоставщика КАК НоменклатураХарактеристикаПоставщика,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ втСопоставленнаяНоменклатура.Слово) КАК КоличествоСовпадений,
    ВЫРАЗИТЬ(втСопоставленнаяНоменклатура.НоменклатураПоставщика КАК СТРОКА(100)) КАК НоменклатураПоставщика,
    ВЫРАЗИТЬ(втСопоставленнаяНоменклатура.ХарактеристикаПоставщика КАК СТРОКА(100)) КАК ХарактеристикаПоставщика,
    втСопоставленнаяНоменклатура.Номенклатура,
    втСопоставленнаяНоменклатура.Характеристика
ПОМЕСТИТЬ втИтоговаяТаблица
ИЗ
    втСопоставленнаяНоменклатура КАК втСопоставленнаяНоменклатура

СГРУППИРОВАТЬ ПО
    втСопоставленнаяНоменклатура.НоменклатураХарактеристика,
    втСопоставленнаяНоменклатура.НоменклатураХарактеристикаПоставщика,
    втСопоставленнаяНоменклатура.Номенклатура,
    втСопоставленнаяНоменклатура.НоменклатураПоставщика,
    втСопоставленнаяНоменклатура.Характеристика,
    втСопоставленнаяНоменклатура.ХарактеристикаПоставщика
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втИтоговаяТаблица.НоменклатураХарактеристика,
    втИтоговаяТаблица.НоменклатураХарактеристикаПоставщика,
    втИтоговаяТаблица.КоличествоСовпадений КАК КоличествоСовпадений,
    втИтоговаяТаблица.НоменклатураПоставщика,
    втИтоговаяТаблица.ХарактеристикаПоставщика,
    втИтоговаяТаблица.Номенклатура,
    втИтоговаяТаблица.Характеристика
ИЗ
    втИтоговаяТаблица КАК втИтоговаяТаблица

УПОРЯДОЧИТЬ ПО
    КоличествоСовпадений УБЫВ
1 ivant
 
27.01.16
10:27
Как можно оптимизировать?
2 Господин ПЖ
 
27.01.16
10:30
последнюю таблицу можно выкинуть...

предпоследнюю тоже
3 asady
 
27.01.16
10:31
(0) скорее всего самое долгое это процесс считывания данных в запросе типа "&МассивНоменклатурыПоставщиков"

если это так то оптимизировать запрос только после оптимизации хранения инфы
4 vicof
 
27.01.16
10:31
Непонятно, сколько времени данные в &МассивНоменклатуры помещаются
5 Godofsin
 
27.01.16
10:33
И почему левое соединение, а не внутреннее
6 ivant
 
27.01.16
10:34
(2) в предпоследней доп. условие было - это я его временно упростил.
7 НЕА123
 
27.01.16
10:41
(0)
много строковых ненужных полей.
8 ivant
 
27.01.16
10:41
(3) дело в том, что я передаю две таблицы - &МассивНоменклатуры и &МассивНоменклатурыПоставщиков
Так вот, если таблица &МассивНоменклатуры небольшая, а &МассивНоменклатурыПоставщиков по прежнему 50т записей, то отрабатывает за секунды.
9 vicof
 
27.01.16
10:42
(8) Потому что скл выбирает нестед лупс в том и другом случае, что на больших объемах данных чревато тормозами.
10 ivant
 
27.01.16
10:43
(5) кстати, да. можно внутреннее
11 ivant
 
27.01.16
10:43
(9) я не очень силен в скл - это можно как-то оптимизировать?
12 patria0muerte
 
27.01.16
10:48
Сделай замер, на какой таблице именно тормозит.

Может завести МенеджерВТ, распилить текст запроса на куски и померить, что именно долго выполняется, помещение таблиц в ВТ или джоин по строке. Или еще что. И конкретную таблицу уже смотреть
13 ivant
 
27.01.16
10:50
(12) о, попробую
14 НЕА123
 
27.01.16
10:53
(0)
почти ОФФ.
может без запроса, в цикле...
15 patria0muerte
 
27.01.16
10:54
(13) Но вообще, с учетом (5) + (8) - понятно, что дело в втСопоставленнаяНоменклатура
16 ivant
 
27.01.16
11:01
(14) таки я думал, что запросом быстрее...
17 НЕА123
 
27.01.16
11:10
(16)
это большой филосовский вопрос.

исходя из (7), я бы запросом получал только номера нужных мне строк ТЗ.
18 НЕА123
 
27.01.16
11:10
* философский
19 Ildarovich
 
27.01.16
13:49
Проблема не технологическая, а алгоритмическая. Насколько я понял, в первом массиве сделан разворот по всем словам, которые есть в названии номенклатуры организации, а во втором - по всем словам, которые есть в номенклатуре поставщика. И делается соединение по словам. Если есть "низко-селективное" слово, которое встречается, например, почти в каждой номенклатуре, то результат будет фактически декартовым произведением двух таблиц. От этого и большие затраты времени. Нужно менять не запрос, а алгоритм сопоставления. Этот годится, только для случая, когда одно из таблиц мала.
20 ivant
 
28.01.16
08:14
в итоге запрос вываливается с "недостаточно памяти"
Пока решил делать порциями по 100 записей номенклатуры (с разбивкой по словам 500-1000 получается.
Отрабатывает приемлимо - менее минуты.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший