Народ, помогите пожалуста... необходимо из текстового файла вставить в БД много записей (сейчас их около 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) большого количества записей
Здравствуйте, 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) большого количества записей
Здравствуйте, 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
Тут идея в том, что бы производить обработку не по записям, а пакетно — это должно дать ощутимый выигрыш в производительности.
И еще попробуй перед закачкой записей во временную таблицу отключить неявное использование транзакций. Примерно так:
Здравствуйте, 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) большого количества записей
Здравствуйте, 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) большого количества записей
Здравствуйте, oRover, Вы писали:
R>сделай sql-запросы в сторед процедуре. Будет быстрее. Если не сложно, потом поделишься, на сколько быстрее
1. Да чего там, я сразу могу сказать, что в данном случае, что хранимка, что запрос в тексте совершенно однофигственно — на глазок разницы не заметишь. Правильный хинт был от Алексея Ширшова и seregaa, Bulck insert, bcp... etc., пакетная вставка вообщем, с различными вариантами в зависимости от задачи.
2.
от модератора: Избыток цитирования не приветствуется.
Это больше относится к предыдущему топику, чтоб два раза не писать.
... [RSDN@Home 1.1 beta 1]
Мы уже победили, просто это еще не так заметно...
Re[3]: вставка в БД (MS SQL) большого количества записей
Здравствуйте, Merle, Вы писали:
R>>сделай sql-запросы в сторед процедуре. Будет быстрее. Если не сложно, потом поделишься, на сколько быстрее M>1. Да чего там, я сразу могу сказать, что в данном случае, что хранимка, что запрос в тексте совершенно однофигственно — на глазок разницы не заметишь.
Как раз в данном случае хранимка может дать выигрыш
Он (автор топика) сейчас как делает:
1. посылает запрос на проверку (select * from ... where ...) — раз команда,
если запись найдена, то
2. Удаляет найденную запись — еще одна посылка команды к серверу (вторая команда — delete)
3. вставляет новую запись (insert что-то-там) — третья команда
А в случае использования хранимки будет всего один вызов — exec my_insert что-то-там, по крайней мере сетевой трафик существенно уменьшится.
Хотя я бы все равно не рекомендовал производить закачку записей на сервак с помощью хранимки — в этом случае мы исключает возможность дальнейшей оптимизации с помощью bcp (я имею ввиду bulk-copy API), которая может увеличить скорость даже на пару порядков.
Здравствуйте, seregaa, Вы писали:
S>А в случае использования хранимки будет всего один вызов — exec my_insert что-то-там, по крайней мере сетевой трафик существенно уменьшится.
Оой, да и запросы у него наверное не параметризованные... Ну тогда хранимка может немного и поможет, но это все равно другой порядок малости, по сравнению с пакетными операциями...
S>Хотя я бы все равно не рекомендовал производить закачку записей на сервак с помощью хранимки — в этом случае мы исключает возможность дальнейшей оптимизации с помощью bcp (я имею ввиду bulk-copy API), которая может увеличить скорость даже на пару порядков.
Ну bulk insert и из хранимки делать можно, тут это не принципиально.
Но то что скорость отличается в десятки раз это точно, особенно на действительно больших объемах.
Мы уже победили, просто это еще не так заметно...
Re[5]: вставка в БД (MS SQL) большого количества записей
Здравствуйте, Merle, Вы писали:
M>Здравствуйте, seregaa, Вы писали:
S>>А в случае использования хранимки будет всего один вызов — exec my_insert что-то-там, по крайней мере сетевой трафик существенно уменьшится. M>Оой, да и запросы у него наверное не параметризованные... Ну тогда хранимка может немного и поможет, но это все равно другой порядок малости, по сравнению с пакетными операциями...
S>>Хотя я бы все равно не рекомендовал производить закачку записей на сервак с помощью хранимки — в этом случае мы исключает возможность дальнейшей оптимизации с помощью bcp (я имею ввиду bulk-copy API), которая может увеличить скорость даже на пару порядков. M>Ну bulk insert и из хранимки делать можно, тут это не принципиально. M>Но то что скорость отличается в десятки раз это точно, особенно на действительно больших объемах.
DTS пакеты используют bulk ... ?
Re[6]: вставка в БД (MS SQL) большого количества записей