вставка в БД (MS SQL) большого количества записей
От: hangman Россия  
Дата: 27.07.03 05:31
Оценка:
Народ, помогите пожалуста... необходимо из текстового файла вставить в БД много записей (сейчас их около 200 тыс, через месяц-два планируетсья их увеличение раз в 5-6).
я делаю на VC++6.0, ODBC. в результате работы моей программы за минуту работы вставилось только 15-20 тыс. все тормозит SQL запросы. я делаю так: insert into tab(a, b, c, d) values (va, vb, vc, vd) причем va, vb еще надо достать из этой же таблице. ( необходима проверка на присутвие этой записе в БД, если она есть то старую удаляем + еще необходимо связать текущаю таблицу уже существуешей по отпределенному полю vb).
в результате этот запрос выполняется слишком долго, что гарантирует не высокую скрость работы всего приложения в целом.
ПОМОГИТЕ ускорить весь процесс в целом.
Re: вставка в БД (MS SQL) большого количества записей
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 27.07.03 06:52
Оценка: +2
Здравствуйте, hangman, Вы писали:

[]

H>ПОМОГИТЕ ускорить весь процесс в целом.


См. bcp — bilk copy programm и bulk insert.
Re: вставка в БД (MS SQL) большого количества записей
От: KGP http://kornilow.newmail.ru
Дата: 28.07.03 07:55
Оценка:
Здравствуйте, hangman, Вы писали:

H>Народ, помогите пожалуста... необходимо из текстового файла вставить в БД много записей (сейчас их около 200 тыс, через месяц-два планируетсья их увеличение раз в 5-6).

H>я делаю на VC++6.0, ODBC. в результате работы моей программы за минуту работы вставилось только 15-20 тыс. все тормозит SQL запросы. я делаю так: insert into tab(a, b, c, d) values (va, vb, vc, vd) причем va, vb еще надо достать из этой же таблице. ( необходима проверка на присутвие этой записе в БД, если она есть то старую удаляем + еще необходимо связать текущаю таблицу уже существуешей по отпределенному полю vb).
H>в результате этот запрос выполняется слишком долго, что гарантирует не высокую скрость работы всего приложения в целом.
H>ПОМОГИТЕ ускорить весь процесс в целом.

Ещё можно ичспользовать DTS пакет. dtspkg.dll
Re: вставка в БД (MS SQL) большого количества записей
От: seregaa Ниоткуда http://blogtani.ru
Дата: 28.07.03 11:03
Оценка: +1
Здравствуйте, hangman, Вы писали:

H>Народ, помогите пожалуста... необходимо из текстового файла вставить в БД много записей (сейчас их около 200 тыс, через месяц-два планируетсья их увеличение раз в 5-6).


H>я делаю на VC++6.0, ODBC. в результате работы моей программы за минуту работы вставилось только 15-20 тыс. все тормозит SQL запросы. я делаю так: insert into tab(a, b, c, d) values (va, vb, vc, vd) причем va, vb еще надо достать из этой же таблице. ( необходима проверка на присутвие этой записе в БД, если она есть то старую удаляем + еще необходимо связать текущаю таблицу уже существуешей по отпределенному полю vb).


Если ты перед вставкой каждой записи сначала проверяеши ее наличие в таблице — приемнике, то тут даже bcp не поможет. Попробуй для начала закачивать _все_ записи во временную таблицу, затем удали из таблицы — приемника записи, которые есть во временной таблице,
что то вроде
delete from dest_table where primary_key in (select primary_key from tmp_table)


а затем перекачай все записи из временной таблицы в таблицу — приемник.
insert into dest_table select * from tmp_table


Тут идея в том, что бы производить обработку не по записям, а пакетно — это должно дать ощутимый выигрыш в производительности.

И еще попробуй перед закачкой записей во временную таблицу отключить неявное использование транзакций. Примерно так:

SQLSetConnectAttr(hdbc,SQL_ATTR_AUTOCOMMIT,(void*)SQL_AUTOCOMMIT_OFF,(long)NULL);


только не забудь в конце закачки вызвать
SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT);


Для дальнейшего ускорения процесса можно будет и bcp поиспользовать.
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re: вставка в БД (MS SQL) большого количества записей
От: Nikolai Serdiuk Болгария  
Дата: 29.07.03 13:30
Оценка:
Здравствуйте, hangman, Вы писали:

H>Народ, помогите пожалуста... необходимо из текстового файла вставить в БД много записей (сейчас их около 200 тыс, через месяц-два планируетсья их увеличение раз в 5-6).

H>я делаю на VC++6.0, ODBC. в результате работы моей программы за минуту работы вставилось только 15-20 тыс. все тормозит SQL запросы. я делаю так: insert into tab(a, b, c, d) values (va, vb, vc, vd) причем va, vb еще надо достать из этой же таблице. ( необходима проверка на присутвие этой записе в БД, если она есть то старую удаляем + еще необходимо связать текущаю таблицу уже существуешей по отпределенному полю vb).
H>в результате этот запрос выполняется слишком долго, что гарантирует не высокую скрость работы всего приложения в целом.
H>ПОМОГИТЕ ускорить весь процесс в целом.

Привет!
Я столкнулся с подобной проблемой — в моем случае надо было вставить большое число записей с проверкой и обновлением существующих. Первоначально я проверял на наличие записи при помощи SELECT, но это оказалось неэффективнъм решением — гораздо эффективней попробовать вставить запись, и, если таковая имеется, проверив это по коду ощибки, обновить ее... Я использую ADO, что гораздо бъстрее ODBC, может стоит сменить технологию?

Николай
Re: вставка в БД (MS SQL) большого количества записей
От: oRover Украина  
Дата: 29.07.03 17:28
Оценка: -1
Здравствуйте, hangman, Вы писали:

H>Народ, помогите пожалуста... необходимо из текстового файла вставить в БД много записей (сейчас их около 200 тыс, через месяц-два планируетсья их увеличение раз в 5-6).

H>я делаю на VC++6.0, ODBC. в результате работы моей программы за минуту работы вставилось только 15-20 тыс. все тормозит SQL запросы. я делаю так: insert into tab(a, b, c, d) values (va, vb, vc, vd) причем va, vb еще надо достать из этой же таблице. ( необходима проверка на присутвие этой записе в БД, если она есть то старую удаляем + еще необходимо связать текущаю таблицу уже существуешей по отпределенному полю vb).
H>в результате этот запрос выполняется слишком долго, что гарантирует не высокую скрость работы всего приложения в целом.
H>ПОМОГИТЕ ускорить весь процесс в целом.

сделай sql-запросы в сторед процедуре. Будет быстрее. Если не сложно, потом поделишься, на сколько быстрее
... << RSDN@Home 1.1 beta 1 >>
Re[2]: вставка в БД (MS SQL) большого количества записей
От: Merle Австрия http://rsdn.ru
Дата: 29.07.03 19:34
Оценка:
Здравствуйте, oRover, Вы писали:

R>сделай sql-запросы в сторед процедуре. Будет быстрее. Если не сложно, потом поделишься, на сколько быстрее

1. Да чего там, я сразу могу сказать, что в данном случае, что хранимка, что запрос в тексте совершенно однофигственно — на глазок разницы не заметишь. Правильный хинт был от Алексея Ширшова и seregaa, Bulck insert, bcp... etc., пакетная вставка вообщем, с различными вариантами в зависимости от задачи.

2.
от модератора: Избыток цитирования не приветствуется.
Это больше относится к предыдущему топику, чтоб два раза не писать.
... [RSDN@Home 1.1 beta 1]
Мы уже победили, просто это еще не так заметно...
Re[3]: вставка в БД (MS SQL) большого количества записей
От: seregaa Ниоткуда http://blogtani.ru
Дата: 30.07.03 05:58
Оценка:
Здравствуйте, Merle, Вы писали:

R>>сделай sql-запросы в сторед процедуре. Будет быстрее. Если не сложно, потом поделишься, на сколько быстрее

M>1. Да чего там, я сразу могу сказать, что в данном случае, что хранимка, что запрос в тексте совершенно однофигственно — на глазок разницы не заметишь.

Как раз в данном случае хранимка может дать выигрыш

Он (автор топика) сейчас как делает:

1. посылает запрос на проверку (select * from ... where ...) — раз команда,
если запись найдена, то
2. Удаляет найденную запись — еще одна посылка команды к серверу (вторая команда — delete)
3. вставляет новую запись (insert что-то-там) — третья команда

А в случае использования хранимки будет всего один вызов — exec my_insert что-то-там, по крайней мере сетевой трафик существенно уменьшится.

Хотя я бы все равно не рекомендовал производить закачку записей на сервак с помощью хранимки — в этом случае мы исключает возможность дальнейшей оптимизации с помощью bcp (я имею ввиду bulk-copy API), которая может увеличить скорость даже на пару порядков.


Успехов.
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re[4]: вставка в БД (MS SQL) большого количества записей
От: Merle Австрия http://rsdn.ru
Дата: 30.07.03 07:08
Оценка:
Здравствуйте, seregaa, Вы писали:

S>А в случае использования хранимки будет всего один вызов — exec my_insert что-то-там, по крайней мере сетевой трафик существенно уменьшится.

Оой, да и запросы у него наверное не параметризованные... Ну тогда хранимка может немного и поможет, но это все равно другой порядок малости, по сравнению с пакетными операциями...

S>Хотя я бы все равно не рекомендовал производить закачку записей на сервак с помощью хранимки — в этом случае мы исключает возможность дальнейшей оптимизации с помощью bcp (я имею ввиду bulk-copy API), которая может увеличить скорость даже на пару порядков.

Ну bulk insert и из хранимки делать можно, тут это не принципиально.
Но то что скорость отличается в десятки раз это точно, особенно на действительно больших объемах.
Мы уже победили, просто это еще не так заметно...
Re[5]: вставка в БД (MS SQL) большого количества записей
От: KGP http://kornilow.newmail.ru
Дата: 31.07.03 11:53
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, seregaa, Вы писали:


S>>А в случае использования хранимки будет всего один вызов — exec my_insert что-то-там, по крайней мере сетевой трафик существенно уменьшится.

M>Оой, да и запросы у него наверное не параметризованные... Ну тогда хранимка может немного и поможет, но это все равно другой порядок малости, по сравнению с пакетными операциями...

S>>Хотя я бы все равно не рекомендовал производить закачку записей на сервак с помощью хранимки — в этом случае мы исключает возможность дальнейшей оптимизации с помощью bcp (я имею ввиду bulk-copy API), которая может увеличить скорость даже на пару порядков.

M>Ну bulk insert и из хранимки делать можно, тут это не принципиально.
M>Но то что скорость отличается в десятки раз это точно, особенно на действительно больших объемах.

DTS пакеты используют bulk ... ?
Re[6]: вставка в БД (MS SQL) большого количества записей
От: seregaa Ниоткуда http://blogtani.ru
Дата: 31.07.03 12:27
Оценка:
Здравствуйте, KGP, Вы писали:

KGP>DTS пакеты используют bulk ... ?


В DTS пакетах можно мнего чего использовать, включая и "Bulk Insert Task"

Enterprise Manager -> Data Transformation Services -> Local Packages -> контекстное меню -> New Package
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.