У меня есть таблица, для которой мы только что включили FileStreams.Мы создали новый столбец varbinary и установили его для хранения в файловом потоке.Затем мы скопировали все из существующего столбца в новый, чтобы данные файла были отправлены в файловую систему.
Пока все хорошо.
Однако мы не смоглипереведите базу данных в автономный режим при выполнении этого (SLA безотказной работы), и было 2 записи из 7400, которые пришли в после оператора обновления, но до того, как мы переименовали столбцы.В настоящее время у нас есть 2 столбца: FileData
и FileDataOld
.Где FileData
- это файл, связанный с файловым потоком.
Средний размер файла немногим более 2 МБ.Итак, я решил выполнить очень простое выражение select, чтобы найти записи, которые не отправлялись:
select DocumentId, FileName
from docslist
where FileData is null
Когда я запустил этот запрос, процессор увеличился до 80% и некоторое время сидел там.В конце концов я убил выбор через 2 минуты, потому что это было просто безумие.
Если я запустил что-то вроде:
select DocumentId, FileName from docslist
Он возвращается почти мгновенно.
Однако, как толькокогда я пытаюсь спросить, где FileData
или FileDataOld
равно нулю, оно уходит навсегда.
Когда я использую Resource Monitor и я запрашиваю 'FileData is null', я вижу, как он вытягивает каждый байт из каждого отдельного документа из файловой системы.Что довольно странно;можно подумать, что информация будет храниться в самой таблице.
Если я запрашиваю FileDataOld is null
, похоже, что он пытается загрузить всю таблицу (16 ГБ) в память.
Как я могу улучшить это ??Мне просто нужно получить 2 записи, которые произошли после оператора обновления, и заставить эти документы переместиться.