数据库分区 – 水平与垂直 – 归一化和行拆分之间的差异?
我试图把握数据库分区的不同概念,这是我所理解的:
水平分区/分片:将表分解为不同的表,其中将包含初始表中的行的一部分(我已经看到很多,如大陆分裂Users表,例如北美的一个子表,另一个为欧洲等).每个分区处于不同的物理位置(了解“机器”). 垂直分区:根据我的理解(http://technet.microsoft.com/en-us/library/ms178148%28v=sql.105%29.aspx),有两种垂直分区: >规范化(其中包括通过拆分表并将其与外键链接来从数据库中删除冗余). 我还在这篇文章(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”行(让我们称之为活动行)时,可以应用这种分区数据的方法.像以前一样,完全扫描将更快(特别是如果只有少数活动行),活动行(以及其他行)可以连续存储(它们不会分散在它们与不同行的行共享的页面之间)状态值,并且活动行更有可能在页面缓存中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |