我目前正在处理应用程序的性能/内存消耗优化。要执行的任务之一是替换表中与空值对应的所有blob,并使用空值;这应该减少db大小,内存消耗和加速负载。这是表定义:
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]
我更新了表并用适当的NULL值替换了图像字段值(binaryData)(数据对应于应用程序中的空数组)。现在,我观察到在运行普通的SELECT * FROM SampleTable时性能下降。
最初那些已更新的字段长度= 512字节,但不确定是否重要。
为什么选择包含NULL值的blob需要比选择实际二进制数据更长的时间,即使不同行的数据相同也是如此?
答案 0 :(得分: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
页面的指针。
插入为空
Inserted http://img809.imageshack.us/img809/9301/row3.png
更新为NULL
答案 1 :(得分:0)
让我帮你重述一下:
你有sql server在测试every.single.record时进行表扫描。一方面是null值,另一方面是sql server正在大量转储所有记录...
如果你的斑点相对较小,那么很明显哪一个会更快......