【发布时间】:2010-12-24 23:56:36
【问题描述】:
我有一个中型 SQL Server 2008 数据库,其中包含精算数据。它的所有用例都是只读查询。考虑到这种情况,我应该考虑任何特殊的优化吗?还是我应该坚持优化数据库的常规规则?
【问题讨论】:
我有一个中型 SQL Server 2008 数据库,其中包含精算数据。它的所有用例都是只读查询。考虑到这种情况,我应该考虑任何特殊的优化吗?还是我应该坚持优化数据库的常规规则?
【问题讨论】:
一种策略是向您的数据库添加一个只读文件组,并将您的只读表放在那里。只读文件组允许 SQL Server 进行许多优化,包括消除所有锁等。
除了标准的数据库优化:
【讨论】:
在数据库中:
在程序中:
【讨论】:
如果它是只读的,您可以做的一件事是将索引放在几乎任何可能有帮助的东西上(空间允许)。通常,添加索引是在写入性能下降和读取性能提升之间进行权衡。如果您摆脱写入,则不再是一种权衡。
当您加载数据库时,您可能希望删除所有/大部分索引,执行加载,然后将索引放回表中。
【讨论】:
我不确定你认为什么是“正常规则”,但这里有一些建议。
如果您 100% 确定它是只读的,您可以set the transaction isolation level to READ_UNCOMMITTED。这是可能的最快读取设置,但如果您正在写入表,则会导致幻读和脏读。
如果您有视图,请使用索引视图(为它们创建聚集索引)。由于它们永远不必更新,因此可以消除性能损失。
【讨论】:
【讨论】:
对于只读表,请考虑更改索引以使用 100% 的填充因子。
这将增加每个数据页上的数据量。每页数据更多,要读取的页面更少,I/O 更少,因此性能更好。
我喜欢这个选项,因为它无需更改代码或更改表即可提高性能。
【讨论】:
对于性能调整,您可以做几件事。 Denormailzation 有效。适当的聚集索引取决于如何查询数据。我不建议使用 nolock 提示。我会使用快照隔离级别。
您的数据库在磁盘上的布局方式也很重要。对于只读性能,我建议使用 Raid 10,将 mdf 和 ldf 分别用于隔离的主轴。通常,对于生产数据库,数据为 Raid 5,日志为 Raid 1。确保每个 cpu 都有一个 tempdb 文件,用于排序,一个好的起始大小是 5gb 数据和每个 cpu 1 gb 日志。还要确保通过 showplan 运行查询或过程,以帮助尽可能优化它们。确保在服务器设置中启用了并行性。
此外,如果您有时间和空间来获得最佳性能,我会准确地绘制出数据在磁盘上的位置,创建文件组并将它们放在完全独立的卷上,这些卷是每个卷中的独立磁盘。
【讨论】: