Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.08.2010, 14:05
bestserg bestserg вне форума
Прохожий
 
Регистрация: 27.03.2009
Сообщения: 4
Репутация: 10
По умолчанию импорт данных из dbf (очень больная) в sql server

Всем добрый день!
Следующая задача: необходимо организавать импорт данных из таблицы dbf в sql server. Проблема состоит в том, что dbf таблица очень большая - 1,5 Гб. Когда я пытаюсь загрузить ее в sql server через BDE, то таблица загружается, но при просмотре в sql server-е она оказывается не вся, а примерно половина записей dbf таблицы, а если я ее загружаю через ODBC драйвер, то во время загрузки, программа начинает увеличивать используемую память и в итоге программа во время загрузки натыкается на сообщение об исчерпании виртуальной памяти (примерно через пол часа работы на пеньке 3Ггц и 2 Гб оперативной памяти, 1 или 2 Гб виртуальной). Загрузку провожу таким путем:
ADOCommand1.CommandText:= 'INSERT Polis VALUES ('''+
t_polis.FieldByName('smo').AsString+''','''+
t_polis.FieldByName('polis_s').AsString+''','''+
t_polis.FieldByName('polis_n').AsString+''','+
datn_new+','+
datk_new+','''+
t_polis.FieldByName('fam').AsString+''','''+
t_polis.FieldByName('im').AsString+''','''+
t_polis.FieldByName('otch').AsString+''','+
datr_new+','''+
t_polis.FieldByName('pol').AsString+''','''+
t_polis.FieldByName('snils').AsString+''','''+
t_polis.FieldByName('pr_rab').AsString+''','''+
t_polis.FieldByName('mrab').AsString+''','''+
t_polis.FieldByName('innrab').AsString+''','''+
t_polis.FieldByName('kpprab').AsString+''','+
IntToStr(t_polis.FieldByName('sost').AsInteger)+', '+
d_input_new+','''+
t_polis.FieldByName('okved').AsString+''')';
ADOCommand1.Execute;

Подскажите пожалуйста как можно обойти такую ситуацию. У нас есть программа стороннего разработчика, которая выполняет такой импорт и при этом никаких подобных сообщений не выскакивает и еще, когда я запускаю импорт в программе стороннего разработчика, открывал диспетчер задач и увидел, что во время загрузки программа этого разработчика не грузит процессор, а грузится sqlserver. А когда я в своей программе запускаю импорт, то почти весь процессор загружает моя программа и при этом постоянно увеличивает использование виртуальной памяти. У кого есть какие предложения, буду рад услышать.
Ответить с цитированием
  #2  
Старый 25.08.2010, 14:34
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Как вариант можно сформировать скрипт из dbf (а не по одной записи вытягивать), а после его проиграть на sql server, желательно разбить скрипт по записей 500 и заключить их в begin tran .. commit go
Формировать сам скрипт одним запросом, к примеру:
Код:
  select 'insert into dest_table (n1, n2) values ('+st.n1+','+st.n2+');'
  from src_table st
на выходе, к примеру, получим:
Код:
  ...
  insert into dest_table(n1, n2) values (1,1);
  insert into dest_table(n1, n2) values (2,2);
  insert into dest_table(n1, n2) values (3,3);
  ...
и заключаем в скобки что-бы в первую очередь снизить нагрузку на sql server.
Код:
  ...
  begin tran
  insert into dest_table(n1, n2) values (1,1);
  insert into dest_table(n1, n2) values (2,2);
  insert into dest_table(n1, n2) values (3,3);
  commit
  go
  ...
Ответить с цитированием
  #3  
Старый 25.08.2010, 15:48
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Есть несколько решений. Я бы выбрал самое быстрое, как мне кажется. Импортируем средствами самого sql-сервера, там для этого есть великолепный инструмент. А уже после импорта перекидываем данные из таблицы в таблицы на самом сервере. На порядок быстрее и проще будет.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 25.08.2010, 18:13
bestserg bestserg вне форума
Прохожий
 
Регистрация: 27.03.2009
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Asinkrit
Как вариант можно сформировать скрипт из dbf (а не по одной записи вытягивать), а после его проиграть на sql server, желательно разбить скрипт по записей 500 и заключить их в begin tran .. commit go
[/code]
Раньше я скрипты еще не формировал, нужно попроботать как минутка выскочит.
Ответить с цитированием
  #5  
Старый 25.08.2010, 18:14
bestserg bestserg вне форума
Прохожий
 
Регистрация: 27.03.2009
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Есть несколько решений. Я бы выбрал самое быстрое, как мне кажется. Импортируем средствами самого sql-сервера, там для этого есть великолепный инструмент. А уже после импорта перекидываем данные из таблицы в таблицы на самом сервере. На порядок быстрее и проще будет.
Как вариант тоже можно попробовать для первого раза. Стоит SQL Server 2005 Standart. Какое в нем средство для импорта?
Ответить с цитированием
  #6  
Старый 25.08.2010, 18:59
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вообще эта вещь называется DTS (Data transformation service)
Там есть хороший мастер, котороый позволит вам быстренько перекинуть данные. Форматов он поддерживает кучу.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 25.08.2010, 19:50
bestserg bestserg вне форума
Прохожий
 
Регистрация: 27.03.2009
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Вообще эта вещь называется DTS (Data transformation service)
Там есть хороший мастер, котороый позволит вам быстренько перекинуть данные. Форматов он поддерживает кучу.
Спасибо, завтра попробую.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:42.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter