powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужен быстрый insert во временную таблицу
25 сообщений из 84, страница 1 из 4
Нужен быстрый insert во временную таблицу
    #40057418
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Появилась необходимость быстро загонять во временную таблицу (create global temporary table xxxx ...) порядка 100000 записей. Временная таблица состоит из одного столбца varchar(256). На моём компе стандартный вариант через prepare отрабатывает порядка 8 секунд на FB 2.5. Это медленно и надо ускорить хотя бы до одной секунды. Как это можно сделать? Могу перейти на более свежий вариант сервера, если вдруг там будет такая возможность.

PS: У PostgreSQL для этих целей есть команда "COPY" и API для быстрой заливки данных одним куском (PQputCopyData, PQputCopyEnd). Для тех же самых данных этот вариант отрабатывает около секунды. Есть ли что-нибудь подобное для Firebird?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057419
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenКак это можно сделать?

Если источник данных на клиенте - переход на 3.0 и Batch API или на 4.0 и Replicator API.
Если источник данных на сервере - можно побаловаться с External Table или UDF/R.
Можно также побаловаться с заливкой в BLOB с последующим его парсингом на сервера.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057423
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Данные на клиенте. Думаю поковырять Batch API. Правда, везде пишут, что это фича FB4.0, а не 3.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057426
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen
На моём компе стандартный вариант через prepare отрабатывает порядка 8 секунд на FB 2.5.
Ты код-то покажи. По одной записи инсертишь или пачками?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057427
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамПо одной записи инсертишь или пачками?

12 тысяч записей в секунду кривым кодом не получить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057431
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ему 100К в секунду надо...
По сети без предварительного
копирования - никак, ИМХО.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057436
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen,

execute block пачками, для начала по 10-20 шт

gbak с какой скоростью ресторит подобную таблицу ?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057439
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen
Данные на клиенте. Думаю поковырять Batch API. Правда, везде пишут, что это фича FB4.0, а не 3.

Если клиент на Delphi, можно поэкспериментировать с FireDAC Array DML + многопоток.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057443
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От многопотока смысл будет, только если по коннекту на поток.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057445
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От многопотока смысл будет.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057449
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустам
Ты код-то покажи. По одной записи инсертишь или пачками?

Код простейший. Но я не уверен, что он о чём-то скажет, т.к. используется своя либа, которая работает с разными СУБД:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void fill_tmp_string_table(dblib::Statement &st, const filter::AttrGroup &attr_group)
{
	st.prepare("insert into " + attr_group.table_name + "(val) values(?1)");
	for (auto &value : attr_group.values)
	{
		st.set_str(1, value);
		st.execute();
	}
}
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057452
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen> Код простейший. Но я не уверен, что он о чём-то скажет,
ArtDen> st.prepare("insert into " + attr_group.table_name + "(val) values(?1)");
ArtDen> for (auto &value : attr_group.values)
ArtDen> {
ArtDen> st.set_str(1, value);
ArtDen> st.execute();

Он скажет, что это построчная вставка, а не поблочная.
Собсно, как уже говорилось выше - вставляй пачками.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057460
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad
ArtDen,

execute block пачками, для начала по 10-20 шт


Имеется ввиду что-то типа такого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
execute block (v1 = ?, v2 = ?, v3 = ?, ..., v10 = ?)
as
begin
    insert into xxxx(val) values (v1);
    insert into xxxx(val) values (v2);
    insert into xxxx(val) values (v3);
    ...
    insert into xxxx(val) values (v10);
end


?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057461
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или даже проще
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
execute block
as
begin
    insert into xxxx(val) values (?);
    insert into xxxx(val) values (?);
    insert into xxxx(val) values (?);
    ...
    insert into xxxx(val) values (?);
end



Я правильно понял идею?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057463
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen,

первый вариант. Второй не пройдёт, чти синтаксис.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057472
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ускорилось до 1.3 сек. Правда, сервак на моём же компе с клиентом. Думаю, по сети будет помедленнее, но всё равно так гораздо лучше.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057508
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, какой размер не должны превышать выходные параметры в сумме: 32к или 64к?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057514
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen
Появилась необходимость быстро загонять во временную таблицу (create global temporary table xxxx ...) порядка 100000 записей. Временная таблица состоит из одного столбца varchar(256). На моём компе стандартный вариант через prepare отрабатывает порядка 8 секунд на FB 2.5. Это медленно и надо ускорить хотя бы до одной секунды. Как это можно сделать? Могу перейти на более свежий вариант сервера, если вдруг там будет такая возможность.

PS: У PostgreSQL для этих целей есть команда "COPY" и API для быстрой заливки данных одним куском (PQputCopyData, PQputCopyEnd). Для тех же самых данных этот вариант отрабатывает около секунды. Есть ли что-нибудь подобное для Firebird?

100 000 записей по 256 символов - это 25 600 000 ~ 25 мегабайт информации.
Учитывая игры с COPY, могу предположить что данные приходят с клиента.
Может и хватит возможностей клиента чтобы их на клиенте и обработать?
Просто сама по себе постановка с играми с временной таблицей говорит
о том что возможно сама по себе таблица в базе и не нужна. А раз не нужна
то можно попробовать ее обработать на другом уровне.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057516
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton, у меня UTF8. Надо на 4 ещё умножить в случае с FB вроде как. Но это не точно.

PS: для PG на каждое строковое значение varchar(256) в случае с командой COPY на сервер с клиента уходит количество байт, равное длине реальной строки в кодировке UTF8 (+ 4 байта длины, но это не критично). А для для FB на каждое строковое значение varchar(256) уходит 256 x 4 = 1024 байта. Я правильно понимаю?

PPS: не совсем понятно что значит "попробовать ее обработать на другом уровне"
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057525
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen
mayton, у меня UTF8. Надо на 4 ещё умножить в случае с FB вроде как. Но это не точно.

Для кириллицы UTF-8 символ занимает обычно 2 байта.

PPS: не совсем понятно что значит "попробовать ее обработать на другом уровне"
Если ты не программист - то просто игнорируй мой предыдущий комментарий.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057558
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen> Ускорилось до 1.3 сек. Правда, сервак на моём же компе с клиентом.
ArtDen> Думаю, по сети будет помедленнее, но всё равно так гораздо лучше.

Дек проверь, заодно и нам сообщишь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057573
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всему своё время. Проверю ) И заодно сравню трафик к серверу у FB и PG при заполнении временной таблицы одними и теми же данными.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057748
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По скорости посмотреть не получается, т.к. пока некуда FB поставить. А вот что по трафику при заполнении временной таблицы 100'000 значениями:
Firebird 2.5 (запись блоками по 20): трафик к серверу - 5.5Мб, трафик от сервера - 3.3Мб
PostgreSQL (команда COPY, передача бинарного буфера) трафик к серверу - 1Мб, трафик от сервера - несколько килобайт

FB показал себя намного лучше в плане трафика чем я ожидал. Видимо при передаче на сервер применяется какое-то сжатие для varchar.

Скоро найду свободный сервак для FB и потестю скорость
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057750
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PS: Кстати, откуда у FB берётся трафик от сервера в этом случае?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057753
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выглядит так, будто поле на 256 символов это большой перелёт...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 84, страница 1 из 4
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужен быстрый insert во временную таблицу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]