分区是一个相当一般的概念,可以在许多情况下应用.当它考虑关系数据的分区时,通常是指逐行(水平)或逐列(垂直)分解表.
垂直分割(又称行分割)使用与数据库规范化相同的分割技术,但通常的术语(垂直/水平)数据分区是指物理优化,而归一化是概念层面的优化.
因为你要求一个简单的示范 – 假设你有一个这样的表:
create table data (
id integer primary key,
status char(1) not null,
data1 varchar2(10) not null,
data2 varchar2(10) not null);
垂直分割数据的一种方法:将其拆分如下:
create table data_main (
id integer primary key,
status char(1) not null,
data1 varchar2(10) not null );
create table data_rarely_used (
id integer primary key,
data2 varchar2(10) not null,
foreign key (id) references data_main (id) );
例如,当您的查询中很少需要列数据2时,可以应用这种分区.分区data_main将占用更少的空间,因此全表扫描将更快,并且更有可能适合DBMS页面缓存.缺点:当您必须查询所有数据列时,您实际上必须加入表,查询原始表格将会更昂贵.
请注意,您按照与规范化表格相同的方式拆分列.然而,在这种情况下,数据可能已经被归一化为3NF(甚至BCNF和4NF),但是您决定进一步将其拆分为物理优化的原因.
使用Oracle语法水平分区数据的一种方式:
create table data (
id integer primary key,
status char(1),
data1 varchar2(10),
data2 varchar2(10) )
partition by list (status) (
partition active_data values ( 'A' ),
partition other_data values(default)
);
这将告诉DBMS根据列状态的值将表数据内部存储在两个段(如两个表)中.例如,当您通常只查询一个分区的行,例如状态“A”行(让我们称之为活动行)时,可以应用这种分区数据的方法.像以前一样,完全扫描将更快(特别是如果只有少数活动行),活动行(以及其他行)可以连续存储(它们不会分散在它们与不同行的行共享的页面之间)状态值,并且活动行更有可能在页面缓存中.