Получение строк, вставленных с помощью SqlBulkCopy

linq-to-sql sqlbulkcopy sql-server transactions

Вопрос

Я использую SqlBulkCopy из моего кода Linq для Sql, и проблема в том, что мне нужно сделать две вставки из нескольких тысяч строк в две таблицы.

Служба принимает вашу партию из 10 000 ссылок (импортированных из sitemap, backlink builders и т. Д.) И отбрасывает их в RSS-каналы X на канал для агрегирования. Проблема в том, что у меня уже есть таблица из 32 миллионов строк . Если я делаю linq для sql-вставок, он берет в зависимости от трафика сайта где-то между 5 и 10 моментами, чтобы загрузить 10 000 ссылок.

Структура очень простая.

Feeds : Id bigint (PK), Title varchar (1000), Описание varchar (1000), Опубликовано datetime, Aggregated datetime null, ShortCode varchar (8) [устаревшее, не вставленное больше, но используемое для устаревших данных]

Элементы : Id bigint (PK), FeedId bigint (FK), Title varchar (1000), Описание varchar (1000), Опубликовано datetime, ShortCode varchar (8) [устаревшее, не вставленное больше, но используемое для устаревших данных], ShortId bigint null [обновляется после вставки в равный Id (используется при разбиении)]

FutureItems : Id bigint (PK), FeedId bigint (FK), Title varchar (1000), Описание varchar (1000), Опубликовано datetime, ShortCode varchar (8) [устаревшее, не вставленное больше, но используемое для устаревших данных], ShortId bigint null [обновляется после вставки в равный Id (используется при разбиении)]

OldItems : Id bigint (PK), FeedId bigint (FK), Title varchar (1000), Описание varchar (1000), Опубликовано datetime, ShortCode varchar (8) [устаревшее, не вставленное больше, но используемое для устаревших данных], ShortId bigint null [обновляется после вставки в равный Id (используется при разбиении)]

Поэтому, если у вас есть размер подачи 20, вы получаете 500 вставок в таблицу Feeds, затем 10000 вставляете в таблицу Items, затем и запускаете обновления, чтобы установить ShortId равным Id. Однажды ночью выполняется задание, которое разделяет данные на две другие таблицы и переносит будущие элементы в таблицу Items.

Я читал, что SqlBulkCopy может делать 20 миллионов строк в вопросе mintues, но я не могу найти хороших примеров для этого в нескольких таблицах с FK Constraint.

Наш SQL-сервер является «монстром» специально для этого приложения. Это SQL 2008 R2 Web, Windows 2008 R2 Enterprise, 12GB Ram, Dual 4 core Xeons @ 2.8ghz.

Наш веб-сервер - это клон без службы базы данных.

При вставке ссылок процессор работает около 85%, а база данных заполняет ОЗУ.

Если SqlBulkCopy не подходит, любое предложение приветствуется, мы платим клиентам, которые злятся, и я не являюсь администратором баз данных, просто простым программистом.

Принятый ответ

SqlBulkCopy действительно быстрее, чем обычные вставки. Но быстрее, чем в нем, можно преобразовать задание, которое запускает 1000 вставок в секунду в один, который делает 10000 / сек. Если вы можете делать только 10000 ссылок за 10 минут, у вас должны быть разные проблемы, то, что массовая копия вряд ли решит.

Вам нужно сначала исследовать, почему так невероятно долго вставлять 10000 ссылок. Только после того, как вы поймете, что вы можете сделать вызов, который определяет, является ли переход к SqlBulkCopy решением. Я понимаю , что вы не DBA, но я собираюсь направить вам «dbaish» белой бумагу для выполнения устранения неполадок SQL Server: Уэйтс и очереди . Это не рецепт рецепта резака для печенья, на самом деле это методология, которая научит вас определять узкие места производительности в SQL Server.

И для решения вашего вопроса: как использовать SqlBulkCopy, когда есть ограничения? Более общий вопрос заключается в том, как выполнять операции объемной вставки при наличии ограничений? Для серьезных томов фактически отключается ограничение, выполняется массовая загрузка, а затем возвращается обратно. Для более упорядоченных онлайн-операций с минимальным временем простоя (база данных в основном «вниз» в течение периода, когда ограничения отключены), используется другая стратегия, а именно: предварительно загружает данные в промежуточные таблицы, проверяет их и затем переключает с помощью переключение разделов, см. « Эффективное перенос данных с помощью коммутации разделов» .


Популярные ответы

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



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему