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表分区的更多相关文章
- Oracle实践--PL/SQL表分区的基础
PL/SQL基础入门之表分区 PL/SQL:过程语言(Procedure Language)和结构化语言(Structured Query Language)结合而成的编程语言.是对SQL的扩展.支 ...
- SQL表分区之一
一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由 ...
- SQL表分区之二
前面说的给表做表分区,现在有个问题,比如上面我们说的是按照20w为一个分割线,那些现在我们想把这个调整下怎么办?难道要把之前的分区函数和分区方案删了,重新新建分区函数和分区方案嘛? 当然,此方式肯定是 ...
- sql 表分区使用
如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的 ...
- SQL Server表分区的NULL值问题
SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...
- 8、SQL Server 表分区
什么是表分区?表分区其实就是将一个大表分成若干个小表.表分区可以从物理上将一个大表分成几个小表,但是逻辑上还是一个表.所以当执行插入.更新等操作的时候,不需要我们去判断应该插入或更新到哪个表中.只需要 ...
- 千万级SQL Server数据库表分区的实现
千万级SQL Server数据库表分区的实现 2010-09-10 13:37 佚名 数据库 字号:T | T 一般在千万级的数据压力下,分区是一种比较好的提升性能方法.本文将介绍SQL Server ...
- SQL Server表分区案例
--学习创建表分区脚本/*SQL SERVER 2005中以上版本,终于引入了表分区,就是说,当一个表里的数据很多时,可以将其分拆到多个的表里,大大提高了性能.下面举例子说明之*/ --------- ...
- SQL Server表分区【转】
转自:http://www.cnblogs.com/knowledgesea/p/3696912.html SQL Server表分区 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在 ...
随机推荐
- 学习Python函数笔记之二
---恢复内容开始--- 1.内置函数:取绝对值函数abs() 2.内置函数:取最大值max(),取最小值min() 3.内置函数:len()是获取序列的长度 4.内置函数:divmod(x,y),返 ...
- Spring之BeanFactory及Bean生命周期
1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...
- init.d functions的daemon函数
daemon函数说明 # 该函数的作用是启动一个可执行的二进制程序: # 使用方法: # .daemon {--check program|--check=program} [--user usern ...
- [LeetCode] Rank Scores 分数排行
Write a SQL query to rank scores. If there is a tie between two scores, both should have the same ra ...
- webuploader 谷歌浏览器跨域
今天在本地调试webuploader 的image-upload demo时遇到跨域问题(本地post数据到同事的机器中) 会出现No 'Access-Control-Allow-Origin' he ...
- CephRGW 在多个RGW负载均衡场景下,RGW 大文件并发分片上传功能验证
http://docs.ceph.com/docs/master/radosgw/s3/objectops/#initiate-multi-part-upload 根据分片上传的API描述,因为对同一 ...
- springboot @ConfigurationProperties
Spring Boot 提供了一种方式 --类型安全的bean,能够根据类型校验和管理application中的bean.继续使用author做例子.配置放在author.properties文件中. ...
- read properties
读取配置文件在项目中使用频率很大,但是实际项目中各种人,各种用法,五花八门,往往是一种方式的各种变体,然很多种方式是其中一种方式的复杂化.今天我来总结下读取配置文件的集中方式及一些不能靠copy代码能 ...
- A*算法
A*在游戏设计中有它很典型的用法,是人工智能在游戏中的代表. A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚 A*算法,我看还是先说说何谓启发式算法. 一.何谓启发式搜索算法: 在说它之前 ...
- 篇三:访问JSON静态文件
背景:在定位的时候带出车牌号的前两位,这里就有一个地址和车牌号前两位的映射关系,这个映射关系起初是通过Ajax在页面加载的时候请求去数据库里面查出来赋给一个变量,然后去操作,但是这个过程通常需要4~7 ...