我有一个给定的财务应用程序,它具有非常大的表,它们或多或少具有以下形式:
CREATE TABLE ProjectAccounts (
RecordId BIGINT PRIMARY KEY,
AccountId GUID NOT NULL,
Version BIGINT,
-- some data
)
由于业务要求需要保留旧版本的记录,因此通过创建新版本的记录并增加字段版本来完成此表中的更改。
我想要做的是以这样的方式对表进行分区,即只有最新版本的记录(最高版本号)保留在主分区中,而过时的记录应该移动到阴影分区中。
这样做的最佳方法是什么?有更好的方法吗?
<小时/> 来自同事的其他想法:
但是,我担心触发器(几乎总是坏的)可能会对性能产生影响,更新(搜索和锁定)以及通过搜索多个表而增加的复杂性。
答案 0 :(得分:1)
如果要创建两个分区,可以为此列添加一个额外的列“IsLatestVersion”使用int数据类型。
设置“IsLatestVersion”= 0,对于最近的记录并插入“IsLatestVersion”= 1的新记录,您可能需要修改代码文件以保持此状态,或者您可以创建小触发器来执行此任务。
现在可以使用表格结构了。让我们在这张桌子上创建分区。为此,您需要按照以下步骤操作: 1.将两个文件组添加到当前数据库。您可以通过以下查询添加文件组:
ALTER DATABASE CurrentDB ADD FILEGROUP [Filegroup_2001] GO ALTER DATABASE CurrentDB ADD FILEGROUP [Filegroup_2002] GO
ALTER DATABASE CurrentDB ADD FILE(NAME = N'data_2001', FILENAME = N'C:\data_2001.ndf', SIZE = 5000MB, MAXSIZE = 10000MB, FILEGROWTH = 500MB) TO FILEGROUP [Filegroup_2001] GO
USE [YourTableName] GO CREATE PARTITION FUNCTION [Newpf](int) AS RANGE RIGHT FOR VALUES (0, 1) GO
USE [YourTableName] GO CREATE PARTITION SCHEME [PFScheme] AS PARTITION [Newpf] TO ([PRIMARY], [Secondary], [Secondary]) GO
你完成了。
SELECT $PARTITION.Newpf(IsLatestVersion) AS PARTITIONID, COUNT(* ) AS ROW_COUNT FROM DBO.ProjectAccounts GROUP BY $PARTITION.Newpf(IsLatestVersion) ORDER BY PARTITIONID