|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Появилась необходимость быстро загонять во временную таблицу (create global temporary table xxxx ...) порядка 100000 записей. Временная таблица состоит из одного столбца varchar(256). На моём компе стандартный вариант через prepare отрабатывает порядка 8 секунд на FB 2.5. Это медленно и надо ускорить хотя бы до одной секунды. Как это можно сделать? Могу перейти на более свежий вариант сервера, если вдруг там будет такая возможность. PS: У PostgreSQL для этих целей есть команда "COPY" и API для быстрой заливки данных одним куском (PQputCopyData, PQputCopyEnd). Для тех же самых данных этот вариант отрабатывает около секунды. Есть ли что-нибудь подобное для Firebird? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 19:04 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDenКак это можно сделать? Если источник данных на клиенте - переход на 3.0 и Batch API или на 4.0 и Replicator API. Если источник данных на сервере - можно побаловаться с External Table или UDF/R. Можно также побаловаться с заливкой в BLOB с последующим его парсингом на сервера. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 19:13 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Данные на клиенте. Думаю поковырять Batch API. Правда, везде пишут, что это фича FB4.0, а не 3. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 19:33 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen На моём компе стандартный вариант через prepare отрабатывает порядка 8 секунд на FB 2.5. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 19:45 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамПо одной записи инсертишь или пачками? 12 тысяч записей в секунду кривым кодом не получить. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 19:47 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
А, ему 100К в секунду надо... По сети без предварительного копирования - никак, ИМХО. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 19:57 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen, execute block пачками, для начала по 10-20 шт gbak с какой скоростью ресторит подобную таблицу ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 20:23 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen Данные на клиенте. Думаю поковырять Batch API. Правда, везде пишут, что это фича FB4.0, а не 3. Если клиент на Delphi, можно поэкспериментировать с FireDAC Array DML + многопоток. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 20:42 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
От многопотока смысл будет, только если по коннекту на поток. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 20:53 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
От многопотока смысл будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 20:58 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам Ты код-то покажи. По одной записи инсертишь или пачками? Код простейший. Но я не уверен, что он о чём-то скажет, т.к. используется своя либа, которая работает с разными СУБД: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 21:27 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 21:39 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
hvlad ArtDen, execute block пачками, для начала по 10-20 шт Имеется ввиду что-то типа такого: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 21:59 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Или даже проще Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Я правильно понял идею? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 22:12 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen, первый вариант. Второй не пройдёт, чти синтаксис. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 22:25 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Ускорилось до 1.3 сек. Правда, сервак на моём же компе с клиентом. Думаю, по сети будет помедленнее, но всё равно так гораздо лучше. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2021, 23:13 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Кстати, какой размер не должны превышать выходные параметры в сумме: 32к или 64к? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2021, 09:32 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
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, могу предположить что данные приходят с клиента. Может и хватит возможностей клиента чтобы их на клиенте и обработать? Просто сама по себе постановка с играми с временной таблицей говорит о том что возможно сама по себе таблица в базе и не нужна. А раз не нужна то можно попробовать ее обработать на другом уровне. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2021, 11:04 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
mayton, у меня UTF8. Надо на 4 ещё умножить в случае с FB вроде как. Но это не точно. PS: для PG на каждое строковое значение varchar(256) в случае с командой COPY на сервер с клиента уходит количество байт, равное длине реальной строки в кодировке UTF8 (+ 4 байта длины, но это не критично). А для для FB на каждое строковое значение varchar(256) уходит 256 x 4 = 1024 байта. Я правильно понимаю? PPS: не совсем понятно что значит "попробовать ее обработать на другом уровне" ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2021, 11:16 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen mayton, у меня UTF8. Надо на 4 ещё умножить в случае с FB вроде как. Но это не точно. Для кириллицы UTF-8 символ занимает обычно 2 байта. PPS: не совсем понятно что значит "попробовать ее обработать на другом уровне" Если ты не программист - то просто игнорируй мой предыдущий комментарий. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2021, 12:51 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen> Ускорилось до 1.3 сек. Правда, сервак на моём же компе с клиентом. ArtDen> Думаю, по сети будет помедленнее, но всё равно так гораздо лучше. Дек проверь, заодно и нам сообщишь. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2021, 16:55 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Всему своё время. Проверю ) И заодно сравню трафик к серверу у FB и PG при заполнении временной таблицы одними и теми же данными. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2021, 18:24 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
По скорости посмотреть не получается, т.к. пока некуда FB поставить. А вот что по трафику при заполнении временной таблицы 100'000 значениями: Firebird 2.5 (запись блоками по 20): трафик к серверу - 5.5Мб, трафик от сервера - 3.3Мб PostgreSQL (команда COPY, передача бинарного буфера) трафик к серверу - 1Мб, трафик от сервера - несколько килобайт FB показал себя намного лучше в плане трафика чем я ожидал. Видимо при передаче на сервер применяется какое-то сжатие для varchar. Скоро найду свободный сервак для FB и потестю скорость ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 13:19 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
PS: Кстати, откуда у FB берётся трафик от сервера в этом случае? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 13:20 |
|
|
start [/forum/topic.php?fid=40&fpage=7&tid=1560072]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
159ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 282ms |
0 / 0 |