数据库分区实践

--查询一张表的分区

select $partition.Part_func_UserLog(createdDate) as Patition from dbo.UserLog GROUP BY $partition.Part_func_UserLog(createdDate) 

--创建分区的时间段

CREATE PARTITION FUNCTION Part_func_UserLog(datetime)
 AS RANGE LEFT FOR VALUES
(
‘20120709 23:59:59.997‘,
‘20120710 23:59:59.997‘,
‘20120711 23:59:59.997‘,
‘20120712 23:59:59.997‘,
‘20120713 23:59:59.997‘,
‘20120714 23:59:59.997‘,
‘20120715 23:59:59.997‘,
‘20120716 23:59:59.997‘,
‘20120717 23:59:59.997‘,
‘20120718 23:59:59.997‘
);

--创建分区分组

ALTER DATABASE GoodBooks
ADD FILEGROUP [FGGoodBooks1];
GO
ALTER DATABASE GoodBooks
ADD FILEGROUP [FGGoodBooks2];
GO
ALTER DATABASE GoodBooks
ADD FILEGROUP [FGGoodBooks3];
GO
ALTER DATABASE GoodBooks
ADD FILEGROUP [FGGoodBooks4];
GO
ALTER DATABASE GoodBooks
ADD FILEGROUP [FGGoodBooks5];
GO
ALTER DATABASE GoodBooks
ADD FILEGROUP [FGGoodBooks6];
GO
ALTER DATABASE GoodBooks
ADD FILEGROUP [FGGoodBooks7];
GO
ALTER DATABASE GoodBooks
ADD FILEGROUP [FGGoodBooks8];
GO
ALTER DATABASE GoodBooks
ADD FILEGROUP [FGGoodBooks9];
GO
ALTER DATABASE GoodBooks
ADD FILEGROUP [FGGoodBooks10];

--创建分区文件

ALTER DATABASE GoodBooks
ADD FILE
(NAME=FGGoodBooks1_data,FILENAME=‘E:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\FGGoodBooks1_data.ndf‘,SIZE=3MB)
TO FILEGROUP [FGGoodBooks1];
ALTER DATABASE GoodBooks
ADD FILE
(NAME=FGGoodBooks2_data,FILENAME=‘E:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\FGGoodBooks2_data.ndf‘,SIZE=3MB)
TO FILEGROUP [FGGoodBooks2];
ALTER DATABASE GoodBooks
ADD FILE
(NAME=FGGoodBooks3_data,FILENAME=‘E:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\FGGoodBooks3_data.ndf‘,SIZE=3MB)
TO FILEGROUP [FGGoodBooks3];
ALTER DATABASE GoodBooks
ADD FILE
(NAME=FGGoodBooks4_data,FILENAME=‘E:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\FGGoodBooks4_data.ndf‘,SIZE=3MB)
TO FILEGROUP [FGGoodBooks4];
ALTER DATABASE GoodBooks
ADD FILE
(NAME=FGGoodBooks5_data,FILENAME=‘E:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\FGGoodBooks5_data.ndf‘,SIZE=3MB)
TO FILEGROUP [FGGoodBooks5];
ALTER DATABASE GoodBooks
ADD FILE
(NAME=FGGoodBooks6_data,FILENAME=‘E:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\FGGoodBooks6_data.ndf‘,SIZE=3MB)
TO FILEGROUP [FGGoodBooks6];
ALTER DATABASE GoodBooks
ADD FILE
(NAME=FGGoodBooks7_data,FILENAME=‘E:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\FGGoodBooks7_data.ndf‘,SIZE=3MB)
TO FILEGROUP [FGGoodBooks7];
ALTER DATABASE GoodBooks
ADD FILE
(NAME=FGGoodBooks8_data,FILENAME=‘E:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\FGGoodBooks8_data.ndf‘,SIZE=3MB)
TO FILEGROUP [FGGoodBooks8];
ALTER DATABASE GoodBooks
ADD FILE
(NAME=FGGoodBooks9_data,FILENAME=‘E:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\FGGoodBooks9_data.ndf‘,SIZE=3MB)
TO FILEGROUP [FGGoodBooks9];
ALTER DATABASE GoodBooks
ADD FILE
(NAME=FGGoodBooks10_data,FILENAME=‘E:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\FGGoodBooks10_data.ndf‘,SIZE=3MB)
TO FILEGROUP [FGGoodBooks10];

--绑定分组

CREATE PARTITION SCHEME Part_func_UserLog_Scheme
AS PARTITION Part_func_UserLog
TO ([FGGoodBooks1],[FGGoodBooks2],[FGGoodBooks3],[FGGoodBooks4],[FGGoodBooks5],[FGGoodBooks6],[FGGoodBooks7],[FGGoodBooks8],[FGGoodBooks9],[FGGoodBooks10],[Primary]);
GO

