sql server 分区存储

发布时间 2023-04-06 16:06:02作者: Evan.Pei

数据库数据太大影响查询速度,可以将数据库进行横向按时间切割存储。

分区步骤:

1;建立分区几个分区建立几个

--第一步:创建四个文件组,你想分几个区 参数:数据库名,关键字,分组名
 alter database phpDB add filegroup ByIdGroup1
 alter database phpDB add filegroup ByIdGroup2

2;第二步:每个分区文件的次数据文件

ALTER DATABASE phpDB ADD FILE(
    NAME='File1',
    FILENAME='D:\DB_FenQu1\phpDBFile1.ndf',--路径
    SIZE=5MB,--初始大小
    FILEGROWTH=5MB)--每次增长值
    TO FILEGROUP ByIdGroup1--指向分区名

--第二个次数据文件
ALTER DATABASE phpDB ADD FILE(
    NAME='File2',
    FILENAME='E:\DB_FenQu2\phpDBFile2.ndf',
    SIZE=5MB,
    FILEGROWTH=5MB)
    TO FILEGROUP ByIdGroup2

3;查询数据库文件信息

SELECT name,type_desc,physical_name,state_desc,size FROM sys.database_files

 

 

 4;创建分区函数确定字段类型及分区的限制,留意【数据类型】

--例如2023-04-30(第一个分区放2023-04-30以前的数据)后面类推
CREATE PARTITION FUNCTION pf_Dtime(DATETIME) 
AS RANGE LEFT FOR VALUES ('2023-04-30','2023-05-31','2023-06-30','2023-07-31')

5;创建分区方案

--创建分区方案
CREATE PARTITION SCHEME ps_Dtime
AS PARTITION pf_Dtime TO ([PRIMARY], [ByIdGroup1],[ByIdGroup2],[ByIdGroup3],[ByIdGroup4])

6.创建分区表

右击要分区的表-->存储-->创建分区-->选择分区列(这里UpByMemberID)-->选择分区函数

 

 

 

 

 

 

 7;建立分区索引    temp 为表名,id为列名,dtime为列名

CREATE NONCLUSTERED INDEX [ixdtime] ON temp
(
    [dtime] ASC
)
INCLUDE ([id]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
GO

8;在插入数据数据会以数据为期限放入对应的分区中

9;查看每个分区的数据行数;

select $PARTITION.pf_Dtime([dtime]) as Patition,COUNT(*) countRow from dbo.temp
group by $partition.pf_Dtime([dtime])

 10.ndf 次要数据库文件的还原数据库    mdf主要文件,一个库只能一个,ndf一个库多个可选,ldf日志文件。

USE master;
GO
CREATE DATABASE cst
    ON (FILENAME = 'D:\Program Files\MS_SQLSERVER_DATA\cst.ndf'),
    (FILENAME = 'D:\Program Files\MS_SQLSERVER_DATA\cst_log.ldf')
    FOR ATTACH;
GO