基于记录版本的分区表

时间:2015-01-25 12:56:36

标签: sql sql-server tsql

我有一个给定的财务应用程序,它具有非常大的表,它们或多或少具有以下形式:

CREATE TABLE ProjectAccounts (
  RecordId BIGINT PRIMARY KEY, 
  AccountId GUID NOT NULL, 
  Version BIGINT, 
  -- some data
)

由于业务要求需要保留旧版本的记录,因此通过创建新版本的记录并增加字段版本来完成此表中的更改。

我想要做的是以这样的方式对表进行分区,即只有最新版本的记录(最高版本号)保留在主分区中,而过时的记录应该移动到阴影分区中。

这样做的最佳方法是什么?有更好的方法吗?

<小时/> 来自同事的其他想法:

  • 最新版本的记录应该是一个神奇的值(即-1,0或1)
  • 将旧记录移动到存档表中(即使用触发器)

但是,我担心触发器(几乎总是坏的)可能会对性能产生影响,更新(搜索和锁定)以及通过搜索多个表而增加的复杂性。

1 个答案:

答案 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
  1. 使用创建的文件组附加文件。您可以使用以下查询来执行此操作:
  2. 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
    
    1. 创建分区功能:
    2. USE [YourTableName]
      GO
      CREATE PARTITION FUNCTION [Newpf](int) AS RANGE RIGHT FOR VALUES (0, 1)
      GO
      
      1. 创建分区方案
      2. USE [YourTableName]
        GO
        CREATE PARTITION SCHEME [PFScheme] AS PARTITION [Newpf] TO ([PRIMARY],    [Secondary], [Secondary])
        GO
        
        1. 现在将分区功能和方案附加到现有表。以下图片将描述如何做到这一点。 enter image description here enter image description here enter image description here enter image description here enter image description here
        2. 你完成了。

          1. 让我们通过以下查询检查每个分区中的记录数:
          2. SELECT $PARTITION.Newpf(IsLatestVersion)  AS PARTITIONID,
            COUNT(* ) AS ROW_COUNT
            FROM     DBO.ProjectAccounts
            GROUP BY $PARTITION.Newpf(IsLatestVersion) 
            ORDER BY PARTITIONID
            

            我得到了http://prntscr.com/5wuvu8