0

不知何故,我的数据库在写入时太慢了。

目前我使用了 319MB,其中有 2,127,227 行。最初几天,我的计算机每秒能够插入几千行,现在我要花很长时间才能插入 1000 行。现在插入 1000 行(每行 0.165)需要 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
)

我的insert语句只是一个普通的简单sql语句,没有什么特别之处。

我的硬件:

我有一个 2 Quad 2.83 Ghz 和 16GB DDR3 RAM 和 SQL Server 2008 R2 express 版本。插入这些行时,CPU 以 25% 的容量运行。

请让我知道如何优化此表。我真的需要能够搜索所有这些列,所以我认为索引这些列非常重要,我必须将行保留长达 30 天。

我以为 SQL Server Express 版本可以支持 10GB 的数据。

4

1 回答 1

0

添加新记录时,如何生成 UUID?

使用真正随机的 UUID 会导致非常糟糕的索引碎片。当它是聚集索引时,这会更加痛苦,因为数据(行)布局本身会受到影响。

参见NEWID 与 NEWSEQUENTIALID

最引人注目的是 NEWID 系统函数所需的写入次数。这与 69% 的平均页面密度相结合,证明了由叶级插入的随机分布引起的页面分裂。一旦页面填满,就需要将其分成两页,每页 50% 以完成插入。页面拆分不仅导致页面密度不佳,而且还严重分割了数据页面(下一个数据页面有 99% 的可能性不在当前数据页面旁边)。

这仅适用于 50k 条记录 :-) 上面的链接还提供了一个 TSQL 片段来显示表统计信息。

同样,检查辅助索引(并在需要时重建)。

于 2012-07-20T04:35:52.060 回答