2010-01-21 68 views
2

我是一个新手,在这里堆栈溢出以及在sql服务器,所以请让我知道如果这个问题是不适当的任何方式:)实现Sql Server读写性能的策略是什么?

那么,我正在开发一个Web应用程序,将用于分析存储在SQL Server 2008数据库中的大量数据。该接口不允许用户更新或插入任何数据,所以除了用户数据的一些更新之外,主要是SELECT命令将被发送到数据库。

每天晚上,系统都会关闭并刷新其他来源的信息。此刷新还将涉及大量数据,因此数据库在此阶段将主要执行INSERT和UPDATE命令。

我已经创建了适当的索引以在SELECTS上实现良好的性能,但是这些索引导致夜间刷新变慢。我想要“两全其美”,所以我搜索了一下,发现一个常见的策略是在写入数据之前删除/禁用所有索引,并在之后重新创建它们。我也听说,更好的方法是限制索引的填充因子,这将使我无法编写用于删除和重新创建索引的脚本。

您认为在这里使用的最佳方法是什么?我的主要目标是良好的性能?我应该使用“fillfactor”-approach,还是应该弄脏并编写脚本来删除/重新创建索引?欢迎任何建议!

+0

避免太多索引 - 只是明确地索引每一列,只是因为你可以,肯定会杀死你的perf! ;-) – 2010-01-21 11:36:06

回答

2

每晚删除/重新创建索引将有所帮助。填充因子只会在插入/更新级别导致分段时提供益处。您可以通过运行DBCC SHOWCONTIG(小心生产,如果DB很大)来检查。

+0

就像补充一样,我们有一个客户流程,每晚处理大约100GB的数据。在我们的例子中,我们删除索引,截断表,做我们的插入,然后添加索引。我们正在谈论数以亿计的记录。这条道路将处理速度提高了40倍。意思是,过去需要20个小时,现在需要30分钟。 – NotMe 2010-01-21 15:01:51

+0

另外,请注意您的恢复模式。当以这种方式处理大量数据时,它变得至关重要。您可能想要尝试使用不同的模型,直到找到能够满足所需恢复功能的性能。 – NotMe 2010-01-21 15:03:18

0

应该提高性能的另一个选择是在系统刷新期间将数据库的恢复模式从完全切换到简单,然后切换回来。

您应该在切换回完整后进行完整备份,但这可能是值得的,最好的方法是针对工作负载&查看。

+0

感谢提示尼克(和克里斯),我不得不承认,我还没有想过恢复模式,直到现在。我会试一试! – Ozzy 2010-01-22 09:32:47