Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 优化只读sql数据库的提示_Sql Server_Optimization - Fatal编程技术网

Sql server 优化只读sql数据库的提示

Sql server 优化只读sql数据库的提示,sql-server,optimization,Sql Server,Optimization,我有一个中型SQL Server 2008数据库,其中包含精算数据。它的所有用例都是只读查询。在这种情况下,我应该考虑什么特别的优化吗?或者我应该坚持使用优化数据库的常规规则吗?如果它是只读的,那么您可以做的一件事就是将索引放在任何可能有用的东西上(空间允许)。通常,添加索引是写操作的性能影响和读操作的性能增益之间的折衷。如果你摆脱了写作,这就不再是一种折衷 当您加载数据库时,您希望删除所有/大多数索引,执行加载,然后将索引放回表中。 我不确定您认为什么是“正常规则”,但这里有一些建议。 如果

我有一个中型SQL Server 2008数据库,其中包含精算数据。它的所有用例都是只读查询。在这种情况下,我应该考虑什么特别的优化吗?或者我应该坚持使用优化数据库的常规规则吗?

如果它是只读的,那么您可以做的一件事就是将索引放在任何可能有用的东西上(空间允许)。通常,添加索引是写操作的性能影响和读操作的性能增益之间的折衷。如果你摆脱了写作,这就不再是一种折衷


当您加载数据库时,您希望删除所有/大多数索引,执行加载,然后将索引放回表中。

我不确定您认为什么是“正常规则”,但这里有一些建议。
  • 如果你100%确定它是只读的,你可以。这是最快的读取设置,但如果您正在写入表,则会导致幻象读取和脏读取

  • 如果有视图,请使用索引视图(为它们创建聚集索引)。由于它们永远不需要更新,因此性能损失将被抵消

在数据库中:

  • 去规范化它
  • 在需要的地方使用更多索引
  • 如果在报告中需要,请聚合一些数据
  • 节目中:

  • 使用读取未提交隔离级别
  • 使用自动提交来转义长期事务
  • 对数据进行非规范化处理
  • 应用适当的索引
  • 预先计算聚合
  • 在条带化磁盘上实现数据库
  • 我从未见过这样做,但如果你能以某种方式将整个东西加载到内存中(RAM磁盘???),那会非常快,对吗

  • 对于只读表,考虑更改索引以使用100%的填充因子。

    这将增加每个数据页上的数据量。每页数据越多,读取的页面越少,I/O越少,因此性能越好


    我喜欢这个选项,因为它可以在不更改代码或表的情况下提高性能。

    对于性能调整,您可以做几件事。非规范化工作。正确的聚集索引取决于查询数据的方式。我不建议使用nolock提示。我会使用快照隔离级别

    数据库在磁盘上的布局也很重要。对于只读性能,我建议使用Raid 10,将mdf和ldf分别用于独立的磁盘轴。通常,对于生产数据库,数据为Raid 5,日志为Raid 1。确保每个cpu都有一个tempdb文件,用于排序,一个好的开始大小是5gb数据,每个cpu有1GB日志。还要确保通过showplan运行查询或过程,以帮助尽可能优化它们。确保“服务器设置”中的“并行性”处于启用状态


    另外,如果您有时间和空间实现最佳性能,我会准确地规划数据在磁盘上的位置,创建文件组并将它们放在每个卷中完全独立的卷上,这些卷是独立的磁盘。

    一个策略是向数据库中添加一个只读文件组,并将只读表放在那里。只读文件组允许SQLServer进行许多优化,包括消除所有锁等

    除了标准DB优化外:

  • 确保所有表和索引都没有碎片
  • 考虑添加由于更新成本过高而可能避免的索引

  • 为什么要在加载时删除所有/大部分索引?加载数据时,您可能会获得稍微好一点的性能,但您有可能无法将索引放回。不仅如此,如果您将索引取下并加载坏数据,您将不会看到问题,除非您尝试将索引放在那里(如果您记得的话)。加载数据是一次性的,它不是一直都在发生的事情。如果插入时间稍长,那也没什么大不了的。拥有有意义的数据,无价的.Wlater,删除索引并重新创建它们是加载的常见方式,它可以极大地加快加载速度。您不必记得将它们重新加载,它是SSIS包的一部分,负责加载。我认为您正在考虑删除通常不希望执行的PK和FK。正如HLGEM所说,我并不是说您应该删除PK/FK(尽管在某些情况下,甚至可能更倾向于这样做)。在加载大量数据时,可能会涉及到很多索引,但两者之间的区别远不止“稍微长一点”。删除非唯一索引是可以的。任何(非冗余)唯一索引或其他约束都应该保留。它们是否应该保留是一个判断调用。如果我有一个准确的数据源,并且删除FKs将显著提高导入性能,那么我将权衡这一优势与必须执行恢复的风险,因为将FKs添加回时由于数据错误而失败。将坏数据导入数据库并不意味着必须将其保留在数据库中。显然,任何ETL过程都应该在最后包含一个回滚计划,以防出现问题。