2010-07-27 2 views
2

В настоящее время я занимаюсь оптимизацией потребления/памяти нашего приложения. Одна из задач, которые необходимо выполнить, - заменить все blob в таблице, которые соответствуют пустым массивам с нулевыми значениями; это должно уменьшить размер db, потребление памяти и ускорить загрузку. Вот определение таблицы:Ухудшение производительности SQL Server

CREATE TABLE [dbo].[SampleTable](
    [id] [bigint] NOT NULL, 
    [creationTime] [datetime] NULL, 
    [binaryData] [image] NULL, 
    [isEvent] [bit] NULL, 
    [lastSavedTime] [datetime] NULL, 
CONSTRAINT [PK_SampleTable] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

Я обновил таблицу и заменить значение изображения поля (BinaryData) с нулевыми значениями в соответствующих случаях (данные, соответствующее пустые массивы в приложении). Теперь я наблюдаю ухудшение производительности при запуске тривиального SELECT * FROM SampleTable.

Первоначально эти поля, которые были обновлены, имели длину = 512 байт, но не уверены, имеет ли это значение.

Любые идеи, почему выборка блоков, содержащих значения NULL, занимает больше времени, чем выбор реальных двоичных данных, даже если данные одинаковы для разных строк?

+0

Вы уверены, что вы сравниваете яблоки с яблоками? Какие две команды SQL вы использовали? Вы запускали их из одного и того же места/окружения? SSMS? –

+0

Извините за неясность: в обоих случаях я запускаю тот же запрос «Выберите * из таблицы». Я проверил производительность двумя разными способами: 1. Из студии управления 2. Запустите приложение, подключенное к db, и запустите запрос и проверите результаты в профилировщике SQL. Результаты были одинаковыми в обоих случаях. – Daniel

+0

Что такое тип '[dbo]. [Image]'? Это настраиваемый тип данных CLR? –

ответ

0

Позвольте мне помочь вам сформулировать этот вопрос:

У вас есть SQL-сервер делает сканирование таблицы во время тестирования every.single.record. для нулевого значения с одной стороны, по сравнению с другой, где у вас есть сервер sql, делающий массивную свалку ВСЕХ записей ...

Если ваши капли относительно невелики, то это довольно очевидно, что было бы быстрее .. .

1

Я не знаю ответа на этот вопрос. Я пробовал следующий тест, хотя и получил результат, который я нашел удивительным.

CREATE TABLE [dbo].[SampleTable](
    [id] [BIGINT] NOT NULL, 
    [creationTime] [DATETIME] NULL, 
    [binaryData] [IMAGE] NULL, 
    [isEvent] [BIT] NULL, 
    [lastSavedTime] [DATETIME] NULL, 
CONSTRAINT [PK_SampleTable] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
) 
) 

INSERT INTO [dbo].[SampleTable] 
SELECT 1, GETDATE(), 
0x1111, 
1, GETDATE() 

INSERT INTO [dbo].[SampleTable] 
SELECT 2, GETDATE(), 
0x2222, 
2, GETDATE() 

INSERT INTO [dbo].[SampleTable] 
SELECT 3, GETDATE(), 
NULL, 
3, GETDATE() 


UPDATE [dbo].[SampleTable] SET [binaryData] = NULL 
WHERE [id]=2 

Глядя на это в SQL Internals Viewer я с удивлением увидеть разницу между подрядом я вставленным в NULL и один я обновленный до NULL.

Похоже, что даже когда значение обновляется до NULL, по какой-то причине оно не просто устанавливает растровое изображение NULL и все равно должно следовать указателю на другую страницу LOB_DATA.

Поставлен в NULL

Inserted http://img809.imageshack.us/img809/9301/row3.png

Обновлен NULL

Updated http://img84.imageshack.us/img84/420/row2.png

Смежные вопросы