--给表添加主键

ALTER TABLE dbo.UserLog ADD CONSTRAINT PK_UserLog PRIMARY KEY NONCLUSTERED  (UserLogID)
   WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
         ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE CLUSTERED INDEX IX_UserLog_partitioncol ON dbo.UserLog (UserLogID)
  WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
        ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
  ON Part_func_UserLog_Scheme(CreatedDate)
GO

--删除表的主键、聚集索引

alter table UserLog drop CONSTRAINT PK_UserLog

--查询指定分区的数据

select *  from dbo.UserLog WHERE $PARTITION.Part_func_UserLog(CreatedDate)=3

--自动添加分区

declare  @databaseName varchar(50),  @fileGroupName varchar(50),  @ndfName varchar(50),  @newNameStr varchar(50),  @fullPath
varchar(500),  @newDay varchar(50),  @oldDay datetime,  @partFunName varchar(50),  @schemeName varchar(50)
set @databaseName=‘GoodBooks‘
set @newDay=CONVERT(varchar(100), getdate(), 23)--23:按天 114:按时间
set @oldDay=cast(CONVERT(varchar(10),dateadd(day,-5,getdate()), 120 ) as datetime)
set @newNameStr=Replace(Replace(@newDay,‘:‘,‘_‘),‘-‘,‘_‘)
set @fileGroupName=N‘G‘[email protected]
set @ndfName=N‘F‘[email protected]+‘‘
set @fullPath=N‘E:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\‘[email protected]+‘.ndf‘
set @partFunName=N‘Part_func_UserLog‘
set @schemeName=N‘Part_func_UserLog_Scheme‘
--创建文件组
if exists(select * from sys.filegroups where [email protected])
begin
	print ‘文件组存在,不需添加‘
end
else
begin
	exec(‘ALTER DATABASE ‘[email protected]+‘ ADD FILEGROUP [‘[email protected]+‘]‘)
	print ‘新增文件组‘
	if exists(select * from sys.partition_schemes where name [email protected])
	begin
		exec(‘alter partition scheme ‘[email protected]+‘  next used [‘[email protected]+‘]‘)
		print ‘修改分区方案‘
	end
	if exists(select * from sys.partition_range_values where function_id=(select function_id from
	sys.partition_functions where name [email protected]) and [email protected])
	begin
		exec(‘alter partition function  ‘[email protected]+‘() split range(‘‘‘[email protected]+‘‘‘)‘)
		print ‘修改分区函数‘
	end
end
--创建NDF文件
if exists(select * from sys.database_files where [state]=0 and ([email protected] or [email protected]))
begin
	print ‘ndf文件存在,不需添加‘
end
else
begin
	exec(‘ALTER DATABASE ‘[email protected]+‘ ADD FILE (NAME =‘[email protected]+‘,FILENAME = ‘‘‘[email protected]+‘‘‘)TO FILEGROUP [‘[email protected]+‘]‘)
	PRINT ‘ALTER DATABASE ‘[email protected]+‘ ADD FILE (NAME =‘[email protected]+‘,FILENAME = ‘‘‘[email protected]+‘‘‘)TO FILEGROUP [‘[email protected]+‘]‘
	print ‘新创建ndf文件‘
end
/*--------------------以上创建数据库的文件组和物理文件------------------------*/
--分区函数
if exists(select * from sys.partition_functions where name [email protected])
begin
	print ‘此处修改需要在修改分区函数之前执行‘
end
else
begin
	exec(‘CREATE PARTITION FUNCTION ‘[email protected]+‘(DateTime)AS RANGE RIGHT FOR VALUES (‘‘‘[email protected]+‘‘‘)‘)
	print ‘新创建分区函数‘
end
--分区方案
if exists(select * from sys.partition_schemes where name [email protected])
begin
	print ‘此处修改需要在修改分区方案之前执行‘
end
else
	begin
	exec(‘CREATE PARTITION SCHEME ‘[email protected]+‘ AS PARTITION ‘[email protected]+‘ TO (‘‘PRIMARY‘‘,‘‘‘[email protected]+‘‘‘)‘)
	print ‘新创建分区方案‘
end
print ‘---------------以下是变量定义值显示---------------------‘
print ‘当前数据库:‘[email protected]
print ‘当前日期:‘[email protected]+‘(用作随机生成的各种名称和分区界限)‘
print ‘合法命名方式:‘[email protected]
print ‘文件组名称:‘[email protected]
print ‘ndf物理文件名称:‘[email protected]
print ‘物理文件完整路径:‘[email protected]
print ‘分区函数:‘[email protected]
print ‘分区方案:‘[email protected]
/*
--查看创建的分区函数
select * from sys.partition_functions
--查看分区函数的临界值
select * from sys.partition_range_values
--查询分区方案
select * from sys.partition_schemes
--查询表数据在哪个分区中存储,where条件查询第一个分区中存在的数据
select *,$partition.pf_SaveTime(分区字段) as Patition from 表名 where $partition.pf_SaveTime(分区字段)=1
*/
GO

  

