• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

8.2 Менеджер Временных Таблиц

  • Автор темы tanat
  • Дата начала
T

tanat

Легенда:
гружу данные из экселевского файлика, где по трем страницам разбросаны данные. Во всех трех таблицах есть поле "контрагент", по которому их можно объединить.
С чтением данных проблем нет. Все отлично читается. А вот "склеить" эти три таблицы - геморрой.
Делаю через менеджер временных таблиц, положившись на суждение, что через него будет быстрее, чем через перебор строк таблиц.
Делаю через левое соединение по полю "Контрагент". Все поля в таблице - строковые. Колонки таблиц типизированы: Строка с длиной 1024 символа.

Запрос выглядит примерно так:
//1ая таблица
ЗАпрос = Новый ЗАпрос;
ЗАпрос.ТЕкст ="Выбрать Таблица.* Поместить ТаблицаКонтрагентов из &Таблица как Таблица";
Запрос.УстановитьПараметр("Таблица",ТАблица);
ЗАпрос.Выполнить;

//Выполняется, не виснет. Дальше вторая и третья таблица

ЗАпрос.ТЕкст ="Выбрать Таблица2.* Поместить ТаблицаЗаметок из &Таблица2 как Таблица2";
Запрос.УстановитьПараметр("Таблица",ТАблица);
ЗАпрос.Выполнить;

ЗАпрос.ТЕкст ="Выбрать Таблица3.* Поместить ТаблицаСобытий из &Таблица3 как Таблица3";
Запрос.УстановитьПараметр("Таблица",ТАблица);
ЗАпрос.Выполнить;
// тоже все хорошо выполнилось. теперь основной зарпос

Запрос.Текст = "Выбрать ТАблицаКонтрагентов.*,
| ТаблицаЗаметок.Заметки как заметки,
|ТаблицаСобытий.События как события
| Из
| ТабилцаКонтрагентов
| Левое Соединение ТАблицаЗАметок как таблицаЗАметок По ТАблицаКонтрагентов.Контрагент = ТАблицаЗАметок.Контрагент
| ЛЕвое соединение ТАблицаСобытий как таблицаСобытий по ТАблицаКонтрагентов.Контрагент = ТАблицаСобытий.Контрагент";

РЕзультат = ЗАпрос.Выполнить().Выгрузить();
//И вот тут все виснет к е..еням собачим. Причем на тестовом примере с 250 записями все хорошо работает. а на 10 тыс записях в каждой таблице все виснет.

Есть у кого какие соображения? Почему никаких признаков жизни этот зверь не подает?
 
P

puh14

"| ТабилцаКонтрагентов" - Очепятка?

я так умаю что на выходе будет поболе 100000 тыс строк - может нпоролись на ограничение рекордсета.

попробуйте исключить таблицу заметок или событий - интересно понять запашет ли...
 
T

tanat

"| ТабилцаКонтрагентов" - Очепятка?

Она самая, писал по памяти в рабочем угаре. в Коде ошибок нет. проверял.

На выходе должно получиться не более 10 тыс строк. Т.к. в каждой таблице - 9730 с одинаковыми значениями в колонке "Контрагент". Как я понимаю, левым джоином получим таблицу 1 с доп. колонками "заметки" и "события".

Попробую исключить, обязательно отпишусь о результатах.

Но на данный момент я крайне разочарован в этом механизме(. Жалкие 3 таблицы с 10 тыс. строк в каждой не можем обработать ((.

Да, уточню: это клиент-сервер. Управляемое приложение. Процедура "склейки" - выполняется на сервере.

Кстати, вопрос не по теме: я, когда считываю данные из файла, потом закрываю эксель через .Application.Quit();
И у меня вылазит сообщение экселя: бла бла бла файл изменен. желаете сохранить? Как от этого избавиться? В файле кодом ничего не меняю, не понимаю даже, откуда эти изменения берутся....
 
P

puh14

Файл.ActiveWorkbook.Close() - где Файл = Новый ComОбъект("Excel.Application");

Кстати - какая максимальная длина текстового поля в вашей версии скуля? на 2000 было 254 символа, а у вас 1024
 
Д

Дайнеко

Кстати, вопрос не по теме: я, когда считываю данные из файла, потом закрываю эксель через .Application.Quit();
И у меня вылазит сообщение экселя: бла бла бла файл изменен. желаете сохранить? Как от этого избавиться? В файле кодом ничего не меняю, не понимаю даже, откуда эти изменения берутся....

Это может быть, когда файл:
- созданный в старой версии открывается в новой.
- в файле есть формулы, его модифицирующие. Например Текущая дата (названия не помню)
Короче, все это видно при обычном открытии.
 
D

Darlock

"Например Текущая дата (названия не помню)"

Функция - "СЕГОДНЯ()".

А по сабжу.... вопрос 1: зачем менеджр временных таблиц нужен, если вы можете использовать пакеты запросов и шустрее и память не жрет на хранение вирт.таблицы.
И второй момент... думаю у вас все виснет когда для каждой строки из таблицы 1 происходит левое соединение с таблице 2. Насколько понял контрагент у вас один и тот же. а дальще считайте сами 9730 * 9730... сколько?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!