2012-07-20 63 views
0

不知何故,我的數據庫寫入時太慢。SQL Server:優化表設計與巨大的數據記錄的建議

目前我使用了319MB,其中有2,127,227行。前幾天我的電腦每秒能夠插入幾千行,現在我永遠需要插入1千行。現在需要165秒來插入1千行(每行0.165)。我需要能夠插入10,000每分鐘(每行0.006)

請參閱下面我的表和服務器規格的設計,讓我知道你是否可以幫助我優化這一點。謝謝。

Current usage report 
Records 2,127,227 
Reserveed KB 323,088 
Data(KB) 177,088 

我的檯面設計是這樣的,我做指數[LoginID] ASC,[ProductID] ASC, [ProductModifiedDate]

CREATE TABLE [dbo].[ProductTable](
    [ID] [uniqueidentifier] NOT NULL, 
    [LoginID] [int] NULL, 
    [ProductID] [int] NULL, 
    [ProductPrice] [decimal](18, 4) NULL, 
    [ProductModifiedDate] [datetime] NULL, 
    [ProductCreatedDate] [datetime] NULL, 
CONSTRAINT [PK_ProductTable] PRIMARY KEY CLUSTERED 
([ID] ASC) 

CREATE NONCLUSTERED INDEX [IX_ProductTable] ON [dbo].[ProductTable] 
(
    [LoginID] ASC, 
    [ProductID] ASC, 
    [ProductModifiedDate] ASC 
) 

我的插入語句只是一個普通的簡單的SQL語句,有沒有什麼特別的。

我的硬件:

我有一個2四核2.83 GHz,具有16GB的DDR3內存與SQL Server 2008 R2速成版。插入這些行時,CPU以25%的容量運行。

請讓我知道如何優化此表。我真的需要能夠搜索所有這些列,所以我認爲索引這些列非常重要,我必須將行保留30天。

我以爲SQL Server Express版本可以支持10GB的數據。

+0

由於您在GUID列上有聚簇索引,因此您的索引將具有**可怕的**碎片量 - 並且每次插入更多行時會變得更糟。您需要(a)至少重建索引以限制碎片,或者(b)更好:使用除GUID之外的其他內容作爲集羣密鑰。 GUID對於集羣密鑰來說是一個非常糟糕的選擇 - 請參閱[GUIDs PRIMARY KEYs和/或集羣密鑰](http://www.sqlskills。COM /博客/ KIMBERLY /後/的GUID-AS-PRIMARY密鑰-安道爾最聚類-key.aspx) – 2012-07-20 04:58:57

回答

0

當您添加新記錄時,您如何生成UUID?

使用真正的隨機UUID可能會導致很糟糕索引碎片。這是額外的痛苦它是一個聚集索引,因爲數據(行)佈局本身受到影響。

NEWID vs NEWSEQUENTIALID參見

最引人注目的是由NEWID系統功能所需的寫入次數。這與69%的平均頁面密度相結合,證明了插頁在葉級別隨機分佈引起的頁面分裂。一旦頁面填滿,需要將其分成兩頁,每頁50%,以便插入完成。不僅頁面分割導致頁面密度不佳,而且數據頁面分段嚴重(有99%的概率,下一個數據頁面不在當前頁面的下一個)。

而這僅僅是爲了50K記錄:-)上面的鏈接還提供了一個TSQL片段顯示錶的統計信息。

同樣,檢查輔助索引(並在需要時重建)。