将有多个文件组帮助加快我的数据库?

问题描述:

目前,我正在开发一款使用MS SQL Server 2005进行相当密集计算的产品。在高层次上,我的产品架构基于“运行”概念,每次我执行一些分析时,它都会存储在一系列的运行表(每运行约100个表)。将有多个文件组帮助加快我的数据库?

我遇到的问题是,几个月后运行次数增加到大约1,000次左右时,数据库上的性能似乎会下降,特别是简单的查询,如检查表的存在或创建视图可能需要一秒到两秒。

我听说使用多个文件组,我目前没有这样做,可以帮助。这是真的,如果是这样,为什么/如何帮助?此外,如果还有其他建议,即使是其他建议,使用较少的表格,我也会向他们开放。我只是想加快数据库的速度,并希望将其扩大到可扩展的状态。

在性能方面,使用单独的文件/文件组的巨大好处是它可以让你的数据分布在多个物理磁盘上。这是有益的,因为使用多个磁盘,可以同时处理多个数据请求(并行通常比串行更快)。所有其他的事情都是平等的,这会使性能受益,但是多少取决于你的特定数据集和你正在运行的查询。

从您的描述来看,您关心的缓慢操作是创建表格并检查表格的存在。如果每次运行生成100个表,那么在1000次运行后,您有100,000个表。我没有太多经验在单个数据库中创建多个表,但是您可能会按下跟踪数据库模式的系统表的限制。在这种情况下,通过将表分布到多个数据库(这些数据库仍可以全部位于同一个SQL Server实例中),可能会看到一些好处。

通常,SQL Profiler工具是查找缓慢查询的最佳起点。有数据列表明每个SQL批处理的CPU和IO成本,这应该指向最差的违规者。一旦找到问题查询,我将使用查询分析器为这些查询中的每一个生成查询计划,并查看是否可以分辨是什么让他们变得很慢。通过打开查询窗口,输入查询并按Ctrl + L来完成此操作。对可能很慢的完整讨论会填满整本书,但要查找的好东西是表扫描(对于大表非常缓慢)和低效连接。最后,您可以简单地通过重写查询来改进事情,或者您可能必须对表格模式进行更广泛的更改。例如,也许有办法每次运行只创建一个或几个表格,而不是1000个。有关您的特定设置的更多细节将帮助我们给出更详细的答案。

我还建议本网站大量提示,就如何使事情更快:

http://www.sql-server-performance.com/

如果你把它们放在不同的驱动器上 - 不是逻辑的,而是物理驱动器,所以IO不会让你失望太多。

文件组位于不同的物理驱动器上会带来最大的性能提升,也可以拆分索引所在的位置,以便表写入和索引访问达到不同的磁盘。在分区方面你可以做很多事情,但总体概念是最大速度影响的来源。

它可以帮助提高性能。将某些表格/元素移动到不同的文件区域/磁盘部分。这可以在一定程度上减少影响数据库的外部碎片量。

我还会考虑一些其他因素,例如tracesql,以确定查询等为什么会变慢 - 还有其他因素,例如查询统计信息,SP重新编译等,这些因素更容易修复,并且可以为您带来更大的性能提升。

约1000个什么?单行写入?多行交易?删除?

一般的技巧是将数据文件和日志文件放在单独的物理驱动器上。 SQL Server会跟踪每次写入日志,因此让不同驱动器中的这些日志可以为您提供更好的性能。

但是SQL Server调整依赖于应用程序实际在做什么。有一些一般的提示,但你必须测量自己的东西... ...

当你每次运行说说100桌,实际上,你的意思是你要创建新的SQL表?如果是这样,我认为你的应用程序的架构可能是问题。我无法想象一种情况,您需要这么多的新表格,而不是多次重复使用相同的表格,只需添加一列或两列来区分运行。

如果您已经重复使用同一组表并且新的表格只是表格中的其他行,那么问题可能只是新数据随着时间的推移而损害了性能。例如:

  1. 表/索引可能会在一段时间后分段。确保你所有的表都有一个聚集索引。使用sys.DM_DB_INDEX_PHYSICAL_STATS检查碎片,并在需要时使用REBUILD选项执行ALTER INDEX以对碎片进行碎片整理。
  2. 这些表格可能太大,所以在较小的表格上,小表格上的低效率现在很明显。在表格中查找适当的索引以提高性能。
  3. SQL Server将缓存查询计划(尤其是存储过程),但是如果表中的数据随时间显着变化,那么查询计划可能不再合适。查看你的存储过程的sp_recompile,看看是否需要。

#2是我在现实世界中最经常看到的罪魁祸首。开发人员倾向于开发仅使用一小部分测试数据,并忽略适当的索引,因为您可以使用20行的表执行几乎任何操作,并且看起来很快。

希望这有助于

拆分到不同的物理驱动器的表。如果你有那么多的磁盘IO,你需要一个体面的IO解决方案。 Raid 10,快速磁盘,将日志和数据块分成独立的驱动器。

重新检查您的架构 - 您可以使用多个数据库吗?如果您一次创建1000张表格,您很快就会遇到一些我以前不必处理的有趣瓶颈。多个数据库应该解决这个问题。想想有一个包含所有主要元数据的“控制”数据库,然后是包含实际数据的卫星数据库。

你没有提及你的服务器的任何规格 - 但是当我们从8GB到20GB RAM时,我们看到了性能的不断提升。