听起来就像一个中等服务器上相当易于管理的负载 - 您还没有说过这些插入和更新正在进行时(除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覆盖了许多大的读操作,从而减少了你对数据库的读负载,以支持插入/更新的基本读取小读取)和您的应用程序的交易部分(即说客户服务信息屏幕将使用常规数据库,而您的小时仪表板将使用辅助数据库)。
您能给我们一些关于您期望的负载的想法吗? – gbn 2010-03-20 15:51:01