Имя: Пароль:
1C
1С v8
Оптимизация запроса
0 r1000
 
28.06.16
17:49
В таблице на форме 60000 строк. 27 колонок. все строки.
Задача найти строки по вхождению строки и отфильтровать соответственно.
Есть ли возможность оптимизировать запрос ?

ВЫБРАТЬ
    ВЫРАЗИТЬ(Таблица.Колонка1 КАК СТРОКА(100)) КАК Колонка1,
    ВЫРАЗИТЬ(Таблица.Колонка2 КАК СТРОКА(100)) КАК Колонка2,
    ВЫРАЗИТЬ(Таблица.Колонка3 КАК СТРОКА(100)) КАК Колонка3,
    ВЫРАЗИТЬ(Таблица.Колонка4 КАК СТРОКА(100)) КАК Колонка4,
    ВЫРАЗИТЬ(Таблица.Колонка5 КАК СТРОКА(100)) КАК Колонка5,
    ВЫРАЗИТЬ(Таблица.Колонка6 КАК СТРОКА(100)) КАК Колонка6,
    ВЫРАЗИТЬ(Таблица.Колонка7 КАК СТРОКА(100)) КАК Колонка7,
    ВЫРАЗИТЬ(Таблица.Колонка8 КАК СТРОКА(100)) КАК Колонка8,
    ВЫРАЗИТЬ(Таблица.Колонка9 КАК СТРОКА(100)) КАК Колонка9,
    ВЫРАЗИТЬ(Таблица.Колонка10 КАК СТРОКА(100)) КАК Колонка10,
    ВЫРАЗИТЬ(Таблица.Колонка11 КАК СТРОКА(100)) КАК Колонка11,
    ВЫРАЗИТЬ(Таблица.Колонка12 КАК СТРОКА(100)) КАК Колонка12,
    ВЫРАЗИТЬ(Таблица.Колонка13 КАК СТРОКА(100)) КАК Колонка13,
    ВЫРАЗИТЬ(Таблица.Колонка14 КАК СТРОКА(100)) КАК Колонка14,
    ВЫРАЗИТЬ(Таблица.Колонка15 КАК СТРОКА(100)) КАК Колонка15,
    ВЫРАЗИТЬ(Таблица.Колонка16 КАК СТРОКА(100)) КАК Колонка16,
    ВЫРАЗИТЬ(Таблица.Колонка17 КАК СТРОКА(100)) КАК Колонка17,
    ВЫРАЗИТЬ(Таблица.Колонка18 КАК СТРОКА(100)) КАК Колонка18,
    ВЫРАЗИТЬ(Таблица.Колонка19 КАК СТРОКА(100)) КАК Колонка19,
    ВЫРАЗИТЬ(Таблица.Колонка20 КАК СТРОКА(100)) КАК Колонка20,
    ВЫРАЗИТЬ(Таблица.Колонка21 КАК СТРОКА(100)) КАК Колонка21,
    ВЫРАЗИТЬ(Таблица.Колонка22 КАК СТРОКА(100)) КАК Колонка22,
    ВЫРАЗИТЬ(Таблица.Колонка23 КАК СТРОКА(100)) КАК Колонка23,
    ВЫРАЗИТЬ(Таблица.Колонка24 КАК СТРОКА(100)) КАК Колонка24,
    ВЫРАЗИТЬ(Таблица.Колонка25 КАК СТРОКА(100)) КАК Колонка25,
    ВЫРАЗИТЬ(Таблица.Колонка26 КАК СТРОКА(100)) КАК Колонка26,
    ВЫРАЗИТЬ(Таблица.Колонка27 КАК СТРОКА(100)) КАК Колонка27
ПОМЕСТИТЬ ВремТаб
ИЗ
    &ТаблицаСтрок КАК Таблица
;
////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
ВремТаб.Колонка1,
ВремТаб.Колонка2,
ВремТаб.Колонка3,
ВремТаб.Колонка4,
ВремТаб.Колонка5,
ВремТаб.Колонка6,
ВремТаб.Колонка7,
ВремТаб.Колонка8,
ВремТаб.Колонка9,
ВремТаб.Колонка10,
ВремТаб.Колонка11,
ВремТаб.Колонка12,
ВремТаб.Колонка13,
ВремТаб.Колонка14,
ВремТаб.Колонка15,
ВремТаб.Колонка16,
ВремТаб.Колонка17,
ВремТаб.Колонка18,
ВремТаб.Колонка19,
ВремТаб.Колонка20,
ВремТаб.Колонка21,
ВремТаб.Колонка22,
ВремТаб.Колонка23,
ВремТаб.Колонка24,
ВремТаб.Колонка25,
ВремТаб.Колонка26,
ВремТаб.Колонка27
ИЗ
    ВремТаб КАК ВремТаб