时间: 2024-11-25 15:46:55

数据库分区实践的相关文章

达梦数据库索引实践

达梦数据库索引实践 达梦数据库支持二级索引,聚集索引,唯一索引,函数索引,位图索引,分区索引等. 默认的表是索引组织表,利用rowid创建一个默认的索引,所以我们创建的索引,称为二级索引.建索引的目的是加快表的查询,对数据库做DML操作的时候,数据库会自动维护索引.索引是一棵倒置的树,使用索引,就是对这个索引树进行遍历. 建立索引的规则:经常查询的列.连接条件列.谓词经常出现的列(where).查询是返回表的一小部分数据 不适合创建索引的情况:列上有大量的null.列上的数据有限(例如:性别)

微信 SQLite 数据库修复实践

https://mp.weixin.qq.com/s/N1tuHTyg3xVfbaSd4du-tw 微信 SQLite 数据库修复实践 原创 2017-04-25 guoling WeMobileDev 1.前言 众所周知,微信在后台服务器不保存聊天记录,微信在移动客户端所有的聊天记录都存储在一个 SQLite 数据库中,一旦这个数据库损坏,将会丢失用户多年的聊天记录.而我们监控到现网的损坏率是0.02%,也就是每 1w 个用户就有 2 个会遇到数据库损坏.考虑到微信这么庞大的用户基数,这个损坏

mysql数据库分区功能及实例详解

分区听起来怎么感觉是硬盘呀,对没错除了硬盘可以分区数据库现在也支持分区了,分区可以解决大数据量的处理问题,下面一起来看一个mysql数据库分区功能及实例详解 一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例.mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放表数据的,一个是myi存

处理Zabbixl历史数据库解决办法三---使用平民软件的OneProxy来为Zabbix数据库分区和扩容

一 应用场景描述 二 OneProxy介绍及使用 三 使用OneProxy来为Zabbix数据库分区和扩容 参考文档:

Atitit.数据库分区的设计 attilax  总结

Atitit.数据库分区的设计 attilax  总结 1. 分区就是分门别类的文件夹 (what)1 2. 分区的好处(y)1 3. 分区原则(要不要分区,何时分区)how2 4. 主要的分表类型有range,list,hash,key等2 5. 水平分区(Horizontal Partitioning) 垂直分区(Vertical Partitioning)3 6. 分区的操作4 7. 分区理论  并行数据库的体系结构4 8. 参考7 1. 分区就是分门别类的文件夹 (what) 分区的原理

MySQL数据库分区的概念与2大好处(1)

我们大家都知道通过MySQL数据库分区(Partition)可以提升MySQL数据库的性能,那么到底什么是MySQL数据库分区呢?以及其实际应用的好处的表现有哪些呢?以下的文章就是对这些内容的描述. 什么是数据库分区? 数据库分区是一种物理数据库设计技术,DBA和数据库建模人员对其相当熟悉.虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作 中减少数据读写的总量以缩减响应时间. 分区主要有两种形式://这里一定要注意行和列的概念(row是行,column是列) 水平分区(Hori

sql2008 计划自动创建数据库分区【转】

本文转自:http://jingyan.baidu.com/article/6b97984d9a26ec1ca3b0bf77.html sql2008 计划自动创建数据库分区 固定增量的数据,自动创建分区作业. 步骤一:创建分区的计划任务 打开MsSQL2008,找到作业该项,如果打不开或者SQL Server代理是未启动状态,请先在windows服务中启动SQL Server代理(参考图片),   右击MsSQL2008对象资源管理器中的作业,选择新建作业,输入该作业你想用的名称,类别不用管,

数据库分区

数据库分区: 概念:以mysql为例.mysql数据库中的数据是以文件的形式存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放表数据的,一个是myi存表索引的.如果一张表的数据量太大的话,那么myd,myi就会变的很大,查找数据就会变的很慢,这个时候我们可以利用mysql的分区功能,在物理上将这一张表对应的三个文件,分割成许多个小块,这样呢,我们查找一条数据时,就不用全部查找了,只

关于数据库分区后的几个查询和补充

--查看分区及分区范围的情况 select * from sys.partitions where object_id = object_id('SecureUsbLog'); select * from sys.partition_range_values; --查看分区架构情况 select * from sys.partition_schemes; --查看某一特定分区列值属于哪个分区 select M2.$partition.Part_mediasec_func('20150325')