2010-07-27 125 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