|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Добрых времен, специалисты! Нужен совет по логике? (пните куда рыть) Дано: Delphi 2007, FireBird 2.1 (+EhLib, +Fib, + сторонние компоненты) Все было разработано, все работало как надо, но в один миг СИЛЬНО увеличилась нагрузка (в сотни раз, фирма развивается и на такие нагрузки, я просто не расчитывал) Логика значит сейчас такая: Коннект к сторонней базе. Получаю в клиента ~3000 записи. Беру первую запись. Делаю Select к своей базе проверяю по 3 значениям (индексы, план все вроде в порядке, запрос летит шустро, НО ИХ МНОГО). Если есть такая запись - забыли. Иначе полез по таблицам, добавляю в справочники инфу. Добавляю новую запись. Записал. Следующую запись... и по кругу, и так до конца... (ну там за одно еще справочники проверяются, но это не критично.) Естественно на сервере вскипает процессор под 100% пиком. Все хорошо пока сторонних баз было 3-5. Но когда их стало под 200. Из каждой выдернуть все записи и на каждую запись кинуть Select в мою базу. Тут процессор чето приуныл. Тяну данные из 10 баз одновременно. Процессор в шоке. Полный цикл проходит за 40 минут, без ошибок и т.п.. Но процессор в это время "жужжит" и не дает работать бухгалтерии, от слова совсем. Такой импорт делается 4-5 раз в день, сами понимаете, бухгалтерии времени на работу не остается. Лирика кончилась. Проект буду переделывать. Теперь вопрос: Вот чтоб не убивать сервер тупыми запросами select, можно ли как-то выдернуть кусок таблицы "от даты, до даты(которые известны при старте импорта" в память клиента и уже у него проводить сверку по конкретным параметрам? Куда копать MemtableEh? Желательно у клиента в памяти создать "нечто" к чему можно обращаться Query, т.е. виртуальную (БД) табличку. Куда рыть? (Если вариант совсем глупый, пинайте ногами. За сумбурность извините, не спал, проект горит. Побеспокоил, потому, что времени на переработку НЕТ. Все перечитать не могу... пните что читать, куда думать? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 11:36 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog, сначала объясни откуда взялись 200 БД и почему их нельзя слить в одну. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 11:43 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog, что мешает импортировать записи только от штампа времени последнего импорта? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 11:46 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Симонов Денисdgdog, сначала объясни откуда взялись 200 БД и почему их нельзя слить в одну. 1. БД разные. 1С. Самописные Firebird. Текстовые файлы банковских выписок. Вот так вот, а сливаются в одну УЖЕ в моей базе. Собственно она для этого и нужна. 2. Почему приходится перепроверять фигову тучу записей? Потому, что какой-нибудь бухгалтер нафигачит проводок задним числом... и пипец... какой-то оператор, перебьет к чертям вчерашнюю проводку. Поэтому каждую запись получил и лезу в свою базу проверять есть такая или подобная? (если есть подобная, то еще алгоритм "а не измененная ли это?") Ну суть вопроса хочу уйти от сотен тысяч запросов к серверу. Получить кусок таблицы на клиента, там разобраться и уже с чистой совестью писать в базу. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 11:49 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
1) Добавь в свои таблицы поле LAST_CHANGE: TIMESTAMP и на триггере BEFORE UPDATE OR INSERT заполняй его current_timestamp Вот тебе и "можно ли как-то выдернуть кусок таблицы "от даты, до даты(которые известны при старте импорта" Вместо сравнения "на клиенте" можешь делать сравнение сразу на основном сервере БД ( execute statement с подключением к внешней БД и вычитывание по времени иззменения в GTT ) - может стать лучше, а может и зуже, наверное особенно на супере. 2) а вообще тебе надо делать репликацию из "фильиальных" БД в master database https://habrahabr.ru/post/117917/ http://www.codenet.ru/db/interbase/Interbase-Replications/ 18299570 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 11:50 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogКуда копать MemtableEh? ClientDataSet? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 11:51 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
rdb_devdgdog, что мешает импортировать записи только от штампа времени последнего импорта? Старые записи могут добавиться, измениться (бухгалтерии косячят. 1С откатывается в БэкАп...) Из вводных данных имею только конкретные даты "от... и до..." Остальное я и разбираю. Но слишком много обращений к бд. Они плевые, но их много. Мнеб вот это "От... и до..." как-то на клиента утянуть и там уже крутить - вертеть и к базе лишний раз не лезть. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 11:53 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog1. БД разные. 1С. Самописные Firebird. Текстовые файлы банковских выписок. Вот так вот, а сливаются в одну УЖЕ в моей базе. Собственно она для этого и нужна. 2. Почему приходится перепроверять фигову тучу записей? Потому, что какой-нибудь бухгалтер нафигачит проводок задним числом... и пипец... какой-то оператор, перебьет к чертям вчерашнюю проводку. Поэтому каждую запись получил и лезу в свою базу проверять есть такая или подобная? (если есть подобная, то еще алгоритм "а не измененная ли это?") тогда похоже тебе надо не централизовывать это на сервере, а наоборот распараллеливать. Пусть на каждой из "200 БД" запускается служба подготовки к выгрузке. На сервере формулируешь условия/требования к выгрузке, и на каждой из 200 БД подготавливается пакет, который уже потом отправляется основнму серверу ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 11:53 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog, открой для себя репликацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 11:54 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Симонов Денис, ага, репликацию баз FB с текстовыми файлами.... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 11:55 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Arioch, с трудом представляю сервак который потянет 200 БД одновременно. Ну 10 ещё куда ни шло. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 11:56 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog, ну как вариант записать всё полученное в промежуточную табличку в своей базе и в ХП все скопом обработай ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 11:57 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Arioch, я так понял что он сначала текстовые файлы в отдельные БД на firebird сливает, а потом из этих БД в центральную ещё. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 11:57 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogДелаю Select к своей базе проверяю по 3 значениям (индексы, план все вроде в порядке, запрос летит шустро, НО ИХ МНОГО). Покажи код, которым это делаешь и план запроса. dgdogможно ли как-то выдернуть кусок таблицы "от даты, до даты(которые известны при старте импорта" в память клиента и уже у него проводить сверку по конкретным параметрам? Можно, но не нужно. Слияние двух отсортированных потоков делается проще и работает быстрее. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 12:02 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Симонов ДенисArioch, я так понял что он сначала текстовые файлы в отдельные БД на firebird сливает, а потом из этих БД в центральную ещё. Нет. Цепляюсь например (клиентом) к 10 1С ком соединением. Получаю из каждой кусок данных от ДАТЫ до ДАТЫ. Потом клиент берет каждую запись и лезет в мою базу с проверкой есть такая или нет? Если есть - забыли. Если нет - добавить. (Это грубо там логика в клиенте сверка всяких параметров полученной записи и записей в БД... я такую логику в самом Firebird не осилю.) (Базы разные от 1С и до папки с файлами платежных поручейний из банков.) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 12:05 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Симонов Денися так понял что он сначала текстовые файлы в отдельные БД на firebird сливает хорошо если так, у меня сложилось впечатление - что нет. Хотя я не вполне автора понимаю. ну вот на этом шаге ему и надо прописывать всю инфу, определяющую отсылать их на центральный сервер или нет. эта инфа должна быть уже в промежуточной базе. PS. За сумбурность извините, не спал, проект горит Таки пойти и лечь спать. Альтернатива - перестанешь понимать собственные деййствия и наворотишь второпях такого - что придется потом месяц разгребать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 12:07 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogЦепляюсь например (клиентом) к 10 1С ком соединением. Получаю из каждой кусок данных от ДАТЫ до ДАТЫ. Потом клиент берет каждую запись и лезет в мою базу с проверкой есть такая или нет? Если не "цепляться к 1С", а получать от них штатные файлы изменений, генерируемые !С репликацией, то можно обойтись без проверки существования записи в БД. А так ты, конечно, раз за разом молотишь тонны одного и того же бесполезного мусора. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 12:10 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog Получаю из каждой кусок данных от ДАТЫ до ДАТЫ. Потом клиент берет каждую запись и лезет в мою базу с проверкой есть такая или нет? Если есть - забыли. Если нет - добавить. я бы сначала сливал все данные от ДАТЫ до ДАТЫ как есть в GTT уровня транзакции, а потом в ХП раскладывал всё по полочкам и всё это в одной транзакции. Это будет быстрее чем тягать все данные из обоих БД в клиента и там сравнивать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 12:10 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogНет. Цепляюсь например (клиентом) к 10 1С ком соединением. Получаю из каждой кусок данных от ДАТЫ до ДАТЫ. Потом клиент берет каждую запись и лезет в мою базу с проверкой есть такая или нет? готовь на сервере пакет с требованием к репликации. те самые "от ДАТЫ до ДАТЫ" и любые данные требуемые любому из клиентов для полной "проверкой есть такая или нет" такой вот мега-файл, достаточный для любого клиента из 200 для создания пакета репликации 200 клиентов этот файл скачивают, распаковывают и начинают каждый локально у себя сверять что нужно отослать в центр потом на каждом клиенте в отдельности - не трогая сервер вообще - формируется выжимка, пакет который надо выгрузить на сервер. Также в виде файла. и только потом готовый пакеты с клиентов раззиповываютс я и втягиваются в основную БД. распараллеливай работу, всё, централизовать поздно, основной сервер уже захлебнулся. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 12:12 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Симонов Денис, ....это если сервер классик. что-то мне страшно за такую работу прямо на сервере. если клиент бешено тормозит - это проблемы клиента. но если у него весь сервер ляжет и все работающие с ним программы начнут тормозить в такой момент.... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 12:13 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Пусть на каждой из "200 БД" запускается служба подготовки к выгрузке. (базы разные от 1С, Firebird, ... и до простых текстовых файлов экспорта из клиентбанков) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 12:13 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Симонов ДенисArioch, с трудом представляю сервак который потянет 200 БД одновременно. Ну 10 ещё куда ни шло. Сервак тянет 1 БД Firebird Остальные базы лежат где-как и в локальной сети и на удаленках... я из них только данные тяну на клиента, а уже потом фигачу в БД (плохо я задачу объясняю, завтра высплюсь мож легче будет ) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 12:16 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Arioch, я как бы склонен к тому что ТС не идиот чтобы использовать супер в 2.1 для многопользовательского доступа. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 12:16 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogПроцессор в шоке. Полный цикл проходит за 40 минут Показывай код. И назови архитектуру сервера. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 12:17 |
|
|
start [/forum/search_topic.php?author=%D0%98%D0%B2%D0%B0%D0%BD+%D0%9C%D0%BE%D0%B7%D0%B3%D0%BE%D0%B2%D0%BE%D0%B9&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
others: | 446ms |
total: | 616ms |
0 / 0 |