水平分区/分片:将表分解为不同的表,其中将包含初始表中的行的一部分(我已经看到很多,如大陆分裂Users表,例如北美的一个子表,另一个为欧洲等).每个分区处于不同的物理位置(了解“机器”).
据我所知,水平分区和分片是完全相同的东西(?).
垂直分区:根据我的理解(http://technet.microsoft.com/en-us/library/ms178148%28v=sql.105%29.aspx),有两种垂直分区:
>规范化(其中包括通过拆分表并将其与外键链接来从数据库中删除冗余).
> Row Splitting,这里是我不明白的,Normalization和Row Splitting有什么区别?这两种技术在哪些方面有所不同?
我还在这篇文章(Difference between scaling horizontally and vertically for databases)中看到,水平分区和垂直分区之间的区别在于,首先通过添加更多的机器进行扩展,而在第二个中,您可以通过向现有的增加更多的功率(cpu,RAM)机器是正确的定义?我认为这两种技术的核心区别在于您拆分表的方式.
我很抱歉的问题的负担,但我有点困惑,因为我遇到的很多不同的网站说不同的事情.
任何帮助澄清将不胜感激.任何链接到一个清晰简单的示范与几个表也将是非常有帮助的.
解决方法
垂直分割(又称行分割)使用与数据库规范化相同的分割技术,但通常的术语(垂直/水平)数据分区是指物理优化,而归一化是概念层面的优化.
因为你要求一个简单的示范 – 假设你有一个这样的表:
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,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”行(让我们称之为活动行)时,可以应用这种分区数据的方法.像以前一样,完全扫描将更快(特别是如果只有少数活动行),活动行(以及其他行)可以连续存储(它们不会分散在它们与不同行的行共享的页面之间)状态值,并且活动行更有可能在页面缓存中.