2010-03-20 83 views
6

我希望对在线资源(博客,指南等 - 不是论坛)提出一些建议,以帮助我成功设计用大量数据操作的高性能SQL Server数据库,以及在数据更新和每分钟查询方面负载很重。用于高性能SQL Server数据库设计的资源

对此提出建议?

编辑

我谈论的负载主要是在数据营业额方面。主表具有多达一百万行,大约30个不同大小的数据字段,每天更新大约30-40000个新行,并且每天至少更新200000行新数据。这些更新在一天中持续发生。除此之外,所有更改和更新都需要从数据库中全天提取,以保持最新的Lucene索引。

+0

您能给我们一些关于您期望的负载的想法吗? – gbn 2010-03-20 15:51:01

回答

4

听起来就像一个中等服务器上相当易于管理的负载 - 您还没有说过这些插入和更新正在进行时(除Lucene的提取外)发生了什么样的读取操作以及大小(以字节为单位/ data type-wise)的数据(你给出的基数看起来很好)。

在这一点上,我只想用regular SQL Server best practices推荐 - 确定的模式是合适的(归一化,则非规范化仅在必要时),review execution plans,使用索引优化向导,use the DMVs找到未使用的索引并删除它们,choose clustered indexes carefully要管理页面拆分,请谨慎选择数据类型和大小,并尽可能使用use referential integrity and constraints where possible to give the optimizer as much help。除此之外还有性能计数器,并确保您的硬件/软件安装已调整好。

在很多情况下,您绝对不需要超出这个范围来重新设计架构。

但是,即便如此,如果读取负载很重,插入和更新可能会导致读取和写入之间的锁定问题,然后您正在为应用程序查看架构决策。

另外,每天更新一百万行和200k不会让我担心 - 但是你提到了Lucene(即全文索引),所以大概有些列是相当大的。更新大型列并导出它们显然需要更长的时间 - 以及更多的带宽和IO。与传统数据类型列在一个狭窄的百万行表中的30列将是一个完全不同的故事。您可能需要查看更新配置文件,并查看是否需要垂直分区表以将某些列从行中移出(如果它们较大,则它们将已存储在行外)以改善锁定行为。

因此,当您的读取负载过重时,关键是:插入和更新需要尽可能快,锁定尽可能少(避免锁升级),更新尽可能少的索引以支持读取操作。

如果读取的负载过重(使插入/更新开始发生冲突),但不需要100%的最新信息(比如5分钟或15分钟的延迟不明显),那么您可以拥有一个只读数据库的维护版本(通过复制完全相同,对性能进行不同索引,非规范化或不同建模 - 如维度模型)。也许你的Lucene索引可以包含额外的信息,这样昂贵的读操作全部停留在Lucene中 - 也就是说Lucene覆盖了许多大的读操作,从而减少了你对数据库的读负载,以支持插入/更新的基本读取小读取)和您的应用程序的交易部分(即说客户服务信息屏幕将使用常规数据库,而您的小时仪表板将使用辅助数据库)。

+0

非常感谢您的详细回复 - 将不得不通过这个来消化这一切。 – 2010-03-21 01:15:21