|
Помогите с запросом | ☑ | ||
---|---|---|---|---|
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 получается. Отрабатывает приемлимо - менее минуты. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |