|
Нужен быстрый 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 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Выглядит так, будто поле на 256 символов это большой перелёт... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 13:25 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Сомнительно что таблица с 1 полем претендует на реляционную. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 13:39 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Эта временная таблица нужна для ORM, когда у него получается запрос с большим количеством условий. Например, чтобы не городить гигантский запрос с where xxx in (...), он загоняет эти значения во временную таблицу и джойнит её с таблицей в запросе. На самом деле таких временных таблиц много. Есть временные таблицы для разных типов данных. И их по 10 штук для каждого типа данных на всякий случай. Размер 256 был выбран хоть и "от балды", но после внимательного просмотра данных, которые могут участвовать в условиях при генерации запросов через ORM. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 13:39 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
29.03.2021 13:39, ArtDen пишет: > Эта временная таблица нужна для ORM. вот он - корень зла! Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 15:36 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen, Тогда для этой таблицы не хватает одного поля "идентификатор сессии" - для того чтобы можно эту таблицу можно было использовать одновременно для нескольких запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 15:38 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Шавлюк Евгений, Не совсем понял. Таблица же временная. Заполнили, выполнили запрос, а при коммите она автоматом очистилась. Зачем там ещё "идентификатор сессии"? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 15:46 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen, Например один и тот же запрос выполнить в соседних окнах. И затем сравнить у меня это поле есть id_session (заполняется соответствующим генератором), и для всей "порции данных" он одинаковый Т.е. Запрос выглядит следующим образом Код: sql 1. 2.
В этом случае можно делать подобный select по нескольким полям, пользуясь единственной таблицей Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 15:50 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Шавлюк Евгений, У меня нету необходимости в "запрос выполнить в соседних окнах. И затем сравнить" )) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 15:59 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen Шавлюк Евгений, У меня нету необходимости в "запрос выполнить в соседних окнах. И затем сравнить" )) Давай в топик более полную постановку. Просто возникает мысль что ты делаешь какой-то антипаттерн. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 16:34 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
29.03.2021 16:34, mayton пишет: > Просто возникает мысль что ты делаешь какой-то антипаттерн. на ORM-е все паттерны анти Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 16:41 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Ну почему-же. Для forms-приложений ORM вполне себе подходит. И для тех доменных областей где очень много описания идет не из бд а из некой третьей системы. В виде DSL. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 16:55 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
maytonДавай в топик более полную постановку. Ты что, не веришь, что ему надо выбирать из базы 100 тысяч объектов, заданных произвольным списком, натыканным пользователем вручную?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 17:14 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov maytonДавай в топик более полную постановку. Ты что, не веришь, что ему надо выбирать из базы 100 тысяч объектов, заданных произвольным списком, натыканным пользователем вручную?.. ХЗ. Всяко бывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 17:47 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
mayton Давай в топик более полную постановку. Просто возникает мысль что ты делаешь какой-то антипаттерн. Я не понимаю какую тебе постановку надо. И этот антипатер я не делаю. Он давно уже сделан и работает. Есть сервак с 3хзвенкой. На нём крутиться наш сервис. Сервис в качестве СУБД по желанию клиента может использовать разные СУБД, в том числе FB. Чаще всего с FB он и используется. Сервак многофункциональный. В том числе для него есть API, чтобы получать данные. И данные, получаемые от сервиса, и условия запросов могут быть совершенно произвольными (но в рамках объектов ORM). Например: я хочу получить фамилии работников, которые обрабатывали материл по контролю за разработкой со скважин таких-то месторождений, в период такой-то. Или: выдай мне 3-мерные координаты пересечений пласта АС4 со стволами скважин, список скважин такой-то. Или: нужны результаты интерпретации скважин, в частности пористость, список скважин такой-то, список названий методов исследования такой-то ну и плюс дофига всяких вариантов, которые только можно напридумывать. Основной клиент, который пользуется этим сервисом - ещё одна система, которая у меня в организации и разрабатывается. Причём ни одно значение в эту базу не вбивается вручную. Все данные попадают туда путём индексирования файлов-результатов работы большого количества работников. Этим индексированием тоже занимается наш сервис, который знает как парсить исходные файлы и как распихивать эту инфу по базе. Просто недавно выяснилось, что количество параметров условий в запросе может быть очень большим (например при просмотре пользователями карты скважин больших месторождений). Из-за этого и был написан пост. Так какие у тебя идеи как победить этот "антипатерн"? )) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 18:34 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDenПросто недавно выяснилось, что количество параметров условий в запросе может быть очень большим (например при просмотре пользователями карты скважин больших месторождений). В базе скважины не привязаны к месторождениям что для построения этой карты их приходится все перечислять вручную?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 18:46 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Могут быть привязаны, могут быть не привязаны, могут быть привязаны хитрым образом. Всё зависит от того, как это было проиндексировано. Это не особо важно. Важно то, что прога, которая показывает карту (и которая частично для отображения карты использует наш сервис), просто запрашивает данные по куче скважин по их уникальному идентификатору, присвоенному нефтяной компанией. И не обязательно это будут скважины одного месторождения. Вроде как возможен вариант, когда на экране будут скважины с разных месторождений, если они умещаются на экране. Я сам не спец по этим картам, отвечаю только за работу с СУБД, индексирование и сетевой протокол для сервиса. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 18:57 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDenВажно то, что прога, которая показывает карту (и которая частично для отображения карты использует наш сервис), просто запрашивает данные по куче скважин по их уникальному идентификатору, присвоенному нефтяной компанией. Понятно. А перед этим она, надо полагать, запрашивает полный список всех скважин, чтобы определить видна ли каждая из них в данный момент на экране или нет. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 19:07 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen Так какие у тебя идеи как победить этот "антипатерн"? )) Есть идея - кластеризовать эти твои наборы. Скорее всего в них есть штук 10 базовых. И по этим базовым наборам имеет смысл разбить основную таблицу на разделы. Или фасеты. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 19:31 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Нет. Вроде как полный список для скважин, которые умещаются на экране при данном масштабе. запрашивается из какой-то не нашей системы. Не суть. Важно, что у нашего сервиса в любой момент могут запросить какую-нибудь фигню, указывая в условиях фильтрации 100500 значений mayton, Основной таблицы нету. Временная таблица может джойниться с любой таблицей из запроса, генерённого ORM, если по ней есть много условий. Мало того, может быть ситуация, когда используется дофига временных таблиц. Они заполняются и джойняться с разными таблицами из 100-этажного запроса. Тут как повезёт. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 19:50 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen mayton, Основной таблицы нету. Временная таблица может джойниться с любой таблицей из запроса, генерённого ORM, если по ней есть много условий. Мало того, может быть ситуация, когда используется дофига временных таблиц. Они заполняются и джойняться с разными таблицами из 100-этажного запроса. Тут как повезёт. Смотри. До того как ты построил 100-колёсный велосипед. Я не специалист в Firebird. Я вобщем - больше по Ораклу и то в прошлом. Но я тебе советую взять на вооружение несколько принципов принципа работы с БД. Первое - в средне-статистической БД 80% нагрузки приходится на SELECT а не на DML операции. Исходя из этого (почти Паретто-) принципа нужно концентрировать свои усилия не на задачах CTAS или загрузок а на том как РАЗЛОЖИТЬ данные на продуктовой БД чтобы выборка была мгновенной. Я не верю что в твоей задаче именно insert является проблемой. Если он - проблема - то это уже очень-очень плохо. Тоесть плохо стало гораздо раньше. И второе. Данные - должны быть стационарны настолько это возможно. Не нужно их двигать. Уплотнять. Переосоздавать. Делать временные таблички. Это все - суета. База любит тишину и постоянство. Я не знаю поддерживает ли FireBird материализовнные представления. Если есть - попробуй. В случае с твоими динамическими справочниками - создай их 1 раз в жизни и трекай изменения. Создай базовый набор (штук 5-10) который покроет все интересы. Я убежден - это можно. Все остальные наборы должны быть просто комбинациями этих базовых. И еще. Денормализовывать можно. Если это идет на пользу скорости и это подконтрольно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 20:04 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
mayton Первое - в средне-статистической БД 80% нагрузки приходится на SELECT а не на DML операции. Исходя из этого (почти Паретто-) принципа нужно концентрировать свои усилия не на задачах CTAS или загрузок а на том как РАЗЛОЖИТЬ данные на продуктовой БД чтобы выборка была мгновенной. Я не верю что в твоей задаче именно insert является проблемой. Если он - проблема - то это уже очень-очень плохо. Тоесть плохо стало гораздо раньше. С этим я согласен на 146 процентов. mayton И второе. Данные - должны быть стационарны настолько это возможно. Не нужно их двигать. Уплотнять. Переосоздавать. Делать временные таблички. А вот с этим не согласен. На то они и временные таблицы, чтобы их заполнять данными и извращаться ради того, чтобы получить то, что тебе нужно )) mayton В случае с твоими динамическими справочниками - создай их 1 раз в жизни и трекай изменения. Создай базовый набор (штук 5-10) который покроет все интересы А вот это я совсем не понял. Что за динамические справочники и как они могут помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 20:21 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen А вот это я совсем не понял. Что за динамические справочники и как они могут помочь. У тебя дальше после многоточия что идет? Код: sql 1.
as select? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 20:24 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
mayton, нет конечно. Firebird такого не поддерживает. У нас GTT это таблица с постоянными метаданными, её не надо каждый раз пересоздавать ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 20:27 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
mayton, ты лучше суть объясни того, что сказать хотел. А временные таблицы для строк конкретно под FB в моём случае создаются запросами типа Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 20:30 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Ну ты насоздавал таблиц TMP_S_0, TMP_S_2 и так далее. И у тебя каждый пользователь захватывает по табличке. Верно? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 20:47 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
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-я ... и т.д. Вот так-то так. Причём в разных транзакциях джойн одной и той же временной таблицы может происходить с любой из реальных таблиц базы ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 21:02 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
А источник для массового insert? Из базы во временные таблицы? ИЛи с клиента? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 21:08 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Я же всё подробно изложил уже. Несколько раз. С клиента. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 21:10 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
А откуда на клиенте эти строки появились? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 21:19 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDenВот так-то так. Причём в разных транзакциях джойн одной и той же временной таблицы может происходить с любой из реальных таблиц базы Сдаётся мне, что временные таблицы здесь не нужны, а данные можно доставать прямо из таблиц, формируя условие с IN группами по тысяче штук сразу по мере получения пакета данных от "другой системы". В конечном итоге это скорее всего выйдет намного быстрее чем insert+select join. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 22:07 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
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 сек), что меня устраивает. Всем спасибо кто посоветовал блочную вставку! )) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 22:32 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen Правда, Firebird был уже на серваке, но версии 3.0 Хотя я не уверен, что на гигабитной сети это будет особо заметно, но попробовать интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 22:41 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Включил WireCompression. Среднее время заполнения таблицы упало до 6.5 сек. Но сервак стоит на виртуалке. В параллель там много чего крутиться, так что это уменьшение времени в пределах погрешности )) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 22:50 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen Firebird (блочная вставка по 20): 6.6 секунды на заполнение и практически мгновенное выполнение запроса после PostgreSQL (COPY + передача бинарного буфера): 1.4 сек на заполнение и 0.7 сек на выполнение запроса после Немного перехвалил Firebird )) На самом деле запрос после заполнения выполняется не почти мгновенно, а ~0.7 сек, как и у PG. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 23:12 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen Включил WireCompression ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 23:34 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
zlib1.dll рядом с fbclient.dll был. Насчёт конфига не понял. На сервере в firebird.conf поставил WireCompression = true и перезапустил службу. Этого не достаточно? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 00:06 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDenНо есть ещё и ограничение на размер текста SQL. Его легко преодолеть даже группируя по 1000 значений в in. Это ограничение в 10 мегабайт для тройки. Ты уверен, что тысяча значений сумеет его преодолеть? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 00:21 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen zlib1.dll рядом с fbclient.dll был. Насчёт конфига не понял. На сервере в firebird.conf поставил WireCompression = true и перезапустил службу. Этого не достаточно? Проверить статус сжатия можно в мониторинге. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 07:14 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Пока что у кучи пользователей 2.5 и к сожалению переход на что-то более свежее не предвидится из-за нежелания пользователей ждать бакапа/рестора при обновлении сервиса (( Но есть идея все новые инсталляции делать уже на свежем FB ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 08:50 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
hvlad ArtDen zlib1.dll рядом с fbclient.dll был. Насчёт конфига не понял. На сервере в firebird.conf поставил WireCompression = true и перезапустил службу. Этого не достаточно? Проверить статус сжатия можно в мониторинге. Включил WireCompression = true в firebird.conf на клиенте. В итоге Error reading data from the connection. Видимо на сервере слишком старый FB 3.0. Попробую обновить ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 08:53 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Обновил. Заработало. По скорости практически нету разницы. Но трафик уменьшился. Без сжатия - 2043 Кб/164Кб и со сжатием - 366Кб/41Кб (к серверу FB/от сервера FB) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 09:10 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Избався от сетевого трафика. Переливай из базы в базу. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 09:18 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
птичку жалко ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 09:29 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen, будет время попробуй на 4.0 Batch API. У меня даже на localhost при массовой заливке получался выигрыш в 2.5-10 раз. Правда с EB не сравнивал. 22080521 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 09:37 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Так какое ограничение на размер всех параметров запроса у FB 2.5? Сейчас для varchar(256) значение XSQLVAR::sqllen получается 1024 байта (256*4). Сколько я таких параметров могу передать за раз? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 10:30 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Симонов Денис, Попробую конечно. Но о 4.0 мне остаётся только мечтать ) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 10:37 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen, 2.5 - 64K на длину сообщения (параметры) и на длину запроса 64K. 255 контекстов (грубо говоря запросов внутри Execute block). 3.0 - 10M. 255 контекстов. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 10:41 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Симонов Денис, Спасибо. Для varchar(256) буду передавать по 60 параметров в блоке. Для всех остальных типов - по 250 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 10:55 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDenПока что у кучи пользователей 2.5 и к сожалению переход на что-то более свежее не предвидится А до тебя точно дошло, что выбирать все 100000 скважин не обязательно одним запросом и даже в одном коннекте?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 12:29 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Если в мой сервис пришёл запрос на получение данных, я должен эти данные получить из базы и отправить их тому, кто их запрашивал. И это надо сделать быстро. Сервис конечно может ответить, что слишком много параметров в условии и фиг вам. Но за это меня по головке не погладят. Ни пользователи, ни программисты, которые этот сервис используют. Как это всё сделать намного лучше - я прекрасно понимаю. Но вопрос был совсем не об этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 12:55 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDenЕсли в мой сервис пришёл запрос на получение данных, я должен эти данные получить из базы и отправить их тому, кто их запрашивал. Нет, похоже, ты всё-таки тупишь... Объясняю на пальцах: 1. В твой сервис приходит запрос со списком параметров. Длинным списком. Этот список приходит в виде потока. 2. Ты этот поток параметров парсишь на отдельные значения. 3. Из этих значений ты формируешь запросы, которые посылаешь Firebird. Много запросов. 4. Полученные от сервера данные ты складываешь в ответ тому, откуда в твой сервис поступил запрос. Так вот, пункты 2-4 отлично параллелятся на Х параллельных потоков, в каждом из которых через отдельный коннект выполняются параллельные запросы на выборку У данных. В идеале ты можешь начинать отдавать данные ещё до того как тебе полностью пришлют запрос. Сейчас ты впустую тратишь время ожидая пока целый пакет параметров сложится во временную таблицу и потом ещё на ожидание пока он целиком обработается. Хотя вместо этого уже мог бы получать данные и отправлять заказчику. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 13:07 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Всё правильно. Но повторюсь. На рабочей системе в продакшене выявилась проблема. Мне надо было отвлечься от своих текущих дел и быстро её решить. И она приемлемо решилась блочной вставкой. Если такое решение не будет удовлетворять конечных пользователей, я отвлекусь от текущих дел ещё раз и подумаю над другими улучшениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 13:22 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDenИ она приемлемо решилась блочной вставкой. Повторю вопрос: почему не блочной выборкой? Это было бы проще. Хотя нет, дай угадаю: потому что фигню со временными таблицами придумали задолго до тебя, так?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 13:30 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen Имеется ввиду что-то типа такого: Код: sql 1.
? Как понимаю, вы выбрали вариант с использованием параметров и, наверное, храните препарированный запрос для экономии на Prepare. А не пробовали вставлять строки непосредственно в код запроса и выполнять его с помощью isc_dsql_execute_immediate? Интересно было бы понять, какой из этих способов быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 13:31 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Повторю вопрос: почему не блочной выборкой? Это было бы проще. Хотя нет, дай угадаю: потому что фигню со временными таблицами придумали задолго до тебя, так?.. Нет. Проще ускорить заполнение временной таблицы потому что для этого не надо лезть в кишки ORM и вообще в логику получения данных из БД. Т.к. надо поддерживать разные СУБД, то проще для них обособить такую простую вещь как заполнение временной таблицы, чем выполнение запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 13:43 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ggreggory, Сейчас уже лень такими экспериментами заниматься ) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 13:44 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDenПроще ускорить заполнение временной таблицы потому что для этого не надо лезть в кишки ORM и вообще в логику получения данных из БД. А, так ты получаешь данные через ОРМ, а не для ОРМа. Тогда вопросов больше не имею. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 13:51 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
ArtDen Сейчас уже лень такими экспериментами заниматься ) Не пробовали закинуть в сторону сервера с БД файл в формате (external table) и сделать insert from select? это был самый быстрый способ PS. файл с данными может быть текстовым. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 14:17 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
pastor это был самый быстрый способ ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 14:47 |
|
Нужен быстрый insert во временную таблицу
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky pastor это был самый быстрый способ в очередь, с ны дети, в очередь (с) делаем пул внешних таблиц по заявленной производительности канала обслуживания. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 14:49 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1560072]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
96ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 203ms |
0 / 0 |