2010-07-27 132 views
2

我目前正在处理性能/内存消耗优化的应用程序。要执行的任务之一是将一个表中与空数组对应的所有斑点替换为空值;这应该减少分贝大小,内存消耗和加速负载。下面是表定义: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] 

我更新的表,并替换为NULL值在适当情况下(对应于空白在应用阵列的数据)的图像字段的值(binaryData)。现在,我观察运行普通SELECT * FROM SampleTable时的性能下降情况。

最初那些已更新的字段的长度为512字节,但不确定是否重要。

即使数据对于不同的行是相同的,为什么选择包含NULL值的blob所需的时间比选择真实的二进制数据还要长?

+0

你确定你是比较苹果和苹果吗?你使用的两个SQL命令是什么?你是否从同一个地方/环境中运行它们? SSMS? – 2010-07-27 20:24:43

+0

对不起,不清楚:我在这两种情况下运行相同的'选择*从表'查询。我以两种不同的方式检查了性能: 1.从Management studio 2.运行连接到db的应用程序并运行查询并检查SQL分析器中的结果。 结果在两种情况下都是相似的。 – Daniel 2010-07-27 20:32:29

+0

什么是类型'[dbo]。[image]'?这是一个自定义的CLR数据类型吗? – 2010-07-27 21:58:23

回答

0

让我帮你重申这一点:

你的SQL Server做一个表扫描,同时测试every.single.record。对于一方的空值,而另一方你有sql服务器做大量所有记录的转储...

如果你的blob比较小,那么很明显哪一个会更快。

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