2013-02-11 4 views
2

У меня есть файл с разделителями, который я использую для вставки/обновления записей в таблице sql-сервера с помощью приложения .net. Файл имеет около 80000 записей и обрабатывается ежедневно. Мой вопрос: безопасно или даже разумно держать соединение с db открытым, пока я прокручиваю каждую из строк 80000 или я должен закрывать соединение и снова открываться с каждой итерацией петли? Это звучит громоздко само по себе. Тем не менее, я обеспокоен тем, что долгое время поддерживаю открытое соединение, удерживая блокировки и ненужно используя память. Что было бы более масштабируемым, безопасным и разумным способом сделать это?длительные операции с базой данных в .net

+0

Пожалуйста, определите 'в течение длительного времени': часов? Это работает внутри одной транзакции? О каких замках вы имеете в виду? Где вы используете память, в sql или на сервере приложений? Я не осмеливаюсь попросить детально рассказать о более масштабируемых и безопасных ... – rene

+0

В настоящее время с образцом, который я тестирую, требуется всего около часа. Но если фактический файл растет, когда я перехожу к его производству, он будет длиннее. Я не использую одну транзакцию. –

+0

Является ли ваш sqlserver максимальным? Может ли он справиться с одним дополнительным работником? Означает ли порядок? – rene

ответ

4

Во-первых, нет, вы не должны открывать/закрывать соединение в каждой строке. Для 80 000 строк это займет вечность и просто добавит дополнительные накладные расходы. Вы можете рассмотреть возможность группировки строк (сбросьте соединение, скажем, каждые 10-500 строк). К счастью, есть лучший вариант:

Во-вторых, правильный способ вставки/обновления многих строк в базе данных из приложения .Net заключается в использовании команд SQLBulkCopy methods, а не команд INSERT или UPDATE. Вы должны использовать SQLBulkCopy для загрузки строк данных в таблицу холдинга/промежуточной таблицы, а затем использовать хранимую процедуру SQL для вставки/обновления в фактическую таблицу (таблицы), en-mass.

Если вас беспокоит постоянная нагрузка SQLBulkCopy, он имеет встроенные параметры пакетной обработки.

Используя эту технику, начальная загрузка данных должна быть не менее 5 раз быстрее, а фактическая таблица Вставка/Обновления должна составлять всего несколько секунд.

2

У меня когда-то была необходимость импортировать данные. Но я должен был запустить некоторые мини-бизнес-правила. Кроме того, в моем требовании было импортировать как можно больше строк, но если что-то не удалось, запишите его (но не пропустите весь импорт).

Я написал образец ниже.

http://granadacoder.wordpress.com/2009/01/27/bulk-insert-example-using-an-idatareader-to-strong-dataset-to-sql-server-xml/

я пройти вниз N число записей (N = 1000), например, как ~ XML в хранимой процедуре.

N следует настраивать, чтобы найти «сладкое пятно». Но один за раз слишком медленный, и 80 000 в свое время, похоже, многим. 1000 (ряды) x 80 "работает" .... является хорошей отправной точкой, ИМХО.

Так что, если ваш импорт «тупой», то предложенный ранее «SQLBulkCopy» может быть лучшим способом. Но если у вас есть какие-либо проверки или проверки, то мой пример может быть хорошим предложением.

.......

Другой вариант:

http://msdn.microsoft.com/en-us/library/ms162802.aspx Bcp.exe

Но это на самом деле не "точка чистый код".

+0

Так что это был пример VS2005. Человек, я старею! Если бы я сделал это сегодня, я бы это сделал. (1) Используйте VS2010 (по крайней мере). (2) Измените EnterpriseLibrary v5, у которого уже есть OleDb abilties из коробки и (3) Измените мой TSQL, чтобы не использовать OPENXML, а скорее синтаксис «узлы». Пример здесь: http://pratchev.blogspot.com/2007/06/shredding-xml-in-sql-server-2005.html – granadaCoder

Смежные вопросы