ГДЕ
    ВремТаб.Колонка1 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка2 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка3 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка4 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка5 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка6 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка7 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка8 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка9 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка10 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка11 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка12 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка13 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка14 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка15 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка16 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка17 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка18 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка19 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка20 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка21 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка22 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка23 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка24 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка25 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка26 ПОДОБНО &СтрокаПоиска
ИЛИ ВремТаб.Колонка27 ПОДОБНО &СтрокаПоиска

Далее выполняется такой код (чтобы в таблице оставить найденные строки).

    Результат = Запрос.Выполнить().Выгрузить();
    
    ЭлементыФормы.ТаблицаДанных.Значение.Очистить();
    
    ЭлементыФормы.ТаблицаДанных.Значение = Результат;
    //ЭлементыФормы.ТаблицаДанных.СоздатьКолонки();    
    Для Каждого Кл Из Результат.Колонки Цикл
        ТаблицаДанных.ЗагрузитьКолонку(Результат.ВыгрузитьКолонку(Кл.Имя), Кл.Имя);
    КонецЦикла;

Как можно оптимизировать сам запрос, а так же наложение фильтра ?
1 Джинн
 
28.06.16
17:55
(0) Задача бредовая с момента постановки. Человек не в состоянии объять 60 тыс. строк и 27 колонок своим вниманием. Такие формы на помойку сразу выбрасывать.
2 Ёпрст
 
28.06.16
17:55
>>>Далее выполняется такой код (чтобы в таблице оставить найденные строки).
3 Ёпрст
 
28.06.16
17:55
это всё выкинуть.
4 Ёпрст
 
28.06.16
17:56
Достаточно из запроса получать номера оставляемых строк
5 Ёпрст
 
28.06.16
17:56
и далее, тупо либо отбор либо копирование этих строк.
6 r1000
 
28.06.16
17:59
(5)ну а сам запрос нормальный ?
7 Euguln
 
28.06.16
18:01
Сделать 28-ую колонку конкатенацией предыдущих и искать в ней.
8 r1000
 
28.06.16
18:06
по замеру производительности 35% времени уходит именно на запрос. сам процесс накладывания фильтр проходит быстро.
9 H A D G E H O G s
 
28.06.16
18:17
никак не оптимизиуешь.
10 r1000
 
28.06.16
18:20
(1) в том то и дело, чтобы не человек пытался объять, а по вхождению найти нужную строку и дальше уже обработать её
11 ViSo76
 
28.06.16
18:22
Если данные одинаковые то в колонках можно ссылки на справочник/и кинуть и в начале like по справочнику и потом фильтр по полям
12 r1000
 
28.06.16
18:22
Таблица на форме заполняется выгрузкой из эксель.
Может быть сам эксель поднимать и уже средствами экселя искать нужные строки ?
13 r1000
 
28.06.16
18:23
(11)все ячейки таблицы текстовые. вся эта таблица грузиться из эксель. вот так:

    Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
    Скрипт.language = "javascript";
    
    ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
    Эксель = ПолучитьCOMОбъект(ПутьКФайлуФорма);
    ЛистЭксель = Эксель.WorkSheets(1);
    ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
    ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column;
        
    ТЗ = Новый ТаблицаЗначений;
    Для Счетчик = 1 По ВсегоКолонок Цикл
        ТЗ.Колонки.Добавить("Колонка"+Счетчик);
    КонецЦикла;
    
    Для Счетчик = 1 По ВсегоСтрок Цикл
        НоваяСтрока = ТЗ.Добавить();
    КонецЦикла;
    
    Область = ЛистЭксель.Range(ЛистЭксель.Cells(1,1), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
    Данные = Область.Value.Выгрузить();
    
    Для Счетчик = 0 По ВсегоКолонок-1 Цикл
        ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
    КонецЦикла;
    ЛистЭксель = Неопределено;
    Эксель = Неопределено;
14 Euguln
 
28.06.16
18:23
(12) А при заполнении искать не получается?
15 ViSo76
 
28.06.16
18:23
Если данные произвольные то тогда конкатенация всех колонок с разделителем к примеру # и потом 1 like.
16 ViSo76
 
28.06.16
18:25
(15) Правда нужно знать номера строк, чтобы фильтрануть
17 ViSo76
 
28.06.16
18:26
(15) Хотя навряд ли поможет. Если данные повторяющиеся то при загрузке можно справочник составлять, а в колонки только ссылки. Это ускорит.
18 r1000
 
28.06.16
18:29
(14)а непонятно что искать пока не загрузим. и поиск может повторяться, поэтому все же нужно загрузить... визуализировать таблицу.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn