Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Получить данные из другой БД в запросе / 25 сообщений из 54, страница 1 из 3
15.02.2018, 11:01
    #39602201
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
Добрый день.
Напомните пожалуйста как заполнить данные в таблице из другой БД.

Есть БД в которой храниться ФИО полностью.
назовем БД - FIO.FDB и таблицу family, поля fam, im, otch.

Нужно в текущую БД тоже в поля fam, im, otch прописать данные из БД fio.fdb

Ключевое поле связка - app_num

Где-то тут были сообщения как, но не смог найти.
Помогите вспомнить.

--------------------------
Firebird 3.0.1.32609;
IBExpert 2017.3.12.1;
Windows 10 32-bit;
4Gb RAM;
SSD 512Mb + HDD 1 Tb;
Настройки по умолчанию

Среда разработки:
Delphi XE2 + FIBPlus 7.4
...
Рейтинг: 0 / 0
15.02.2018, 11:07
    #39602208
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
execute statement ... on external ...
Запустит клиента от имени сервера и выполнит указанный запрос к указанной БД.
...
Рейтинг: 0 / 0
15.02.2018, 11:46
    #39602232
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
set names WIN1251;
set CLIENTLIB 'fbclient.dll';
connect 'D:\FB_log_database.fdb' user 'SYSDBA' password 'masterkey';
execute block
as
declare variable T_COUNT integer;

begin
  for execute statement('select count(*) from repl$log')
          on external 'srv:market.fdb'
          with autonomous transaction
          as user 'SYSDBA' password 'masterkey'
          into :T_COUNT

  do
  begin
    insert into REPL (COUNT_REPL, TIME_WRITE)
    values (:T_COUNT, current_timestamp);


  end

end;
commit; 

...
Рейтинг: 0 / 0
15.02.2018, 11:58
    #39602240
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
Gallemar,

а зачем тебе для SELECT запроса автономная транзакция?
...
Рейтинг: 0 / 0
15.02.2018, 12:22
    #39602246
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
Gallemar,
Спасибо. В IBExpert сработало. Сейчас в программе через FIBScript попробую.
...
Рейтинг: 0 / 0
15.02.2018, 13:38
    #39602310
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
akrush,
Интересно как-то получается.

У меня сейчас, в делфи, при импорте из ДБФ по каждой строке ДБФ открывается отдельный запрос, который из другой БД вытаскивает мне ФИО полностью по app_num.
Значения присваиваются параметрам и делается инсерт в текущую БД.

Сделал по рекомендации Gallemar.
Получилось в 2 раза дольше.
Можете подсказать почему так происходит.
...
Рейтинг: 0 / 0
15.02.2018, 13:39
    #39602312
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
akrush,
рекомендацию Gallemar пока тестирую в IBExpert
...
Рейтинг: 0 / 0
15.02.2018, 13:51
    #39602329
Граур Станислав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
akrushakrush,
Интересно как-то получается.

У меня сейчас, в делфи, при импорте из ДБФ по каждой строке ДБФ открывается отдельный запрос, который из другой БД вытаскивает мне ФИО полностью по app_num.
Значения присваиваются параметрам и делается инсерт в текущую БД.



Что такое отдельный запрос? От чего отдельный?
Конечно, "дельфи тут никто не знает", но с примерами кода дело пойдет быстрее.
...
Рейтинг: 0 / 0
15.02.2018, 13:53
    #39602332
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
15.02.2018 13:38, akrush пишет:
> У меня сейчас, в делфи, при импорте из ДБФ...

а в африке негры не черного цвета.
оттенки разные у них.
а ДБФ не FireBird.
а мягкое с тёплым сравнивать без толку.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.02.2018, 14:04
    #39602349
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
akrush,

потому что кто-то страдает фигнёй. Если на каждую запись одного резалтсета лазить за данными в другую БД, то проще повесится.
Особенно учитывая что пока что пула внешних соединений нет (в 4.0 обещают). Собственно установка соединения с БД один из самых дорогих ресурсов.
...
Рейтинг: 0 / 0
15.02.2018, 14:08
    #39602352
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
akrushУ меня сейчас, в делфи, при импорте из ДБФ по каждой строке ДБФ открывается отдельный запрос, который из другой БД вытаскивает мне ФИО полностью по app_num.
Значения присваиваются параметрам и делается инсерт в текущую БД.Сколько миллионов записей нужно за раз вытаскивать? С какой периодичностью?
...
Рейтинг: 0 / 0
15.02.2018, 14:12
    #39602358
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
Ivan_Pisarevsky,
до 200тыс. 1 раз в месяц
...
Рейтинг: 0 / 0
15.02.2018, 14:21
    #39602369
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
В принципе немного и не часто, но озадачиться внешними таблицами (EXTERNAL TABLE) уже можно. Если в дбф-ку сложить только текстовые поля, а в базе задекларировать внешнюю таблицу с CHAR полями, то внешняя таблица будет очень похожа на дбф-ку с откушенным заголовком. Ну а дальше одним запросом все вытаскивается.
...
Рейтинг: 0 / 0
15.02.2018, 14:22
    #39602370
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
akrushСейчас в программе через FIBScript попробую.
интересно, зачем надо лезть через из приложения первый сервер ко второму, когда можно напрямую сделать коннект ко второй БД?
...
Рейтинг: 0 / 0
15.02.2018, 14:28
    #39602383
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
kdvakrushСейчас в программе через FIBScript попробую.
интересно, зачем надо лезть через из приложения первый сервер ко второму, когда можно напрямую сделать коннект ко второй БД?
а как?
...
Рейтинг: 0 / 0
15.02.2018, 14:39
    #39602394
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
akrush,

Коннект в одну БД, выгрузить данные на клиента в память. Потом коннект в другую, загрузить данные туда. Либо коннект туда и туда сразу. Грубо говоря, экспорт/импорт через клиента. Но Дельфи не знаю. Но не вижу проблем.
...
Рейтинг: 0 / 0
15.02.2018, 14:42
    #39602403
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
KreatorXXI,
Я так сейчас и делаю.
Но думал можно ускориться
130тыс. записей сейчас импортируются с конектом в другую БД - 2минуты
...
Рейтинг: 0 / 0
15.02.2018, 14:44
    #39602406
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
akrush,

ну 2 минуты это не много для того что происходит раз в месяц
...
Рейтинг: 0 / 0
15.02.2018, 15:09
    #39602418
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
KreatorXXIКоннект в одну БД, выгрузить данные на клиента в память. Потом коннект в другую, загрузить данные туда
вот еще советчик...

http://www.ibase.ru/impexp/

берем небуферизирующий датасет, коннект к одной БД, коннект к другой БД. И по очереди читаем 1 запись, вставляем, читаем, вставляем, ....
akrushНо думал можно ускориться
можно. использовать для insert препарированный запрос, и в цикле параметры передавать. Делать вставку всех 130к записей в одной транзакции. И небуферизирующий датасет, читающий данные. Ну вроде все.
...
Рейтинг: 0 / 0
15.02.2018, 15:12
    #39602420
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
kdvможно.

Но сложно. У него и так уже 1000 записей в секунду.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.02.2018, 15:12
    #39602423
Шавлюк Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
akrush,

Если в БД fio.fdb можно создавать процедуры, то рекомендую следующее:

1. Создаем в FIO.fdb такую процедуру:
strtoid
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
create or alter procedure strtoid (
    str blob,
    l varchar(20) = null)
returns (
    n integer,
    code bigint)
AS
declare variable p int = -1;
declare variable t int = 1;
declare variable l1 int;
declare variable p1 int;
declare variable p2 int;
declare variable cc varchar(20);
declare variable nums varchar(16) = '[-+]?[0-9]{1,19}';
begin
  if (l is null) then
  begin
    p1 = position(',', str);
    p2 = position('~', str);
    if (p2 > 0 and (p1 = 0 or p1 > p2)) then l = '~'; else l = ',';
  end

  N = 1;
  l1 = char_length(l);
  while (p <> 0) do
  begin
    p = position(l, str, t);
    if (p = 0) then
      cc = left(substring(str from t), 20);
    else
      cc = left(substring(str from t for p-t), 20);
    if (cc similar to nums) then
    begin
      code = cc;
      suspend;
      N = N + 1;
    end
    t = p + l1;
  end
end



2. В процедуре, после импорта всех данных,
Получаем список всех app_num в блоб (select list(distinct app_num) from ...)
и выполняем
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  for execute statement ('select app_num, fam, im, otch from strtoid(:bl) s left join family on app_num = s.code ')
      (bl := :bl)
    on external 'fio.fdb'
  into app_num, fam, im, otch do
  begin
    update family set
      fam = :fam,
      im = :im,
      otch = :otch
    where app_num = :app_num;
  end
...
Рейтинг: 0 / 0
15.02.2018, 15:41
    #39602444
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
akrushKreatorXXI,
Я так сейчас и делаю.
Но думал можно ускориться
130тыс. записей сейчас импортируются с конектом в другую БД - 2минуты

На мой взгляд многовато, мягко говоря. Я бы для начала выяснил, где тормоз - на чтении или на записи. Если на записи, то уже бы посмотрел повнимательней - блобы, индексы, может триггеры...
Есть подозрение, что в лоб что по лбу, через клиента или через внешнюю БД. по скорости имею ввиду.
...
Рейтинг: 0 / 0
15.02.2018, 16:21
    #39602475
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
KreatorXXI,

1000+ записей в секунду - недостаточно быстро?

*Ну у вас и запросы! - сказала база и повесилась.
...
Рейтинг: 0 / 0
15.02.2018, 16:39
    #39602500
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
WildSery,

Запись записи рознь, конечно. Но скорость должна быть на порядок выше. 10000+ в секунду.
...
Рейтинг: 0 / 0
15.02.2018, 16:42
    #39602502
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из другой БД в запросе
KreatorXXI,

это смотря откуда эти записи читаются. Если через сеть, да ещё и ширина записи большая, то ...
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Получить данные из другой БД в запросе / 25 сообщений из 54, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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