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

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

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

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

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

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

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

Код простейший. Но я не уверен, что он о чём-то скажет, т.к. используется своя либа, которая работает с разными СУБД:
Код: 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
27.03.2021, 21:39
    #40057452
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен быстрый insert во временную таблицу
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
27.03.2021, 21:59
    #40057460
ArtDen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен быстрый insert во временную таблицу
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
27.03.2021, 22:12
    #40057461
ArtDen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен быстрый insert во временную таблицу
Или даже проще
Код: 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
27.03.2021, 22:25
    #40057463
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен быстрый insert во временную таблицу
ArtDen,

первый вариант. Второй не пройдёт, чти синтаксис.
...
Рейтинг: 0 / 0
27.03.2021, 23:13
    #40057472
ArtDen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен быстрый insert во временную таблицу
Ускорилось до 1.3 сек. Правда, сервак на моём же компе с клиентом. Думаю, по сети будет помедленнее, но всё равно так гораздо лучше.
...
Рейтинг: 0 / 0
28.03.2021, 09:32
    #40057508
ArtDen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен быстрый insert во временную таблицу
Кстати, какой размер не должны превышать выходные параметры в сумме: 32к или 64к?
...
Рейтинг: 0 / 0
28.03.2021, 11:04
    #40057514
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен быстрый insert во временную таблицу
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
28.03.2021, 11:16
    #40057516
ArtDen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен быстрый insert во временную таблицу
mayton, у меня UTF8. Надо на 4 ещё умножить в случае с FB вроде как. Но это не точно.

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

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

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

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

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

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

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


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