我想对在线资源(博客,指南等 - 而不是论坛)提出一些建议,以帮助我擅长设计运行大量数据并在数据周转方面负担沉重的高性能SQL Server数据库和每分钟的查询。
建议?
修改
我所说的负载主要是数据周转率。主表有多达一百万行,大约30个不同大小的数据字段,每天更新大约30-40000个新行,每天至少有200000行用新数据更新。这些更新在一整天内持续发生。除此之外,所有更改和更新都需要在一天内从数据库中提取,以保持较大的Lucene索引。
答案 0 :(得分:4)
在中等服务器上听起来像一个相当可管理的负载 - 你没有说过这些插入和更新正在进行时发生了什么样的读取操作(除了Lucene的提取)和大小(按字节顺序/数据类型的数据(你给出的基数似乎很好)。
此时,我建议只使用regular SQL Server best practices - 确定一个合适的模式(规范化,然后仅在必要时进行非规范化),review execution plans,使用索引调整向导,{{3} }找到未使用的索引并删除它们,use the DMVs来管理页面拆分,仔细选择数据类型和大小,并尽可能choose clustered indexes carefully。除此之外还有性能计数器,并确保您的硬件/软件安装得到优化。
在许多/大多数情况下,您永远不需要超越它来实际重新设计您的架构。
然而,即便如此,如果读取负载很重,插入和更新可能会导致读取和写入之间出现锁定问题,然后您正在查看应用程序的体系结构决策。
此外,每天百万行和200k更新不会让我担心 - 但你提到Lucene(即全文索引),所以可能有些列相当大。更新大型列并导出它们显然需要更长的时间 - 而且带宽和IO要多得多。在具有传统数据类型列的窄百万行表中的30列将是完全不同的故事。您可能希望查看更新配置文件,看看是否需要垂直对表进行分区以将某些列移出行(如果它们很大,它们已经存储在行外)以改善锁定行为。
因此,当您有大量读取负载时,关键是:插入和更新需要尽可能快,尽可能少地锁定(避免锁升级),更新尽可能少的索引以支持读取操作。
如果读取负载太重(以便插入/更新开始冲突)但不需要100%最新信息(例如5分钟或15分钟延迟不明显),您可以阅读仅保留数据库的版本(通过复制相同,不同的性能索引,非规范化或不同建模 - 如维度模型)。也许您的Lucene索引可以包含其他信息,以便昂贵的读取操作都保留在Lucene中 - 即Lucene成为许多大型读取操作的覆盖,从而将您对数据库的读取负载减少到支持插入/更新的基本读取(这些通常是小读取)和应用程序的事务部分(即说客户服务信息屏幕将使用常规数据库,而您的每小时仪表板将使用辅助数据库)。
答案 1 :(得分:3)
您可以尝试使用CodePlex上的SQL Server samples或DatabaseAnswers.com。
答案 2 :(得分:3)
以下是有关在SQL Server中进行故障排除和优化性能的一些资源,我发现这些资源非常有用:
http://updates.sqlservervideos.com/2009/09/power-up-with-sql-server-sql-server-performance.html
特别是,有效使用索引可以成为一个巨大的性能助推器。我认为在大多数情况下,大多数Web应用程序比写入更多的阅读。此外,表达式的可攻击性会对性能产生严重影响。
答案 3 :(得分:2)
由于技术性和复杂性很高,因此首先要对书籍进行更好的探讨。
我将指出创建此网站的人包括几个使用非常大的数据库的人。你可以从中学到很多东西。 http://lessthandot.com/