Я переключаю часть кода Linq на Sql для использования SqlBulkCopy, и проблема в том, что мне нужно сделать две вставки из нескольких тысяч строк в две таблицы.
Служба берет ваш пакет из 10 000 ссылок (импортированных из карты сайта, построителей обратных ссылок и т. Д.) И разбивает их на RSS-каналы X для каждого канала для агрегации. Проблема в том, что у меня уже есть таблица 32 миллиона строк . Если я делаю вставки linq to sql, то в зависимости от посещаемости сайта от 5 до 10 минут, чтобы загрузить 10000 ссылок.
Структура очень проста.
Feeds : идентификатор bigint (PK), заголовок varchar (1000), описание varchar (1000), опубликованный datetime, агрегированный datetime null, ShortCode varchar (8) [устарел, больше не вставляется, но используется для устаревших данных]
Элементы : Идентификатор bigint (PK), FeedId bigint (FK), Title varchar (1000), Description varchar (1000), Дата публикации-время, ShortCode varchar (8) [устарел, больше не вставляется, но используется для устаревших данных], ShortId bigint null [обновляется после вставки в равный Id (используется при разбиении)]
FutureItems : идентификатор bigint (PK), FeedId bigint (FK), заголовок varchar (1000), описание varchar (1000), дата публикации и время, ShortCode varchar (8) [устарел, больше не вставляется, но используется для устаревших данных], ShortId bigint null [обновляется после вставки в равный Id (используется при разбиении)]
OldItems : Идентификатор bigint (PK), FeedId bigint (FK), Название varchar (1000), Описание varchar (1000), Дата и время публикации, ShortCode varchar (8) [устарел, больше не вставляется, но используется для устаревших данных], ShortId bigint null [обновляется после вставки в равный Id (используется при разбиении)]
Таким образом, если у вас размер фида 20, вы получаете 500 вставок в таблицу Feeds, затем 10000 вставок в таблицу Items, затем запускается обновление, чтобы установить ShortId равным Id. Раз в ночь выполняется задание, которое разделяет данные на две другие таблицы и перемещает будущие элементы в таблицу «Элементы».
Я читал, что SqlBulkCopy может обрабатывать 20 миллионов строк за несколько минут, но не могу найти хороших примеров того, как сделать это в нескольких таблицах с ограничением FK.
Наш сервер SQL является "монстром" специально для этого приложения. Это SQL 2008 R2 Web, Windows 2008 R2 Enterprise, оперативная память 12 ГБ, двухъядерные двухъядерные Xeons @ 2,8 ГГц.
Наш веб-сервер является клоном без службы базы данных.
Процессор работает примерно на 85% при вставке ссылок, а база данных заполняет ОЗУ.
Если SqlBulkCopy не годится, любые предложения приветствуются, у нас есть платящие клиенты, которые злятся, а я не администратор баз данных, а просто старый программист.