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‘)

sql表分区,布布扣,bubuko.com

时间: 2024-08-07 08:37:12

sql表分区的相关文章

SQL 表分区

表分区,可提高大数据量表的查询效率.分区涉及的知识点有: 一,创建文件组和文件: 二,创建分区函数: 三,创建分区方案: 四,对表分区: 五,合并分区表. 一,创建文件组和文件.可视化界面创建如下图,代码创建这里不讲. 二,创建分区函数.分区方案.点击表->存储->创建分区.例如分为三个区,80后,90后,2000后面出生的所有人如下: 下一步,直到完成后,自动生成脚本,执行完,对表分区已经完成. 三,合并分区表.例如,将80.90后合并,只需要2个分区. 合并之前,80后有2万数据,剩下8万

Oracle实践--PL/SQL基础之表分区

PL/SQL基础入门之表分区 PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. ---------------------------------------------

SQL Server表分区详解

原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理.这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的. 所以大数据量的数据表,对分区的需要还是必要的,因为它可以提高select效率,还可以对历史数据经行区分存档等.但是数据量少的数据就不要凑这个热

千万级SQL Server数据库表分区的实现

千万级SQL Server数据库表分区的实现 2010-09-10 13:37 佚名 数据库 字号:T | T 一般在千万级的数据压力下,分区是一种比较好的提升性能方法.本文将介绍SQL Server数据库表分区的实现. AD:51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验 最近使用SQL SERVER一个的缓存,数据量一天100w的速度增长,同时接受客户查询,速度由于数据量越来越大越来越慢,这里感谢  KillKill 和 邀约, 最近读了一套书不错,感兴趣的同学可以读读

SQL SERVER 表分区

一 .SQL SERVER 表分区介绍: SQL Server  引入的表分区技术,让用户能够把数据分散存放到不同的物理磁盘中,提高这些磁盘的并行处理性能以优化查询性能…… 二 .SQL SERVER 数据库表分区由三个步骤来完成: 1.创建分区函数 2.创建分区架构 3.对表进行分区 基于缓存更新机制,我使用时间来进行分区,这里大家根据业务的要求使用合适的字段来作为分区 创建数据库分区文件数量,这里存储一年的数据分成十二个分区,需要现在D盘建立好Data 的文件夹 里面包含Primary 文件

SQL Server 创建表分区

先准备测试表 CREATE TABLE [dbo].[Employee] ( EmployeeNo INT IDENTITY(1,1) PRIMARY KEY, EmployeeName NVARCHAR(50) NULL ); 插入一些数据 INSERT Employee DEFAULT VALUES; GO 10000 UPDATE Employee set EmployeeName = 'Employee ' + CONVERT(VARCHAR, EmployeeNo) 创建文件组 创建文

SQL Server表分区的NULL值问题

SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,往往会被大家吐槽 人家MySQL支持四种类型:RANGE分区.LIST分区.HASH分区.KEY分区 共同点是MySQL跟SQL Server也有分区对齐的问题,都是水平切分,大家都允许分区列存在NULL值 这次我们测试SQL Server表分区的分区列的NULL值,究竟NULL值是被存放在哪个区间,以前一直没有注意 测试脚本 --1.创建文件组 ALTER DATABASE [sss] ADD

8、SQL Server 表分区

什么是表分区?表分区其实就是将一个大表分成若干个小表,可以将一些不需要经常操作的数据存在其他的表,然后想查询哪个表的记录,就去对应的表中查询,由于表中的记录变少了,查询的时间也就少了.表分区可以从物理上将一个大表分成几个小表,但是逻辑上还是一个表.所以当执行插入操作的时候,不需要我们去判断应该插入到哪个表中.只需要插入大表中就可以了.SQL Server会自动的将它放在对应的表中.对于查询也是一样,直接查询大表就可以了. 什么时候需要表分区?当数据量过百万时,访问速度明显变慢,并且你的数据是按某

SQL Server表分区【转】

转自:http://www.cnblogs.com/knowledgesea/p/3696912.html SQL Server表分区 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理.这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的. 所以大数据量的数据表,对分区的需要还是必要的