前提是你的表上有聚焦索引(一般主键默认就是聚焦索引) 而且改的时候要把普通索引删除掉(因为改是通过删除聚焦索引实现数据切换的, 所以不删除普通索引会导致普通索引被重建, 而切换到分区表再建立聚焦索引的时候又会导致普通索引重建一次, 所以删除普通索引再重建可以避免两次重建普通索引) USE tempdb GO -- 测试表 CREATE TABLE dbotb( id int, CONSTRAINT PK_id PRIMARY KEY CLUSTERED( id) ) INSERT dbotb SELECT 1 UNION ALL SELECT 10 GO -- 切换为分区表 -- 分区函数 CREATE PARTITION FUNCTION PF_test(int) AS RANGE LEFT FOR VALUES(5) -- 分区架构 CREATE PARTITION SCHEME PS_test AS PARTITION PF_test ALL TO( [PRIMARY]) -- 切换到分区表 ALTER TABLE dbotb DROP CONSTRAINT PK_id WITH( MOVE TO PS_test(id))
五个步骤。
第一步,查询重命名表:ALTER TABLE test1 RENAME TO test2;
第二步,修改表字段命名// ALTER TABLE employee CHANGE name ename String;
第三步,修改表字段类型ALTER TABLE employee CHANGE salary salary double ;
第四步,添加列语句:ALTER TABLE employee ADD COLUMNS (dept STRING COMMENT 'Department name’);
第五步,加分区表字段:ALTER TABLE table_name add columns( dept string COMMENT '') CASCADE;
普通表txn转换成分区表
一 创建普通表txn
SQL> create table txn as select level as id from dual connect by level<=29;
SQL> desc txn
Name Null Type
----------------------------------------- -------- ----------------------------
ID NUMBER
二 创建表空间
SQL> create tablespace t1 datafile '/home/oracle/t1dbf' size 5M;
SQL> create tablespace t2 datafile '/home/oracle/t2dbf' size 5M;
SQL> create tablespace t3 datafile '/home/oracle/t3dbf' size 5M;
三 创建分区表,命名为txn_1
SQL> create table txn_1(id number) partition by range(id)
2 (
3 partition part1 values less than(10) tablespace t1,
4 partition part2 values less than(20) tablespace t2,
5 partition part3 values less than(30) tablespace t3
6 );
四 导出普通表数据
[oracle@ogg1 ~]$ exp chen/chen file=txndmp tables=txn
五 更改表名
SQL> rename txn to txn_old;
SQL> rename txn_1 to txn;
六 将数据导入到分区表中
[oracle@ogg1 ~]$ imp chen/chen file=txndmp fromuser=chen touser=chen ignore=y
七 查看分区表
SQL> col table_name for a10
SQL> col partition_name for a10;
SQL> select table_name,partition_name from user_tab_partitions;
TABLE_NAME PARTITION_
---------- ----------
TXN PART1
TXN PART2
TXN PART3
SQL> select from txn partition(part2);
ID
----------
10
11
12
13
14
15
16
17
18
19
10 rows selected
其实不需要拆分表,分区就可以,还是原来的表名,只是将原来的表分成了若干的分区,这样能起到分表的效果,还不用分成很多的表。
比如你原来的表的名字是A,那么将该表改为A1,然后从新建立一个分区表A,分区的依据是班级,也就是list分区,也就是一般意义上的列表分区表。
然后再将A1的数据插入新A表就可以了。
至于分区表的建立方式,往上很多,可以自行查找。
这样 *** 作查询的语句不需要变,只是在不跨分区查询的情况下,相当于分成了若干张表去查询。比如查询1班的成绩,那么就是在1班的分区内,不会有2班的问题,就相当于你用一个指头就能解决问题,不会动用这个手一样。
如果分表的话,那么假设有12个班,那么就要建立12张表,这样的话,语句就要写12次,冗余太大了。
分区介绍:
一、什么是分区?
所谓分区,就是将一个表分成多个区块进行 *** 作和保存,从而降低每次 *** 作的数据,提高性能。而对于应用来说则是透明的,从逻辑上看只有一张表,但在物理上这个表可能是由多个物理分区组成的,每个分区都是独立的对象,可以进行独立处理。
二、分区作用
1可以逻辑数据分割,分割数据能够有多个不同的物理文件路径。
2可以存储更多的数据,突破系统单个文件最大限制。
3提升性能,提高每个分区的读写速度,提高分区范围查询的速度。
4可以通过删除相关分区来快速删除数据
5通过跨多个磁盘来分散数据查询,从而提高磁盘I/O的性能。
6涉及到例如SUM()、COUNT()这样聚合函数的查询,可以很容易的进行并行处理。
7可以备份和恢复独立的分区,这对大数据量很有好处。
三、分区能支持的引擎
MySQL支持大部分引擎创建分区,入MyISAM、InnoDB等;不支持MERGE和CSV等来创建分区。同一个分区表中的所有分区必须是同一个存储引擎。值得注意的是,在MySQL8版本中,MyISAM表引擎不支持分区。
四、确认MySQL支持分区
从MySQL51开始引入分区功能,可以如下方式查看是否支持:
老版本用:SHOW VARIABLES LIKE '%partition%';
新版本用:show plugins;
五、分区类型
1 RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
例如,可以将一个表通过年份划分成两个分区,2001 -2010年、2011-2020。
2 LIST分区:类似于RANGE分区,LIST是列值匹配一个离散值集合中的某个值来进行选择。
比如 根据字段 把值为1、3、5的放到一起,2、4、6的另外放到一起 等等
3 HASH分区:基于用户定义的表达式的返回值来进行选择分区,该表达式使用将要插入到表中的这些行的列值来进行计算,这个函数必须产生非负整数值。
通过HASH运算来进行分区,分布的比较均匀
4 KEY分区:类似于按HASH分区,由MySQL服务器提供其自身的哈希函数。
按照KEY进行分区类似于按照HASH分区
六、使用分区注意事项
1 如果表中存在primary key 或者 unique key 时,分区的列必须是paimary key或者unique key的一个组成部分,也就是说,分区函数的列只能从pk或者uk这些key中取子集
2 如果表中不存在任何的paimary key或者unique key,则可以指定任何一个列作为分区列
3 55版本前的RANGE、LIST、HASH分区要求分区键必须是int;MySQL55及以上,支持非整形的RANGE和LIST分区,即:range columns 和 list columns (可以用字符串来进行分区)。
七、分区命名
1 分区的名字基本上遵循其他MySQL 标识符应当遵循的原则,例如用于表和数据库名字的标识符。应当注意的是,分区的名字是不区分大小写的。
2 无论使用何种类型的分区,分区总是在创建时就自动的顺序编号,且从0开始记录。
八、 创建分区
1 RANGE分区:
解读:以上为 uuid小于5时放到p0分区下,uuid大于5且小于10放到p1分区下,uuid大于10且小于15放到p2分区下,uuid大于15 一直到最大值的存在p3分区下
2 LIST分区:
解读:以上为uuid 等于1/2/3/5时放到p0分区,7/9/10放到p1分区,11/15放到p2分区。当时用insert into时 如果uuid的值不存在p0/p1/p2分区时,则会插入失败而报错。
3 HASH分区:
HASH分区主要用来确保数据在预先确定数目的分区中平均分布。在RANGE分区和LIST分区中必须明确指定一个指定的列值或列值集合以指定应该保存在哪个分区中。而在HASH分区中,MySQL会自动完成这些工作,要做的只是基于将要被哈希的列值指定一个表达式,以及指定被分区的表将要被分割成的分区数量,如:
解读:MySQL自动创建3个分区,在执行insert into时,根据插入的uuid通过算法来自动分配区间。
注意:
(1) 由于每次插入、更新、删除一行,这个表达式都要计算一次,这意味着非常复杂的表达式可能会引起性能问题,尤其是在执行同时影响大量行的运算(例如批量插入)的时候。
(2) 最有效率的哈希函数是只对单个表列进行计算,并且它的值随列值进行一致的增大或减小,因为这考虑了在分区范围上的“修剪”。也就是说,表达式值和它所基于的列的值变化越接近,就越能有效地使用该表达式来进行HASH分区。
31:线性HASH分区
线性HASH分区在“PARTITION BY”子句中添加“LINEAR”关键字。
线性HASH分区的有点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有及其大量数据的表。它的缺点在于各个分区间数据的分布不大可能均衡。
4 KEY分区
类似于HASH分区,HASH分区允许用户自定义的表达式,而KEY分区则不允许使用用户自定义的表达式;HASH分区只支持整数分区,KEY分区支持除了blob和text类型之外的其他数据类型分区。
与HASH分区不同,创建KEY分区表的时候,可以不指定分区键,默认会选择使用主键或唯一键作为分区键,没有主键或唯一键,就必须指定分区键。
解读:根据分区键来进行分区
5 子分区
子分区是分区表中,每个分区的再次分割,适合保存非常大量的数据。
解读:主分区使用RANGE按照年来进行分区,有3个RANGE分区。这3个分区中又被进一步分成了2个子分区,实际上,整个表被分成了3 2 = 6个分区。每个子分区按照天进行HASH分区。小于2017的放在一起,2017-2020的放在一起,大于2020的放在一起。
注意:
(1) 在MySQL51中,对于已经通过RANGE或LIST分区了的表在进行子分区是可能的。子分区既可以使用HASH分区,也可以使用KEY分区。这也被称为复合分区。
(2) 每个分区必须有相同数量的子分区。
(3) 如果在一个分区表上的任何分区上使用SUBPARTITION来明确定义任何子分区,那么就必须定义所有的子分区。
(4) 每个SUBPARTITION子句必须包含(至少)子分区的一个名字。
(5) 在每个子分区内,子分区的名字必须是惟一的,目前在整个表中,也要保持唯一。例如:
子分区可以用于特别大的表,可以在多个磁盘间分配数据和索引。例如:
九、MySQL分区处理NULL值的方式
十、分区管理概述
可以对分区进行添加、删除、重新定义、合并或拆分等管理 *** 作。
① RANGE和LIST分区的管理
1 删除分区语句如:alter table tbl_test drop partition p0;
注意:
(1) 当删除了一个分区,也同时删除了该分区中所有的数据。
(2) 可以通过show create table tbl_test;来查看新的创建表的语句。
(3) 如果是LIST分区的话,删除的数据不能新增进来,因为这些行的列值包含在已经删除了的分区的值列表中。
2 添加分区语句如:alter table tbl_test add partition(partition p3 values less than(50));
注意:
(1) 对于RANGE分区的表,只可以添加新的分区到分区列表的最高端。
(2) 对于LIST分区的表,不能添加已经包含在现有分区值列表中的任意值。
3 如果希望能不丢失数据的条件下重新定义分区,可以使用如下语句:
REORGANIZE会对分区的数据进行重构。
ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO(partition_definitions)
(1) 拆分分区如:
ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO(partition s0 values less than(5),partition s1 values less than(10));
或者如:
ALTER TABLE tbl_name REORGANIZE PARTITION p0 INTO(partition s0 values in(1,2,3), partition s1 values in(4,5));
(2) 合并分区如:ALTER TABLE tbl_name REORGANIZE PARTITION s0,s1 INTO(partition p0 values in(1,2,3,4,5));
4 删除所有分区,但保留数据,形式:ALTER TABLE tbl_name remove partitioning;
② HASH和KEY分区的管理
1 减少分区数量语句如:ALTER TABLE tbl_name COALESCE PARTITION 2;
2 添加分区数量语句如:ALTER TABLE tbl_name add PARTITION partitions 2;
③ 其他分区管理语句
1 重建分区:类似于先删除保存在分区中的所有记录,然后重新插入它们,可用于整理分区碎片。如:ALTER table tbl_name REBUILD PARTITION p2,p3;
2 优化分区:如果从分区中删除了大量的行,或者对一个带有可变长度的行(也就是说,有VARCHAR,BLOB或TEXT类型的列)做了许多修改,可以使用 ALTER TABLE tbl_name OPTIMIZE PARTITION来收回没有使用的空间,并整理分区数据文件的碎片。如:ALTER TABLE tbl_name OPTIMIZE PARTITION p2,p3;
3 分析分区:读取并保存分区的键分布,如:ALTER TABLE tbl_name ANALYZE PARTITION p2,p3;
4 检查分区:检查分区中的数据或索引是否已经被破坏,如:ALTER TABLE tbl_name CHECK PARTITION p2,p3;
5 修补分区:修补被破坏的分区,如:ALTER TABLE tbl_name REPAIR PARTITION p2,p3;
十、查看分区信息
1 查看分区信息:select from information_schemapartitions where table_schema='arch1' and table_name = 'tbl_test' G;
2 查看分区上的数据:select from tbl_test partition(p0);
3 查看MySQL会 *** 作的分区:explain partitions select from tbl_test where uuid = 2;
十一、 局限性
1 最大分区数目不能超过1024,一般建议对单表的分区数不要超过50个。
2 如果含有唯一索引或者主键,则分区列必须包含在所有的唯一索引或者主键在内。
3 不支持外键。
4 不支持全文索引,对分区表的分区键创建索引,那么这个索引也将被分区。
5 按日期进行分区很合适,因为很多日期函数可以用。但是对字符串来说合适的分区函数不太多。
6 只有RANGE和LIST分区能进行子分区,HASH和KEY分区不能进行子分区。
7 临时表不能被分区。
8 分区表对于单条记录的查询没有优势。
9 要注意选择分区的成本,没插入一行数据都需要按照表达式筛选插入的分区。
10 分区字段尽量不要可以为null
TiDB是一款分布式关系型数据库,支持多种表类型,其中包括普通表和分区表。如果需要将普通表转换为分区表,可以按照以下步骤进行 *** 作:
第一步:创建分区表。在创建分区表时,需要使用CREATE TABLE语句,并设置分区键和分区方式。分区键是用来确定每个分区的依据,分区方式则是指定如何对分区键进行划分。
第二步:将普通表数据导入分区表。这里可以使用INSERT INTO语句将数据从普通表中导入到分区表中。请注意,分区表中的每个分区都需要手动创建,并且必须按照分区键的要求进行划分。
第三步:修改应用程序。因为分区表的结构和普通表不同,所以需要修改应用程序以适应新的表结构。
总之,将TiDB普通表转换为分区表需要按照以上步骤进行 *** 作,以确保数据的完整性和正确性。
以上就是关于sql server 2005表分区全部的内容,包括:sql server 2005表分区、数据库如何修改表格的存储格式、如何将Oracle数据库的普通表转换成分区表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)