powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужен быстрый insert во временную таблицу
84 сообщений из 84, показаны все 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
Нужен быстрый insert во временную таблицу
    #40057760
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сомнительно что таблица с 1 полем претендует на реляционную.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057761
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Эта временная таблица нужна для ORM, когда у него получается запрос с большим количеством условий. Например, чтобы не городить гигантский запрос с where xxx in (...), он загоняет эти значения во временную таблицу и джойнит её с таблицей в запросе. На самом деле таких временных таблиц много. Есть временные таблицы для разных типов данных. И их по 10 штук для каждого типа данных на всякий случай.

Размер 256 был выбран хоть и "от балды", но после внимательного просмотра данных, которые могут участвовать в условиях при генерации запросов через ORM.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057835
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
29.03.2021 13:39, ArtDen пишет:
> Эта временная таблица нужна для ORM.

вот он - корень зла!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057838
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen,

Тогда для этой таблицы не хватает одного поля "идентификатор сессии" - для того чтобы можно эту таблицу можно было использовать одновременно для нескольких запросов.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057844
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шавлюк Евгений,

Не совсем понял. Таблица же временная. Заполнили, выполнили запрос, а при коммите она автоматом очистилась. Зачем там ещё "идентификатор сессии"?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057847
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen,

Например один и тот же запрос выполнить в соседних окнах. И затем сравнить
у меня это поле есть id_session (заполняется соответствующим генератором), и для всей "порции данных" он одинаковый
Т.е.
Запрос выглядит следующим образом

Код: sql
1.
2.
select t.* from table t
join xxxx x on x.val = t.val and x.id_session = :id_session


В этом случае можно делать подобный select по нескольким полям, пользуясь единственной таблицей

Код: sql
1.
2.
3.
select t.* from table t
join xxxx x1 on x1.val = t.val1 and x1.id_session = :id_session1
join xxxx x2 on x2.val = t.val2 and x2.id_session = :id_session2
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057856
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шавлюк Евгений,

У меня нету необходимости в "запрос выполнить в соседних окнах. И затем сравнить" ))
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057867
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen
Шавлюк Евгений,

У меня нету необходимости в "запрос выполнить в соседних окнах. И затем сравнить" ))

Давай в топик более полную постановку.

Просто возникает мысль что ты делаешь какой-то антипаттерн.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057870
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
29.03.2021 16:34, mayton пишет:
> Просто возникает мысль что ты делаешь какой-то антипаттерн.

на ORM-е все паттерны анти
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057880
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну почему-же. Для forms-приложений ORM вполне себе подходит. И для тех доменных областей где очень много
описания идет не из бд а из некой третьей системы. В виде DSL.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057889
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДавай в топик более полную постановку.

Ты что, не веришь, что ему надо выбирать из базы 100 тысяч объектов, заданных произвольным
списком, натыканным пользователем вручную?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057913
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

maytonДавай в топик более полную постановку.

Ты что, не веришь, что ему надо выбирать из базы 100 тысяч объектов, заданных произвольным
списком, натыканным пользователем вручную?..

ХЗ. Всяко бывает.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057946
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Давай в топик более полную постановку.
Просто возникает мысль что ты делаешь какой-то антипаттерн.

Я не понимаю какую тебе постановку надо. И этот антипатер я не делаю. Он давно уже сделан и работает.
Есть сервак с 3хзвенкой. На нём крутиться наш сервис. Сервис в качестве СУБД по желанию клиента может использовать разные СУБД, в том числе FB. Чаще всего с FB он и используется. Сервак многофункциональный. В том числе для него есть API, чтобы получать данные.
И данные, получаемые от сервиса, и условия запросов могут быть совершенно произвольными (но в рамках объектов ORM). Например: я хочу получить фамилии работников, которые обрабатывали материл по контролю за разработкой со скважин таких-то месторождений, в период такой-то. Или: выдай мне 3-мерные координаты пересечений пласта АС4 со стволами скважин, список скважин такой-то. Или: нужны результаты интерпретации скважин, в частности пористость, список скважин такой-то, список названий методов исследования такой-то ну и плюс дофига всяких вариантов, которые только можно напридумывать. Основной клиент, который пользуется этим сервисом - ещё одна система, которая у меня в организации и разрабатывается.
Причём ни одно значение в эту базу не вбивается вручную. Все данные попадают туда путём индексирования файлов-результатов работы большого количества работников. Этим индексированием тоже занимается наш сервис, который знает как парсить исходные файлы и как распихивать эту инфу по базе.
Просто недавно выяснилось, что количество параметров условий в запросе может быть очень большим (например при просмотре пользователями карты скважин больших месторождений). Из-за этого и был написан пост.

Так какие у тебя идеи как победить этот "антипатерн"? ))
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057947
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenПросто недавно выяснилось, что количество параметров условий в запросе может быть очень
большим (например при просмотре пользователями карты скважин больших месторождений).

В базе скважины не привязаны к месторождениям что для построения этой карты их приходится
все перечислять вручную?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057948
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Могут быть привязаны, могут быть не привязаны, могут быть привязаны хитрым образом. Всё зависит от того, как это было проиндексировано. Это не особо важно. Важно то, что прога, которая показывает карту (и которая частично для отображения карты использует наш сервис), просто запрашивает данные по куче скважин по их уникальному идентификатору, присвоенному нефтяной компанией. И не обязательно это будут скважины одного месторождения. Вроде как возможен вариант, когда на экране будут скважины с разных месторождений, если они умещаются на экране. Я сам не спец по этим картам, отвечаю только за работу с СУБД, индексирование и сетевой протокол для сервиса.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057951
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenВажно то, что прога, которая показывает карту (и которая частично для отображения карты
использует наш сервис), просто запрашивает данные по куче скважин по их уникальному
идентификатору, присвоенному нефтяной компанией.

Понятно. А перед этим она, надо полагать, запрашивает полный список всех скважин, чтобы
определить видна ли каждая из них в данный момент на экране или нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057960
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen

Так какие у тебя идеи как победить этот "антипатерн"? ))

Есть идея - кластеризовать эти твои наборы. Скорее всего в них есть штук 10 базовых.
И по этим базовым наборам имеет смысл разбить основную таблицу на разделы.
Или фасеты.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057966
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

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

mayton,

Основной таблицы нету. Временная таблица может джойниться с любой таблицей из запроса, генерённого ORM, если по ней есть много условий. Мало того, может быть ситуация, когда используется дофига временных таблиц. Они заполняются и джойняться с разными таблицами из 100-этажного запроса. Тут как повезёт.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057969
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen

mayton,

Основной таблицы нету. Временная таблица может джойниться с любой таблицей из запроса, генерённого ORM, если по ней есть много условий. Мало того, может быть ситуация, когда используется дофига временных таблиц. Они заполняются и джойняться с разными таблицами из 100-этажного запроса. Тут как повезёт.

Смотри. До того как ты построил 100-колёсный велосипед. Я не специалист в Firebird. Я вобщем - больше по Ораклу
и то в прошлом. Но я тебе советую взять на вооружение несколько принципов принципа работы с БД.

Первое - в средне-статистической БД 80% нагрузки приходится на SELECT а не на DML операции.
Исходя из этого (почти Паретто-) принципа нужно концентрировать свои усилия не на задачах CTAS или
загрузок а на том как РАЗЛОЖИТЬ данные на продуктовой БД чтобы выборка была мгновенной. Я не верю что в твоей задаче
именно insert является проблемой. Если он - проблема - то это уже очень-очень плохо. Тоесть плохо стало гораздо раньше.

И второе. Данные - должны быть стационарны настолько это возможно. Не нужно их двигать. Уплотнять.
Переосоздавать. Делать временные таблички. Это все - суета. База любит тишину и постоянство. Я не знаю поддерживает
ли FireBird материализовнные представления. Если есть - попробуй.

В случае с твоими динамическими справочниками - создай их 1 раз в жизни и трекай изменения. Создай базовый
набор (штук 5-10) который покроет все интересы. Я убежден - это можно. Все остальные наборы должны быть просто
комбинациями этих базовых.

И еще. Денормализовывать можно. Если это идет на пользу скорости и это подконтрольно.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057974
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Первое - в средне-статистической БД 80% нагрузки приходится на SELECT а не на DML операции.
Исходя из этого (почти Паретто-) принципа нужно концентрировать свои усилия не на задачах CTAS или
загрузок а на том как РАЗЛОЖИТЬ данные на продуктовой БД чтобы выборка была мгновенной. Я не верю что в твоей задаче
именно insert является проблемой. Если он - проблема - то это уже очень-очень плохо. Тоесть плохо стало гораздо раньше.

С этим я согласен на 146 процентов.

mayton
И второе. Данные - должны быть стационарны настолько это возможно. Не нужно их двигать. Уплотнять.
Переосоздавать. Делать временные таблички.

А вот с этим не согласен. На то они и временные таблицы, чтобы их заполнять данными и извращаться ради того, чтобы получить то, что тебе нужно ))

mayton
В случае с твоими динамическими справочниками - создай их 1 раз в жизни и трекай изменения. Создай базовый
набор (штук 5-10) который покроет все интересы

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

А вот это я совсем не понял. Что за динамические справочники и как они могут помочь.

У тебя дальше после многоточия что идет?

Код: sql
1.
create global temporary table xxxx ...



as select?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057976
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

нет конечно. Firebird такого не поддерживает. У нас GTT это таблица с постоянными метаданными, её не надо каждый раз пересоздавать
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057977
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton, ты лучше суть объясни того, что сказать хотел. А временные таблицы для строк конкретно под FB в моём случае создаются запросами типа

Код: sql
1.
2.
3.
4.
5.
CREATE GLOBAL TEMPORARY TABLE TMP_S_0
(
  VAL Varchar(256) NOT NULL,
  UNIQUE (VAL)
) on commit delete rows;
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057979
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ты насоздавал таблиц TMP_S_0, TMP_S_2 и так далее. И у тебя каждый пользователь захватывает по табличке. Верно?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057980
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Ты ничего не понял. Параллельно в разных транзакциях могут заполняться и использоваться и одни и те же временные таблицы. Например:
1-я транзакция использует TMP_S_0
2-я транзакция использует TMP_S_0, TMP_S_1, TMP_S_2, TMP_S_3, TMP_S_4, TMP_S_5 + временные таблицы для других типов данных
3-я транзакция использует TMP_S_0, TMP_S_1
4-й транзакции повезло, т.к. условий в запросе к сервису мало и все они влезли в текст SQL
5-я ... и т.д.

Вот так-то так. Причём в разных транзакциях джойн одной и той же временной таблицы может происходить с любой из реальных таблиц базы
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057982
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А источник для массового insert? Из базы во временные таблицы? ИЛи с клиента?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057983
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я же всё подробно изложил уже. Несколько раз. С клиента.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057987
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А откуда на клиенте эти строки появились?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40057999
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenВот так-то так. Причём в разных транзакциях джойн одной и той же временной таблицы может
происходить с любой из реальных таблиц базы

Сдаётся мне, что временные таблицы здесь не нужны, а данные можно доставать прямо из
таблиц, формируя условие с IN группами по тысяче штук сразу по мере получения пакета
данных от "другой системы". В конечном итоге это скорее всего выйдет намного быстрее чем
insert+select join.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058002
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Была такая идея. Но есть ещё и ограничение на размер текста SQL. Его легко преодолеть даже группируя по 1000 значений в in.

ЗЫ: Наконец-то дошли руки померить скорость заполнения временной таблицы по сети 100'000-ю значений. Сетка гигабитная. Сервак в том же сегменте что и мой рабочий комп. Вот результаты:

