Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 2005 SQL 2005数据库中的海量表需要更好的性能!_Sql Server 2005_Scalability_Sql Server Performance - Fatal编程技术网

Sql server 2005 SQL 2005数据库中的海量表需要更好的性能!

Sql server 2005 SQL 2005数据库中的海量表需要更好的性能!,sql-server-2005,scalability,sql-server-performance,Sql Server 2005,Scalability,Sql Server Performance,我正在开发一个数据驱动的web应用程序,它使用SQL 2005(标准版)数据库 其中一个表相当大(800多万行,约30列)。表的大小明显影响通过存储过程从表中选择项目的网站的性能。该表已编制索引,但由于表中的行数太多,性能仍然很差-这是问题的一部分-表的读取与更新一样,因此我们无法添加/删除索引而不使其中一个操作变得更糟 我在这里的目标是提高从表中选择项目时的性能。该表包含“当前”数据和旧数据/几乎未触及的数据。在此阶段,我们能想到的最有效的解决方案是将表格分为两部分,即一部分用于旧项目(在某个

我正在开发一个数据驱动的web应用程序,它使用SQL 2005(标准版)数据库

其中一个表相当大(800多万行,约30列)。表的大小明显影响通过存储过程从表中选择项目的网站的性能。该表已编制索引,但由于表中的行数太多,性能仍然很差-这是问题的一部分-表的读取与更新一样,因此我们无法添加/删除索引而不使其中一个操作变得更糟

我在这里的目标是提高从表中选择项目时的性能。该表包含“当前”数据和旧数据/几乎未触及的数据。在此阶段,我们能想到的最有效的解决方案是将表格分为两部分,即一部分用于旧项目(在某个日期之前,比如2005年1月1日),另一部分用于新项目(等于或在2005年1月1日之前)


我们知道分布式分区视图之类的东西,但所有这些功能都需要企业版,而客户不会购买企业版(不,向它扔硬件也不会发生)。

您可以随时推出自己的“穷人分区/DPV”,即使闻起来不是正确的方式。这只是一种广义的概念方法:

  • 为当年的数据创建一个新表-相同的结构,相同的索引。将写入主大表的存储过程调整为写入两个表(只是暂时)。我建议将存储过程中的逻辑设置为IF CURRENT_TIMESTAMP>='[某个没有时间的完整日期]'-这样可以很容易地回填该表中的数据,该表在对开始记录在该表中的过程进行更改之前就已经存在了

  • 使用主表中的“选择到”,为历史记录中的每一年创建一个新表。您可以在同一实例上的不同数据库中执行此操作,以避免当前数据库中的开销。我认为历史数据不会改变,所以在另一个数据库中,您甚至可以在完成时将其设置为只读(这将显著提高读取性能)

  • 拥有整个表的副本后,可以创建仅引用当前年份的视图、将2005引用到当前年份的另一个视图(通过在当前表和其他数据库中>=2005的表之间使用UNION ALL),以及引用所有三组表的另一个视图(上面提到的,以及2005年之前的表格)。当然,你可以进一步细分,但我只想把这个概念保持在最低限度

  • 将读取数据的存储过程更改为“更智能”-如果请求的日期范围在当前日历年内,则使用仅本地的最小视图;如果日期范围>=2005,则使用第二个视图,否则使用第三个视图。如果您所做的不仅仅是插入仅与当前年份相关的新数据,则可以对写入的存储过程遵循类似的逻辑r

  • 此时,您应该能够停止插入到海量表中,并且在证明一切正常后,删除它并回收一些磁盘空间(我的意思是释放数据文件中的空间以供重用,而不是执行收缩数据库-因为您将再次使用该空间)


  • 我不知道您的情况的所有细节,但如果您有问题或顾虑,请跟进。我在几个迁移项目中使用过这种方法,包括目前正在进行的一个项目。

    您可以随时推出自己的“穷人分区/DPV”即使闻起来不是正确的方法。这只是一种广义的概念方法:

  • 为当前年份的数据创建一个新表-相同的结构,相同的索引。将写入主大表的存储过程调整为写入两个表(只是暂时)。我建议将存储过程中的逻辑设置为IF current_TIMESTAMP>='[某个没有时间的完整日期]“-这将便于回填此表中的数据,该表在更改开始记录的过程的日期之前

  • 使用主表中的SELECT INTO为历史记录中的每一年创建一个新表。您可以在同一实例上的不同数据库中执行此操作,以避免当前数据库中的开销。我认为历史数据不会更改,因此在另一个数据库中,您甚至可以在执行此操作时将其设置为只读(这将显著提高读取性能)

  • 拥有整个表的副本后,可以创建仅引用当前年份的视图、将2005引用到当前年份的另一个视图(通过在当前表和其他数据库中>=2005的表之间使用UNION ALL),以及引用所有三组表的另一个视图(上面提到的,以及2005年之前的表格)。当然,你可以进一步细分,但我只想把这个概念保持在最低限度

  • 将读取数据的存储过程更改为“更智能”-如果请求的日期范围在当前日历年内,则使用仅本地的最小视图;如果日期范围>=2005,则使用第二个视图,否则使用第三个视图。如果您所做的不仅仅是插入仅与当前年份相关的新数据,则可以对写入的存储过程遵循类似的逻辑r

  • 此时,您应该能够停止插入到海量表中,并且在证明一切正常后,删除它并回收一些磁盘空间(我的意思是释放数据文件中的空间以供重用,而不是执行收缩数据库-因为您将再次使用该空间)

  • 我不知道你情况的所有细节,但如果你有问题或担忧,请跟进。我已经在几次偏头痛中使用过这种方法