Таким чином, у мене є простий процес масового вставки, щоб взяти дані з нашої поетапної таблиці та перемістити їх у нашу дані даних.
Процес - це проста задача потоку даних із налаштуваннями за замовчуванням для "Рядки на партію", а параметри - "табло" та "відсутність обмежень для перевірки".
Стіл досить великий. 587,162,986 з розміром даних 201 ГБ та 49 ГБ простору індексу. Кластерний індекс для таблиці -.
CREATE CLUSTERED INDEX ImageData ON dbo.ImageData
(
DOC_ID ASC,
ACCT_NUM ASC,
MasterID ASC
)
І Первинний Ключ:
ALTER TABLE dbo.ImageData
ADD CONSTRAINT ImageData
PRIMARY KEY NONCLUSTERED
(
ImageID ASC,
DT_CRTE_DOC ASC
)
Зараз у нас виникає проблема, коли BULK INSERT
через SSIS працює надзвичайно повільно. 1 годину, щоб вставити мільйон рядків. Запит, який заповнює таблицю, вже відсортований, а на запит для заповнення потрібно зайняти менше хвилини.
Коли процес запущений, я бачу запит, який очікує на вставці BULK, яка займає від 5 до 20 секунд і показує тип очікування PAGEIOLATCH_EX
. Процес здатний INSERT
одночасно близько тисячі рядків.
Вчора під час тестування цього процесу на моєму середовищі UAT я зіткнувся з тією ж проблемою. Я кілька разів запускав процес і намагався визначити, в чому полягає першопричина цієї повільної вставки. Потім раптом воно почало працювати за 5 хвилин. Тож я провів її ще кілька разів, все з тим самим результатом. Також кількість об'ємних вставок, які чекали 5 секунд або більше, знизилася від сотень до приблизно 4.
Зараз це викликає здивування, адже це не так, як у нас було величезне падіння активності.
CPU протягом тривалості низький.
Часи, коли це повільніше, на диску здається, що менше очікує.
Затримка диска фактично збільшується протягом періоду часу, протягом якого процес працював за 5 хвилин.
І ІО був значно нижчим за часи, коли цей процес проходить погано.
Я вже перевірив і не було зростання файлів, оскільки файли заповнені лише на 70%. Файл журналу має ще 50%. БД знаходиться в режимі простого відновлення. У БД є лише одна група файлів, але вона поширюється на 4 файли.
Отже, що мені цікаво : чому я бачив такі великі очікування на цих об'ємних вставках. Б: яка магія трапилася, що змусила її бігти швидше?
Бічна примітка. Сьогодні вона знову біжить як лайно.
ОНОВЛЕННЯ на даний момент розділено. Однак це робиться методом, який у кращому випадку є дурним.
CREATE PARTITION SCHEME [ps_Image] AS PARTITION [pf_Image]
TO ([FG_Image], [FG_Image], [FG_Image], [FG_Image])
CREATE PARTITION FUNCTION [pf_Image](datetime) AS
RANGE RIGHT FOR VALUES (
N'2011-12-01T00:00:00.000'
, N'2013-04-01T00:00:00.000'
, N'2013-07-01T00:00:00.000'
);
Це залишає по суті всі дані в 4-му розділі. Однак оскільки все відбувається в одній групі файлів. Наразі дані досить рівномірно розподілені між цими файлами.
ОНОВЛЕННЯ 2 Це загальні очікування, коли процес працює погано.
Це очікування в той період, коли мені вдалося запустити, процес працює добре.
Підсистема зберігання локально приєднана RAID, без участі SAN. Журнали знаходяться на іншому диску. Рейдер-контролер PERC H800 з розміром кешу в 1 Гб. (Для UAT) Prod - це PERC (810).
Ми використовуємо просте відновлення без резервних копій. Він відновлюється з виробничої копії щовечора.
Ми також встановили IsSorted property = TRUE
в SSIS, оскільки дані вже відсортовані.
PAGEIOLATCH_EX
і ASYNC_IO_COMPLETION
вказують на те, що потрібно отримати певний час, щоб отримати дані з диска в пам'ять. Це може бути індикатором проблеми з підсистемою диска, або це суперечка пам'яті. Скільки пам'яті має SQL Server?
ASYNC_NETWORK_IO
означає, що SQL Server чекав на надсилання рядків клієнту кудись. Я припускаю, що це відображає активність рядків, що споживають SSIS, з таблиці інсценізації.