Firebird (блочная вставка по 20): 6.6 секунды на заполнение и практически мгновенное выполнение запроса после
PostgreSQL (COPY + передача бинарного буфера): 1.4 сек на заполнение и 0.7 сек на выполнение запроса после

Данные и там и там абсолютно одинаковые. Правда, Firebird был уже на серваке, но версии 3.0. Я 2.5 не стал ставить. Потестил на том что было.

Чаще всего Firebird стоит на том же серваке, где крутится наша служба. В этом случае FB не только не отстаёт от PG но и даже работает быстрее (время заполнения временной таблицы и выполнения запроса близко к 1.4 сек), что меня устраивает. Всем спасибо кто посоветовал блочную вставку! ))
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058005
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen
Правда, Firebird был уже на серваке, но версии 3.0
WireCompression включено ?
Хотя я не уверен, что на гигабитной сети это будет особо заметно, но попробовать интересно.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058007
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Включил WireCompression. Среднее время заполнения таблицы упало до 6.5 сек. Но сервак стоит на виртуалке. В параллель там много чего крутиться, так что это уменьшение времени в пределах погрешности ))
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058016
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ArtDen
Firebird (блочная вставка по 20): 6.6 секунды на заполнение и практически мгновенное выполнение запроса после
PostgreSQL (COPY + передача бинарного буфера): 1.4 сек на заполнение и 0.7 сек на выполнение запроса после


Немного перехвалил Firebird )) На самом деле запрос после заполнения выполняется не почти мгновенно, а ~0.7 сек, как и у PG.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058023
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen
Включил WireCompression
Для этого нужен клиент и конфиг от 3-ки. И, конечно, zlib1.dll рядом с fbclient.dll. Так и делал ?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058035
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zlib1.dll рядом с fbclient.dll был. Насчёт конфига не понял. На сервере в firebird.conf поставил WireCompression = true и перезапустил службу. Этого не достаточно?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058039
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenНо есть ещё и ограничение на размер текста SQL. Его легко преодолеть даже группируя по
1000 значений в in.

Это ограничение в 10 мегабайт для тройки. Ты уверен, что тысяча значений сумеет его
преодолеть?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058056
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen
zlib1.dll рядом с fbclient.dll был. Насчёт конфига не понял. На сервере в firebird.conf поставил WireCompression = true и перезапустил службу. Этого не достаточно?
Нет, клиенту тоже нужно WireCompression = true.
Проверить статус сжатия можно в мониторинге.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058073
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Пока что у кучи пользователей 2.5 и к сожалению переход на что-то более свежее не предвидится из-за нежелания пользователей ждать бакапа/рестора при обновлении сервиса (( Но есть идея все новые инсталляции делать уже на свежем FB
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058074
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad
ArtDen
zlib1.dll рядом с fbclient.dll был. Насчёт конфига не понял. На сервере в firebird.conf поставил WireCompression = true и перезапустил службу. Этого не достаточно?
Нет, клиенту тоже нужно WireCompression = true.
Проверить статус сжатия можно в мониторинге.


Включил WireCompression = true в firebird.conf на клиенте. В итоге
Error reading data from the connection.

Видимо на сервере слишком старый FB 3.0. Попробую обновить
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058083
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обновил. Заработало. По скорости практически нету разницы. Но трафик уменьшился. Без сжатия - 2043 Кб/164Кб и со сжатием - 366Кб/41Кб (к серверу FB/от сервера FB)
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058087
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Избався от сетевого трафика. Переливай из базы в базу.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058090
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
птичку жалко
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058095
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen,

будет время попробуй на 4.0 Batch API. У меня даже на localhost при массовой заливке получался выигрыш в 2.5-10 раз. Правда с EB не сравнивал.

22080521
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058114
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так какое ограничение на размер всех параметров запроса у FB 2.5? Сейчас для varchar(256) значение XSQLVAR::sqllen получается 1024 байта (256*4). Сколько я таких параметров могу передать за раз?
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058117
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Попробую конечно. Но о 4.0 мне остаётся только мечтать )
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058119
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen,

2.5 - 64K на длину сообщения (параметры) и на длину запроса 64K. 255 контекстов (грубо говоря запросов внутри Execute block).
3.0 - 10M. 255 контекстов.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058127
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Спасибо. Для varchar(256) буду передавать по 60 параметров в блоке. Для всех остальных типов - по 250
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058162
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenПока что у кучи пользователей 2.5 и к сожалению переход на что-то более свежее не предвидится

А до тебя точно дошло, что выбирать все 100000 скважин не обязательно одним запросом и
даже в одном коннекте?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058174
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

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

Как это всё сделать намного лучше - я прекрасно понимаю. Но вопрос был совсем не об этом.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058179
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenЕсли в мой сервис пришёл запрос на получение данных, я должен эти данные получить из базы
и отправить их тому, кто их запрашивал.

Нет, похоже, ты всё-таки тупишь... Объясняю на пальцах:

1. В твой сервис приходит запрос со списком параметров. Длинным списком. Этот список
приходит в виде потока.
2. Ты этот поток параметров парсишь на отдельные значения.
3. Из этих значений ты формируешь запросы, которые посылаешь Firebird. Много запросов.
4. Полученные от сервера данные ты складываешь в ответ тому, откуда в твой сервис поступил
запрос.

Так вот, пункты 2-4 отлично параллелятся на Х параллельных потоков, в каждом из которых
через отдельный коннект выполняются параллельные запросы на выборку У данных.

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

Всё правильно. Но повторюсь. На рабочей системе в продакшене выявилась проблема. Мне надо было отвлечься от своих текущих дел и быстро её решить. И она приемлемо решилась блочной вставкой. Если такое решение не будет удовлетворять конечных пользователей, я отвлекусь от текущих дел ещё раз и подумаю над другими улучшениями.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058194
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenИ она приемлемо решилась блочной вставкой.

Повторю вопрос: почему не блочной выборкой? Это было бы проще.

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

Имеется ввиду что-то типа такого:
Код: sql
1.
execute block (v1 = ?, v2 = ?, v3 = ?, ..., v10 = ?)


?


Как понимаю, вы выбрали вариант с использованием параметров и, наверное, храните препарированный запрос для экономии на Prepare. А не пробовали вставлять строки непосредственно в код запроса и выполнять его с помощью isc_dsql_execute_immediate? Интересно было бы понять, какой из этих способов быстрее.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058198
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Повторю вопрос: почему не блочной выборкой? Это было бы проще.

Хотя нет, дай угадаю: потому что фигню со временными таблицами придумали задолго до тебя,
так?..


Нет. Проще ускорить заполнение временной таблицы потому что для этого не надо лезть в кишки ORM и вообще в логику получения данных из БД. Т.к. надо поддерживать разные СУБД, то проще для них обособить такую простую вещь как заполнение временной таблицы, чем выполнение запросов.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058200
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ggreggory,

Сейчас уже лень такими экспериментами заниматься )
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058202
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenПроще ускорить заполнение временной таблицы потому что для этого не надо лезть в кишки ORM
и вообще в логику получения данных из БД.

А, так ты получаешь данные через ОРМ, а не для ОРМа. Тогда вопросов больше не имею.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058214
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen


Сейчас уже лень такими экспериментами заниматься )


Не пробовали закинуть в сторону сервера с БД файл в формате (external table) и сделать insert from select?

это был самый быстрый способ

PS. файл с данными может быть текстовым.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058237
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor
это был самый быстрый способ
Зато в многопользовательской среде будет весело.
...
Рейтинг: 0 / 0
Нужен быстрый insert во временную таблицу
    #40058241
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky
pastor
это был самый быстрый способ
Зато в многопользовательской среде будет весело.


в очередь, с ны дети, в очередь (с)

делаем пул внешних таблиц по заявленной производительности канала обслуживания.
...
Рейтинг: 0 / 0
84 сообщений из 84, показаны все 4 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужен быстрый insert во временную таблицу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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