SQL Server 创建表分区
- 格式:docx
- 大小:423.31 KB
- 文档页数:7
分布式数据库内容分区表和分区视图sql Server 2000 分区视图的运用分区视图在一个或多个服务器间水平连接一组成员表中的分区数据,使数据看起来就象来自一个表。
Microsoft® SQL Server™ 2000 区分本地分区视图和分布式分区视图。
在本地分区视图中,所有的参与表和视图驻留在同一个 SQL Server 实例上。
在分布式分区视图中,至少有一个参与表驻留在不同的(远程)服务器上。
此外,SQL Server 2000 还区分可更新的分区视图和作为基础表只读复本的视图。
分布式分区视图可用于实现数据库服务器联合体。
联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。
这种通过分区数据形成数据库服务器联合体的机制使您能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。
有关更多信息,请参见设计联合数据库服务器。
在实现分区视图之前,必须先水平分区表。
原始表被分成若干个较小的成员表。
每个成员表包含与原始表相同数量的列,并且每一列具有与原始表中的相应列同样的特性(如数据类型、大小、排序规则)。
如果正在创建分布式分区视图,则每个成员表分别位于不同的成员服务器上。
为了获得最大程度的位置透明度,各个成员服务器上的成员数据库的名称应当是相同的,但不要求非这样。
例如:Server1.CustomerDB、Server2.CustomerDB、Server3.CustomerDB。
成员表设计好后,每个表基于键值的范围存储原始表的一块水平区域。
键值范围基于分区列中的数据值。
每一成员表中的值范围通过分区列上的 CHECK 约束强制,并且范围之间不能重叠。
例如,不能使一个表的值范围从 1 到 200000,而另一个表的值范围从 150000 到 300000,因为这样将不清楚哪个表包含 150000 与 200000 之间的值。
例如,正在将一个Customer表分区成三个表。
这些表的 CHECK 约束为:-- On Server1:CREATE TABLE Customer_33(CustomerID INTEGER PRIMARY KEYCHECK (CustomerID BETWEEN 1 AND 32999),... -- Additional column definitions)-- On Server2:CREATE TABLE Customer_66(CustomerID INTEGER PRIMARY KEYCHECK (CustomerID BETWEEN 33000 AND 65999),... -- Additional column definitions)-- On Server3:CREATE TABLE Customer_99(CustomerID INTEGER PRIMARY KEYCHECK (CustomerID BETWEEN 66000 AND 99999),... -- Additional column definitions)主要功能是为了提高大数据量性能,通过把数据放到不同表,或不能同服务器的不同数据库实例上。
SQLServer中提供了相当丰富的系统视图,能够从宏观到微观,从静态到动态反应数据库对象的存储结果、系统性能、系统等待事件等等。
同时也保留了与早期版本兼容性的视图,主要差别在于S QLServer2008提供的新系统视图一是更加全面和丰富、二是更注重命名规则。
SQLServer2008的几乎所有对象信息都存在于sys.objects系统视图中,同时又在不同的系统视图中保留了相应的副本,对于函数、视图、存储过程、触发器等相应的文本对象,把相应的对象的详细资料存于新的sys.sql_modules视图中。
对于数据库层面的存储结构,我们可以参看以下视图:--数据库实例的概要情况SELECT*FROM SYS.SERVERSWHERE SERVER_ID=0--兼容性视图SELECT*FROM SYS.SYSSERVERS--各个数据库的详细信息SELECT*FROM SYS.DATABASES--兼容性视图SELECT*FROM SYS.SYSDATABASES --文件组的详细信息SELECT*FROM SYS.FILEGROUPS--兼容性视图SELECT*FROM SYS.SYSFILEGROUPS--各个数据库文件的详细信息SELECT*FROM SYS.MASTER_FILES--兼容性视图SELECT*FROM SYS.SYSALTFILES--当前数据库文件的详细信息SELECT*FROM SYS.DATABASE_FILES--兼容性视图SELECT*FROM SYS.SYSFILES--数据空间的详细情况,可以是文件组或分区方案SELECT*FROM SYS.DATA_SPACES关于数据库表的存储信息,通过以下系统表我们可以大致了解数据库表在数据库中是如何定义的。
以下视图提供了基本的数据库对象信息。
#div_code img { border: 0px none; }--我们首先创建一张表和一些索引CREATE TABLE dbo.test(id int IDENTITY(1,1)NOTNULL,name char(100)NULL,CONSTRAINT PK_test PRIMARY KEY CLUSTERED (id ASC))CREATE NONCLUSTERED INDEX IX_test ON dbo.test(name)--表和对象详细信息,根据表名称查询出object_id为--事实上几乎所有的用户对象都出自于SYS.OBJECTS表SELECT*FROM SYS.OBJECTSWHERE type_desc='USER_TABLE' AND NAME='TEST'--兼容性视图SYSOBJECTS--如果要查询与该表相关的其他所有对象,则可以执行以下语句SELECT*FROM SYS.OBJECTSWHERE type_desc='USER_TABLE' AND NAME='TEST' ORparent_object_id in(SELECT object_id FROM SYS.OBJECTSWHERE type_desc='USER_TABLE' AND NAME='TEST')--表字段详细信息,可以查询出相关column_idSELECT*FROM SYS.COLUMNSWHERE OBJECT_ID=5575058--兼容性视图SYSCOLUMNS--表索引详细情况,可以清楚的看到存在两个索引SELECT*FROM SYS.INDEXES WHERE OBJECT_ID=5575058--兼容性视图SYSINDEXES--表分区情况,数据库中所有表和索引的每个分区在表中各对应一行--此处可以看到该表有两个分区,聚集索引即表本身,还有一个是name的非聚集索引--partition_id 即分区的ID--hobt_id包含此分区的行的数据堆或B树的IDSELECT*FROM SYS.PARTITIONS WHERE OBJECT_ID=5575058--分配单元情况,数据库中的每个分配单元都在表中占一行--该表只有和SYS.PARTITIONS配合使用才有意义SELECT*FROM SYS.ALLOCATION_UNITS--SYS.ALLOCATION_UNITS和SYS.PARTITIONS一起使用能够反映出某个对象的页面分配和使用情况SELECT*FROM SYS.ALLOCATION_UNITS U,SYS.PARTITIONS PWHERE U.TYPE IN (1,3)AND U.CONTAINER_ID=P.HOBT_ID AND P.OBJECT_ID=5575058 UNION ALLSELECT*FROM SYS.ALLOCATION_UNITS U,SYS.PARTITIONS PWHERE U.TYPE=2AND U.CONTAINER_ID=P.PARTITION_ID AND P.OBJECT_ID=5575058--返回每个分区的页和行计数信息SELECT*FROM SYS.DM_DB_PARTITION_STATS WHERE OBJECT_ID=5575058--返回索引的详细字段情况SELECT*FROM SYS.INDEX_COLUMNS WHERE OBJECT_ID=5575058--兼容性视图SYSINDEXKEYS--以下为根据某个索引名称获取其相关字段的语句DECLARE @index_field_names VARCHAR(500)SET@index_field_names='';SELECT@index_field_names=@index_field_names++','FROM SYS.INDEX_COLUMNS a,SYS.INDEXES b,SYS.COLUMNS cWHERE a.object_id=b.object_id AND a.index_id=b.index_idAND a.object_id=c.object_id AND a.column_id=c.column_idAND ='IX_test2'ORDER BY a.index_column_idSET@index_field_names=LEFT(@index_field_names,LEN(@index_field_names)-1)PRINT @index_field_names--CHECK约束,数据来源sys.objects.type='C'SELECT*FROM SYS.CHECK_CONSTRAINTS WHERE OBJECT_ID=?--兼容性视图SYSCONSTRAINTS--数据来源sys.objects.type=DSELECT*FROM SYS.DEFAULT_CONSTRAINTS WHERE OBJECT_ID=?--兼容性视图SYSCONSTRAINTS--主键或唯一约束,数据来源sys.objects.type PK 和UQSELECT*FROM SYS.KEY_CONSTRAINTS WHERE OBJECT_ID=? --兼容性视图SYSCONSTRAINTS--外键,数据来源sys.object.type=FSELECT*FROM SYS.FOREIGN_KEYS WHERE OBJECT_ID=?--兼容性视图SYSREFERENCES--触发器SELECT*FROM SYS.TRIGGERS WHERE OBJECT_ID=?--注释SELECT*FROM SYS.SQL_MODULES--兼容性视图SYSCOMMENTS--数据库用户表SELECT*FROM SYS.DATABASE_PRINCIPALS--兼容性视图SYSUSERS--数据库数据类型表SELECT*FROM SYS.TYPES--兼容性视图SYSTYPES。
sql server 分区注意事项-概述说明以及解释1.引言1.1 概述SQL Server是一种关系型数据库管理系统,具有强大的数据处理和存储能力。
在处理大规模数据时,为了提高查询性能和维护数据的效率,我们可以使用分区技术来对数据库进行划分。
分区是将数据库表或索引按某种规则划分成多个逻辑上相互独立的部分,每个部分称为一个分区。
每个分区可以单独进行管理和维护,使得数据的访问和处理更加高效快速。
在使用SQL Server分区技术时,需要注意以下几点:首先,分区设计需要根据具体的业务需求进行合理的划分。
不同的业务场景可能需要不同的分区策略,如按照时间、地域或其他特定的业务属性进行分区。
合理的分区设计可以提高查询性能,并提供更好的数据管理能力。
其次,分区键的选择非常重要。
分区键是指用于划分分区的列或列集合,可以是表中的任意列。
选择一个适合的分区键可以提高查询性能和数据加载的效率。
通常,选择具有高选择性的列作为分区键会得到较好的效果。
另外,分区表的维护和管理也需要特别关注。
由于分区表的数据分布在不同的分区中,因此需要针对每个分区进行独立的维护工作,如备份、索引维护和数据迁移等。
同时,需要注意监控每个分区的使用情况,及时进行分区的调整或优化。
最后,使用分区功能可能涉及到一些限制和注意事项。
例如,分区表的设计需要遵循一些特定的规则和限制,如每个分区的大小应该合理控制,避免某个分区过大或过小。
此外,分区表的查询和删除操作也需要特别注意,以确保操作的正确性和效率。
总之,SQL Server分区技术可以提高数据库的性能和数据管理的灵活性,但在使用分区功能时需要注意以上几点,以确保分区设计的合理性和分区表的正常运行。
1.2 文章结构本文将按照以下结构进行讨论和介绍sql server 分区的注意事项:1. 引言:首先,我们会在引言部分简要介绍sql server 分区的概述,包括其定义、作用和应用场景。
同时,我们还会说明本文的目的,即为读者提供一些有关sql server 分区的注意事项,以帮助他们在使用和设计分区时避免一些常见的问题和错误。
sqlserver按⽉对数据表进⾏分区当某张数据表数据量较⼤时,我们就需要对该表进⾏分区处理,以下sql语句,会将数据表按⽉份,分为12个分区表存储数据,废话不多说,直接上脚本:use [SIT_L_TMS]--开启 XP_CMDSHELL;开启创建⽂件夹权限GOSP_CONFIGURE 'SHOW ADVANCED OPTIONS',1RECONFIGUREGOSP_CONFIGURE 'XP_CMDSHELL',1RECONFIGUREGO--数据库名declare @servername varchar(20) ;-- 变量赋值set @servername = 'SIT_L_TMS' ;--待执⾏sqldeclare @sql varchar(1024) ;--设置年declare @year varchar(10);set @year = CONVERT(varchar(4), GETDATE(), 23);--⽉数declare @summonths int;set @summonths = 12;--⽂件组存放路径declare @file_path varchar(200);set @file_path = 'F:\db_group\' + @year;--判断⽂件夹是否存在,不存在则创建declare @TEMP TABLE(A INT,B INT,C INT);--建⽴虚拟表,⽤来判断⽂件夹是否存在INSERT @TEMP EXEC [MASTER]..XP_FILEEXIST @file_path;IF NOT EXISTS(SELECT * FROM @TEMP WHERE B=1)BEGIN--XP_CMDSHELL不允许使⽤变量拼接,所以使⽤exec⽅法declare @EX NVARCHAR(255)SET @EX = 'EXEC XP_CMDSHELL ''MKDIR ' + @file_path + '''';EXEC(@EX)END--⽂件组名declare @filegroupname varchar(50);--⽂件组路径:完整路径,含⽂件名declare @filegrouppath varchar(300);--分区函数declare @partition_func varchar(128) ;set @partition_func = 'l_tms_partition_func';--分区结构declare @partition_scheme varchar(128) ;set @partition_scheme = 'l_tms_partition_scheme';--时间declare @datetime varchar(10);--按时间分区语句declare @fuction_sql varchar(1024);--按时间分区结构declare @scheme_sql varchar(1024);--建⽴12个分区declare @i int;set @i = 1;while @i<(@summonths+1)begindeclare @date varchar(10)if @i < 10beginset @date = '0' + convert(varchar,@i);endelsebeginset @date = convert(varchar,@i);end-- 添加⽂件组名;⽂件组名按⽇期:例如20180401set @datetime = @year + @date;set @filegroupname = 'Group' + @year + @date;set @sql = 'alter database ' + @servername + ' add filegroup '+ @filegroupname;print @sql;exec(@sql);--将⽂件组名与⽂件关联set @filegrouppath = @file_path + '\' + @filegroupname + '.ndf';set @sql = 'alter database '+ @servername + ' add file (name=N'''+ @filegroupname +''',filename=N'''+ @filegrouppath +''',size=5Mb,filegrowth=5mb) to filegroup '+ @filegroupname; print @sql;exec(@sql);--拼接按时间分区函数/拼接按时间分区结构if @i = 1beginset @fuction_sql = '''' + @datetime + '01 23:59:59' + '''' + ',';set @scheme_sql = '['+ @filegroupname +']' + ',';endelse if @i = 12beginset @fuction_sql = @fuction_sql + '''' + @datetime + '01 23:59:59' + '''';set @scheme_sql = @scheme_sql + '['+ @filegroupname +']';endelsebeginset @fuction_sql = @fuction_sql + '''' + @datetime + '01 23:59:59' + '''' + ',';set @scheme_sql = @scheme_sql + '['+ @filegroupname +']' + ',';endset @i = @i + 1;end-- 创建分区函数set @sql = 'create partition function '+ @partition_func +'(DATETIME) as range left for values('+ @fuction_sql+')';print @sql;exec(@sql);-- 创建分区结构(将分区函数和分区组对应起来)set @sql = 'create partition scheme '+ @partition_scheme +' as partition '+ @partition_func +' to(' + @scheme_sql + ',[Primary])';print @sql;exec(@sql);--将普通表转换为分区表--删除主键ALTER TABLE [dbo].[TMS_RealTimeEqptInfo] DROP constraint PK_TMS_RealTimeEqptInfo--创建主键,但不设为聚集索引ALTER TABLE [dbo].[TMS_RealTimeEqptInfo] ADD constraint PK_TMS_RealTimeEqptInfo PRIMARY KEY NONCLUSTERED([ID] ASC)ON [PRIMARY]--创建⼀个新的聚集索引,并在该聚集索引中使⽤分区⽅案;注意修改分区⽅案的名字,按字段WriteTime进⾏分区CREATE CLUSTERED INDEX CT_RealTimeData on TMS_RealTimeEqptInfo([WriteTime])ON etm_partition_scheme([WriteTime]) 数据库名称和数据表名称⾃⾏对应修改。
SqlServer中CREATEPARTITIONFUNCTION使⽤表分区的操作三步⾛:
1.创建分区函数
CREATE PARTITION FUNCTION xx1(int)
解释:在当前数据库中创建⼀个函数,该函数可根据指定列的值将表或索引的各⾏映射到分区。
语法:
CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type )
AS RANGE [ LEFT | RIGHT ]
FOR VALUES ( [ boundary_value [ ,...n ] ] )
[ ; ]
创建分区的范围:
AS RANGE LEFT FOR VALUES (10000, 20000);
注释:创建分区函数:myRangePF2,以INT类型分区,分三个区间,10000以内在A 区,1W-2W在B区,2W以上在C区.
2.创建分区架构:
CREATE PARTITION SCHEME myRangePS2
AS PARTITION xx1
TO (a, b, c);
注释:在分区函数XX1上创建分区架构:myRangePS2,分别为A,B,C三个区间
A,B,C分别为三个⽂件组的名称,⽽且必须三个NDF⾪属于这三个组,⽂件所属⽂件组⼀旦创建就不能修改
3.对表进⾏分区
CREATE TABLE [dbo].[AvCache](
[AVNote] [varchar](300) NULL,
[bb] [int] IDENTITY(1,1)
) ON [myRangePS2](bb); --注意这⾥使⽤[myRangePS2]架构(即分区策略),根据bb分区。
SQL SERVER 2005利用分区对大数据表处理操作手册超大型数据库的大小常常达到数百GB,有时甚至要用TB来计算。
而单表的数据量往往会达到上亿的记录,并且记录数会随着时间而增长。
这不但影响着数据库的运行效率,也增大数据库的维护难度。
除了表的数据量外,对表不同的访问模式也可能会影响性能和可用性。
这些问题都可以通过对大表进行合理分区得到很大的改善。
当表和索引变得非常大时,分区可以将数据分为更小、更容易管理的部分来提高系统的运行效率。
如果系统有多个CPU或是多个磁盘子系统,可以通过并行操作获得更好的性能。
所以对大表进行分区是处理海量数据的一种十分高效的方法。
本文通过一个具体实例,介绍如何创建和修改分区表,以及如何查看分区表。
SQL Server 2005是微软在推出SQL Server 2000后时隔五年推出的一个数据库平台,它的数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使用户可以构建和管理用于业务的高可用和高性能的数据应用程序。
此外SQL Server 2005结合了分析、报表、集成和通知功能。
这使企业可以构建和部署经济有效的BI解决方案,帮助团队通过记分卡、Dashboard、Web Services 和移动设备将数据应用推向业务的各个领域。
无论是开发人员、数据库管理员、信息工作者还是决策者,SQL Server 2005都可以提供出创新的解决方案,并可从数据中获得更多的益处。
它所带来的新特性,如T-SQL的增强、数据分区、服务代理和与.NetFramework的集成等,在易管理性、可用性、可伸缩性和安全性等方面都有很大的增强。
表分区的具体实现方法:表分区分为水平分区和垂直分区。
水平分区将表分为多个表。
每个表包含的列数相同,但是行更少。
例如,可以将一个包含十亿行的表水平分区成12个表,每个小表表示特定年份内一个月的数据。
任何需要特定月份数据的查询只需引用相应月份的表。
而垂直分区则是将原始表分成多个只包含较少列的表。
SQL Server 分区视图2011-05-17 20:58SQL Server 分区视图在数据库中,对于一些长年累月不断递增的表,难免会发生执行速度越来越慢的问题。
做分区表,是一种解决办法。
“:>>>>>>假如条件不允许做分区表的话,例如:当你创建一个分区函数的时候,系统提示你:只能在 SQL Server Enterprise Edition 中创建分区函数。
只有 SQL Server Enterprise Edition 支持分区。
那么分区表,是没法用了,只能想别的办法了。
情况一或者是数据库里面的一张大表,已经按时间,拆分为多个小表了。
但是客户要求软件里面,查询数据,要和没拆分之前一样。
例如:原先的 sale_data 包含 2008年--今天的数据。
现在的 sale_data 被拆分为 sale_data_2008,sale_data_2009,sale_data_2010,sale_data(这个仅保存2011年数据)也就是假如客户要查询 2009年12月-2010年1月的报表。
不好意思,你要自己判断了。
先判断时间 2009年12月,然后去检索 sale_data_2009 表的部分数据接着再判断时间 2010年1月,然后去检索 sale_data_2010 表的部分数据.情况二或者是数据库本身就被设计成多张小表。
例如:有个仓库字典表记录着仓库的名字,仓库的表名。
表里面的数据可能是大仓库1 tab_big1大仓库2 tab_big2小仓库1 tab_small小仓库2 tab_small小仓库3 tab_small有很多个仓库表(表名就是仓库字典表中所定义的),记录着当前仓库存储着什么物品。
当你要查询某个仓库的库存报表的时候。
不好意思,你要先去仓库字典表,先查询出这个仓库名字所对应的数据库表名称叫啥。
然后再 SELECT * FROM 表名。
如果你要查询,现在这个时候,某样物品,都在哪些仓库有,各有多少个,那就更悲惨了。
SqlServer数据库分区分表实例分享(有详细代码和解释)数据库单表数据量太⼤可能会导致数据库的查询速度⼤⼤下降(感觉都是千万级以上的数据表了),可以采取分区分表将⼤表分为⼩表解决(当然这只是其中⼀种⽅法),⽐如数据按⽉、按年分表,最后可以使⽤视图将⼩表重新并为总的虚拟表,其实并不影响上层程序的使⽤(程序也许都不知道分表了)。
主要步骤:1、新建⽂件组,将数据表⽂件保存路径指向相应⽂件组(应将⽂件组和⽂件放⼊不同的磁盘中,甚⾄不同服务器形成分布式数据库,因为数据的读取瓶颈很⼤程度在于磁盘的的读写速度,多个磁盘存放⼀个表可以负载均衡)2、设置分区函数(声明分区的标准)3、设置分区⽅案(即哪些区域使⽤哪个分区函数,形成完整的分区⽅案)4、给新表或现有表设置分区⽅案5、建⽴视图详细步骤(看需求可选):⼀、数据库状态备份和恢复USE master-- 备份BACKUP DATABASE AdventureWorksTO DISK = 'AdventureWorks.bak'WITH FORMAT---- 恢复RESTORE DATABASE AdventureWorksFROM DISK = 'AdventureWorks.bak'WITH REPLACEGO⼆、⽂件组和⽂件操作添加⽂件组USE [master]GOALTER DATABASE ZHH ADD FILEGROUP [⽂件组名称]Go添加⽂件并把其指向指定⽂件组USE master;GOALTER DATABASE 数据库名ADD FILE(NAME=N'⽂件名',FILENAME='存放路径', //如:E:\201109.NDF(精确到⽂件名)⽂件组存放与不同磁盘可以提⾼IO读写效率(多个磁头并发)SIZE=3MB,MAXSIZE=100MB,FILEGROWTH=5MB)TO FILEGROUP [⽂件组名]Go修改⽂件(可选)USE master;GOALTER DATABASE 数据库名MODIFY FILE(NAME = ⽂件名,SIZE = 20MB); //可以修改所有属性,列举即可GO删除⽂件(可选)ALTER DATABASE 数据库名 REMOVE FILE [⽂件组名]三、分区函数和分区⽅案分区函数⽤于规范如何分区的标准,如已哪列进⾏为标准分区、分区的⽅式(按时间、ID等)、分区的具体界限(⼀般来说,界限指标数要⽐分区数少1,⼀⼑则有两段)USE 数据库名GOCREATE PARTITION FUNCTION 分区函数名 (指标列的数据类型) //如:datetime、intAS RANGE RIGHT //右边界切分,默认为LEFTFOR VALUES (划分界限) //如时间划分('2003/01/01', '2004/01/01'),两个时间界限可划分出三个分区GO分区⽅案⽤于将已经建⽴好的分区函数组织成完整的⽅案,为每个分区分配存储位置Use 数据库名gocreate partition scheme 分区⽅案名as partition 分区函数to(⽂件组1,⽂件组2,⽂件组3,...) //注意分区数要与实际分区⼀致go在原有的基础上添加分区(可选)use 数据库名goalter partition scheme ps_OrderDate next used [FG4] //修改分区⽅案ps_OrderDate,定义新新分区使⽤FG4⽂件组alter partition function pf_OrderDate() split range('2005/01/01') //修改分区函数pf_OrderDate,在末尾添加界限'2005/01/01'go为现有表设置分区⽅案(可选)//为AutoBench表的InsertTime列创建新聚集索引,并绑定Scheme_DateTime分区⽅案CREATE CLUSTERED INDEX IX_CreateDate ON AutoBench (InsertTime)ON Scheme_DateTime (InsertTime)注:如原来主键有聚众索引要将其改为⾮聚集索引,才可添加新聚众索引//删除原主键上的聚集索引PK_ProductALTER TABLE Product DROP CONSTRAINT PK_Product//重新创建主键⾮聚集索引PK_ProductALTER TABLE Product ADD CONSTRAINT PK_Product PRIMARY KEY NONCLUSTERED (ProductID ASC)上⾯语句也可直接在索引属性中将聚集改为⾮聚集为新建表设置分区⽅案(可选)//创建表格Order,并设置Scheme_DateTime分区⽅案,指标列为OrderDateCREATE TABLE [Order](OrderID INT IDENTITY(1,1) NOT NULL,UserID INT NOT NULL,TotalAmount DECIMAL(18,2) NULL,OrderDate DATETIME NOT NULL) ON Scheme_DateTime (OrderDate)查询分区数据四、其他操作查询分区数据$partition函数--为任何指定的分区函数返回分区号,⼀组分区列值将映射到该分区号中语法: [ database_name. ] $PARTITION.partition_function_name(expression)参数: database_name 包含分区函数的数据库的名称。
SQLServer⾼级进阶之分区表创建⼀、分区表概念1.1、什么是分区表?分区表是在SQL Server 2005之后的版本引⼊的特性,这个特性允许把逻辑上的⼀个表在物理上分为很多部分。
换句话说,分区表从物理上看是将⼀个⼤表分成⼏个⼩表,但是从逻辑上看,还是⼀个⼤表。
1.2、分区与分表的区别分区:就是把⼀张表的数据分成N个区块,从逻辑上看只是⼀张表,但底层是由N个物理区块组成的。
分表:就是把⼀张表按⼀定的规则分解成N个具有独⽴存储空间的实体表。
1.3、⽔平分表与垂直分表的区别⽔平分表:将⼀张表中的数据分成多个表且表结构不变。
垂直分表:将⼀张表按照字段分成不同表且表结构发⽣改变。
⼆、分区表优点2.1、使⽤多个⽂件分布数据到多个硬盘中,可以极⼤地提⾼IO性能。
2.2、多个⽂件对于数据略多的数据库来说,备份和恢复都会轻松很多。
三、分区表场景3.1、数据库中某个表的数据量很⼤,在查询数据时会明显感觉到速度很慢,这种情况可以考虑分区表。
3.2、数据是分段的,如以年份为分隔的数据,对于当前的数据经常进⾏增删改查操作,⽽对于往年的数据⼏乎不做操作或只做查询操作,这种情况可以考虑分区表。
3.3、对数据的操作如果只涉及⼀部分数据⽽⾮全部数据,这种情况可以考虑分区表。
3.4、如果⼀张表的数据经常进⾏增删改查操作,⽽不管年份之类的因素,这种情况最好不要考虑分区表。
四、分区表创建4.1、创建步骤创建分表区的步骤分为5步:1)创建数据库⽂件组2)创建数据库⽂件注:应将⽂件组和⽂件存放于不同的硬盘甚⾄不同的服务器中,因为数据的读取瓶颈很⼤程度在于硬盘的读写速度,多个硬盘存储⼀个表可以实现负载均衡。
3)创建分区函数注:声明分区的标准。
4)创建分区⽅案注:即哪些区域使⽤哪个分区函数,形成完整的分区⽅案。
5)创建分区表4.2、创建实操背景:现以表Sales.SalesOrderHeader作为⽰例,此表有2011-2014年的数据。
SQL Server 创建表分区原文转自:/panchunting/p/SQLServer_TablePartition.html
先准备测试表
CREATETABLE[dbo].[Employee] (
EmployeeNo INT IDENTITY(1,1) PRIMARYKEY,
EmployeeName NVARCHAR(50) NULL
);
插入一些数据
INSERT Employee DEFAULTVALUES;
GO10000
UPDATE Employee set EmployeeName='Employee '+CONVERT(VARCHAR, EmployeeNo)
创建文件组
创建文件(为了性能,可以设定文件Path分布在不同的磁盘分区上)
创建分区准备
选择分区列
创建分区函数
创建分区框架
定义边界值,分区,因为有5个边界值,所以需6个分区
产生的脚本文件(换句话说上面的步骤等同于下面的语句)
USE[TestingDB]
GO
BEGINTRANSACTION
CREATE PARTITION FUNCTION[EmpFunction](int) AS RANGE RIGHT FORVALUES (N'2000', N'4000', N'6000', N'8000', N'10000')
CREATE PARTITION SCHEME [FunScheme]AS PARTITION [EmpFunction]TO ([FileGroup1], [FileGroup2], [FileGroup3], [FileGroup4], [FileGroup5], [PRIMARY])
ALTERTABLE[dbo].[Employee]DROPCONSTRAINT[PK__Employee__7AD0F1B633D4B598]
ALTERTABLE[dbo].[Employee]ADDPRIMARYKEYCLUSTERED
(
[EmployeeNo]ASC
)WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, SORT_IN_TEMPDB =OFF, IGNORE_DUP_KEY =OFF, ONLINE =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON[FunScheme]([EmployeeNo])
COMMITTRANSACTION
执行上面的SQL语句
其中语句ON [FunScheme]([EmployeeNo])是关键,表明了表Employee依赖分区框架FunScheme来进行分区,分区的列为EmployeeNo
而分区框架有依赖于分区函数,即分区表依赖分区框架,分区框架又依赖于分区函数
查看表分区结果
作者:舍长
出处:/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.。