我试图掌握数据库分区的不同概念,这就是我对它的理解:
水平分区/分片:将表拆分到不同的表中,该表将包含初始表中的行的子集(如果按大陆分割Users表,我已经看到了很多示例,如北美的子表,另一个为欧洲等...).每个分区位于不同的物理位置(了解"机器").据我所知,水平分区和分片是完全相同的(?).
垂直分区:根据我的理解(http://technet.microsoft.com/en-us/library/ms178148%28v=sql.105%29.aspx),有两种垂直分区:
规范化(包括通过拆分表并使用外键链接来从数据库中删除冗余).
Row Splitting,这是我不明白的,Normalization和Row Splitting有什么区别?那两种技术在哪些方面有所不同?
我还读过这篇文章(数据库水平和垂直缩放之间的差异),水平分区和垂直分区之间的区别在于,您通过添加更多机器来扩展第一个,而在第二个中您通过添加更多功率进行扩展( CPU,RAM)到你现有的机器,是一个正确的定义?我认为这两种技术之间的核心区别在于您分割表格的方式.
对于大量问题我很抱歉,但是我有点困惑,因为我遇到的很多不同的网站都说不同的东西.
任何帮助澄清将不胜感激.任何带有几个表格的简单演示的链接也会非常有用.
保持所有领域EG:表Employees
有
ID,
名称,
地理位置 ,
电子邮件,
指定,
电话
EG:1.保留所有字段并在多台machine.ay id = 1-100000或100000-200000记录中分配记录,每台记录在一台机器上并分布在多台机器上.
EG:2.为EG区域保留单独的数据库:亚太地区,北美
密钥:根据标准挑选行集
它类似于规范化,其中同一个表被分成多个表,并在需要时与连接一起使用.
EG: ,
,id
放在一个表,这可能不被频繁访问被放在另一个.name
designation
phone
email
关键:根据标准挑选一组列.
水平/垂直缩放与分区不同
是为了增加更多的机器,以提高包括数据库在内的任何系统的响应能力和可用性.这个想法是将工作负载分配给多台机器.
是以CPU,内存形式向现有机器或机器添加更多功能,以提高包括数据库在内的任何系统的响应能力和可用性.在虚拟机设置中,可以虚拟配置,而不是添加真正的物理机.
Sameer Sukumaran
分区是一个相当普遍的概念,可以在许多情况下应用.当它考虑关系数据的分区时,它通常指的是逐行(水平)或逐列(垂直)分解表.
垂直分区(又称行分割)使用与数据库规范化相同的分割技术,但通常术语(垂直/水平)数据分区是指物理优化,而归一化是概念级别的优化.
既然你要求一个简单的演示 - 假设你有一个这样的表:
create table data ( id integer primary key, status char(1) not null, data1 varchar2(10) not null, data2 varchar2(10) not null);
data
垂直分区的一种方法:按如下方式拆分:
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) );
例如,当您在查询中很少需要列data2时,可以应用这种分区.分区data_main将占用更少的空间,因此全表扫描将更快,并且它更有可能适合DBMS的页面缓存.缺点:当您必须查询所有列时data
,您必须加入表,查询原始表将更加昂贵.
请注意,您正在以与规范化表格时相同的方式拆分列.但是,在这种情况下data
,已经可以将其标准化为3NF(甚至BCNF和4NF),但您决定进一步拆分它以进行物理优化.
使用Oracle语法data
水平分区的一种方法:
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 data
在两个段(如两个表)内部存储表,具体取决于列的值status
.这种分区data
方式可以应用,例如,当您通常只查询一个分区的行时,例如状态"A"行(让我们称之为活动行).像以前一样,完全扫描会更快(特别是如果只有很少的活动行),活动行(和其他行resp.)是连续存储的(它们不会分散在它们与不同行共享的页面周围状态值,活动行更有可能位于页面缓存中.