Запрос пустых записей, где включен файловый поток - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть таблица, для которой мы только что включили 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 записи, которые произошли после оператора обновления, и заставить эти документы переместиться.

1 Ответ

1 голос
/ 02 апреля 2012

Вы не можете сделать:

select DocumentId, FileName from docslist WHERE DATALENGTH(FileData)>0

На mdsn написано:

DATALENGTH особенно полезен для данных varchar, varbinary, text, image, nvarchar и ntextтипы, потому что эти типы данных могут хранить данные переменной длины.

DATALENGTH из NULL равен NULL.

Ссылка здесь

...