我正在使用SQL Server 2005.有一个审计跟踪表,包含超过1,000,000,000行。我打算存档这张桌子。当我使用nolock
进行简单选择时,我仍然可以找到阻塞(可能是使用其他进程进行IO阻塞?)。那么这种情况有什么最好的做法吗?
答案 0 :(得分:4)
对于一个很大的表,您将需要找到一些有效的分片/分区策略。在这种意义上,归档往往是一种分区形式,但不是一种好的归档,因为你经常想要查询当前和归档。在最糟糕的情况下,你最终会在归档和当前表的UNION上使用SELECT,这比你根本没有拆分它们更糟糕。
通常会找到一些其他方法来切片数据,例如记录类型或其他内容,这样做会更好。但是,如果您要按日期拆分它,请确保您不会查询存档+当前数据集。
此外,SQL Server 2005+默认情况下不启用MVCC。但是,如果启用MS调用快照隔离,则可以执行此操作。请参阅Serializable vs. Snapshot Isolation Level。
不启用此功能的效果是,未提交的INSERT或UPDATE将阻止另一个事务中的SELECT,直到第一个事务提交或回滚为止。这可能会导致不必要的锁定并限制您的可伸缩性。
答案 1 :(得分:3)
创建数据库备份并将其还原到存档位置。
答案 2 :(得分:2)
一次选择10亿行会对服务器造成压力,无论你怎么做。
反而批量生产,一次说1000行。 bcp工具自动执行此操作。或者使用SSIS将数据复制到另一个数据库中 - 它几乎完全相同。