sql表分区

1、单表达多少条数据后需要分区呢?
   a.个人认为要似情况而定,有些常操作的表,分区反而带来麻烦,可以采用物理分表以及其它方法处理;
   b.对于一些日志、历史订单类的查询数据,500w左右即可享受分区带来的优越性;

   c.可以将分区映射到文件组,每个分区访问一个不同的物理磁盘驱动器,以便提高 I/O 性能

 

在设计数据库时,经常没有考虑到表分区的问题,往往在数据表承重的负担越来越重时,才会考虑到分区方式,这时,就涉及到如何将普通表转换成分区表的问题了。

  那么,如何将一个普通表转换成一个分区表 呢?说到底,只要将该表创建一个聚集索引,并在聚集索引上使用分区方案即可。

 

---1. 添加文件组及文件(一般用于独立服务器或有创建子数据库文件、 文件组权限的服务器,其它可跳过)
--根据需要可添加合适数量的分区及设置表分区文件所在磁盘
alter database yd_erp_db20140429 add filegroup [year_fg1]
alter database yd_erp_db20140429 add filegroup [year_fg2]
alter database yd_erp_db20140429 add filegroup [year_fg3]

alter database yd_erp_db20140429 add file
(name='year_fg1',filename='E:\DataBase\year_fg1.ndf',maxsize=UNLIMITED,filegrowth=10%) to filegroup year_fg1
alter database yd_erp_db20140429 add file
(name='year_fg2',filename='E:\DataBase\year_fg2.ndf',maxsize=UNLIMITED,filegrowth=10%) to filegroup year_fg2
alter database yd_erp_db20140429 add file
(name='year_fg3',filename='E:\DataBase\year_fg3.ndf',maxsize=UNLIMITED,filegrowth=10%) to filegroup year_fg3

 

--新建一个普通的数据表 

CREATE TABLE [dbo].[bs_BFlowDetail](
[Id] [int] NOT NULL,
[BFlowFileID] [nvarchar](50) NOT NULL,
[BFDDate] [datetime] NULL,
[InCstmId] [nvarchar](50) NULL,
[ItemId] [varchar](20) NULL,
[Batch] [nvarchar](50) NULL,
[Qty] [decimal](18, 2) NULL,
[YuanShiId] [nvarchar](50) NULL,
[Remarks] [nvarchar](200) NULL,
[IsExist] [bit] NULL,
[ClientName] [nvarchar](300) NULL,
[AppQty] [int] NULL,
[AppRemarks] [nvarchar](200) NULL,
[BFDMonth] [varchar](20) NOT NULL,
[price] [decimal](18, 4) NULL,
[level] [varchar](20) NULL,

CONSTRAINT [PK_Sale] PRIMARY KEY CLUSTERED  --创建主键  

  (  

     [Id] ASC  

   )  


)

---添加一些数据

 

--现在开始针bs_BFlowDetail分区

 

-----------------------首先创建分区函数------------------------

--对若分区函数存在则先drop掉 
IF EXISTS (SELECT * FROM sys.partition_functions WHERE name = N'years_partFunc') 
DROP PARTITION FUNCTION [years_partFunc] 
GO

---2. 创建分区函数
--分区函数用于定义分区的边界条件
create partition function years_partFunc(varchar(20))
as 
range left for values(
'2014-01',
'2015-01')
GO

 

----------------------其次,创建分区方案--------------------


--看分区方案是否存在,若存在先drop掉 
IF EXISTS (SELECT * FROM sys.partition_schemes WHERE name = N'years_scheme') 
DROP PARTITION SCHEME years_scheme 
GO


-- 创建分区架构 
create partition scheme years_scheme
as partition years_partFunc to (year_fg1,year_fg2,year_fg3)

 

我们可以看出,bs_BFlowDetail表拥有一般普通表的特性——有主键,同时这个主键还是聚集索引。分区表是以某个字段为分区条件,所以,除了这个字段以外的其他字段,是不能创建聚集索引的。因此,要想将普通表转换成分区表,就必须要先删除聚集索引,然后再创建一个新的聚集索引,在该聚集索引中使用分区方案。

    可惜的是,在SQL Server中,如果一个字段既是主键又是聚集索引时,并不能仅仅删除聚集索引。因此,我们只能将整个主键删除,然后重新创建一个主键,只是在创建主键时,不将其设为聚集索引,如以下代码所示:

 

--删掉主键
alter table bs_BFlowDetail drop constraint PK_Sale

-------如果所要分区的字段即使主键也是分区字段,那么请使用如下代码:

--创建主键BFDMonth,并设为聚集索引
ALTER TABLE bs_BFlowDetail
ADD CONSTRAINT PK_Sale
PRIMARY KEY CLUSTERED (BFDMonth) on years_scheme(BFDMonth)
GO

-----如果所要分区的字段不是主键,那么请使用如下代码:

--创建主键id,但不设为聚集索引
ALTER TABLE bs_BFlowDetail
ADD CONSTRAINT PK_Sale
PRIMARY KEY NONCLUSTERED (Id) on [PRIMARY]
GO

--删除分区索引

DROP INDEX ix_fdate ON bs_BFlowDetail


--创建分区聚集索引,分区字段必须为聚集索引
create CLUSTERED index ix_fdate ON bs_BFlowDetail(BFDMonth) ON years_scheme(BFDMonth)

 

--统计所有分区表中的记录总数
select $PARTITION.years_partFunc(BFDMonth) as 分区编号,count(id) as 记录数
from bs_BFlowDetail group by $PARTITION.years_partFunc(BFDMonth)

-- 现在我们可以看一下我们刚才插入的行都分布在哪个Partition
SELECT *, $PARTITION.years_partFunc(BFDMonth) FROM bs_BFlowDetail 
--我们可以看一下我们现在PARTITIONEDORDERS表的数据存储在哪此partition中,以及在这些分区中数据量的分布
SELECT * FROM SYS.PARTITIONS WHERE OBJECT_ID = OBJECT_ID('bs_BFlowDetail')


--查询单个分区
select * from Sale where $PARTITION.partfunSale(SaleTime)=1

--更改增加分区函数
ALTER PARTITION FUNCTION years_partFunc() SPLIT RANGE ('2016-01')

转载于:https://www.cnblogs.com/net_haibo/p/3756963.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server 分区是一种数据库设计技术,它将大型数据集划分为多个逻辑或物理部分,每个部分称为分区分区可以提高查询性能、简化管理以及支持更有效的数据分发。以下是SQL Server分区的一些关键特性: 1. **性能提升**:分区有助于减少I/O操作,特别是当查询只针对部分数据时。数据库系统可以直接访问所需的分区,而不是扫描整个。 2. **空间效率**:通过将数据按时间、地理区域或其他关键字段分区,可以减少存储空间的使用,因为每个分区可以独立管理和扩展。 3. **易于管理**:分区使得维护和管理大型数据变得简单,比如数据备份、恢复、索引更新等,只需要处理相关的分区。 4. **灵活的数据分发**:对于分布式应用,分区可以方便地在多个服务器上复制和分布,提高并发处理能力。 SQL Server 支持多种分区类型: - **范围分区**(Range Partitioning):根据数值范围对数据进行划分。 - **列分区**(List Partitioning):根据预定义的列值对数据进行划分。 - **哈希分区**(Hash Partitioning):根据哈希函数的结果将数据均匀分配到各个分区。 - **文件组分区**:基于文件组进行分区,用于存储大量小文件。 创建分区时,你需要明确指定分区键和分区函数。分区与非分区类似,但在设计时需要考虑分区策略和查询优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值