SQL Server性能恶化

时间:2010-07-27 20:05:07

标签: sql-server performance

我目前正在处理应用程序的性能/内存消耗优化。要执行的任务之一是替换表中与空值对应的所有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需要比选择实际二进制数据更长的时间,即使不同行的数据相同也是如此?

2 个答案:

答案 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

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

答案 1 :(得分:0)

让我帮你重述一下:

你有sql server在测试every.single.record时进行表扫描。一方面是null值,另一方面是sql server正在大量转储所有记录...

如果你的斑点相对较小,那么很明显哪一个会更快......