分区是否允许多个批量加载?

时间:2010-04-07 08:38:59

标签: sql-server

我有一个包含许多“客户”数据的数据库。目前,我们经常使用.Net SqlBulkCopy将数万行插入多个表中,导致整个表在事务期间被锁定且无法访问。

由于我们的大多数业务流程都依赖于一次仅访问一个客户端的数据,因此我们希望能够为一个客户端加载数据,同时更新另一个客户端的数据。

为了让事情变得更有趣,所有PK,FK和聚簇索引都在GUID列上(我正在考虑更改它)。

我正在考虑将ClientID添加到所有表中,然后对此进行分区。 这会给我提供我需要的功能吗?

2 个答案:

答案 0 :(得分:2)

我没有使用SQL Server的内置分区功能,但这是我特别感兴趣的东西。我的理解是这可以解决你的问题。

来自this article

  

这允许你操作   甚至是性能分区   关键操作,如   重新索引,而不影响   其他

关于Kimberly L Tripp分区的一篇很好的白皮书是here。非常值得一读 - 我甚至不会试着解释它 - 详细介绍了所有内容。

希望这有帮助。

答案 1 :(得分:1)

您可以在客户端ID上进行分区:是的,但是分区限制为1000个分区,因此在达到硬限制之前是1000个客户端。解决这个问题的唯一方法是开始在多个分区表中使用分区视图 - 它有点乱。

将有助于您的锁定情况:在SQL 2005中,锁升级是行 - >页面 - >表,但在2008年他们引入了一个允许行的新级别 - >页面 - >分区 - >表。因此它可能会绕过它,具体取决于您的SQL版本(未指定)。

如果2008不是一个选项,那么有一个跟踪标志(TF 1211/1224)功能可以关闭锁定升级,但我不会在没有经过严格测试的情况下跳入并使用它。

分区功能仍然是企业向上功能,也会让一些人失望。

使用分区执行数据加载的最理想方式,但避免锁定是将数据放入临时表,然后将数据交换到新分区 - 但这要求数据基于序列(例如datetime),以便可以将新数据引入一个全新的分区,同时最终删除旧数据。 (滚动分区窗口。)