什么是数据库分区?分区是将表和索引分成更小的部分,甚至将它们细分为更小的部分。可以把它想象成在一个大仓库(一张大桌子)中拥有数百万本不同主题和年份(例如2000-2019)的不同杂志。分区意味着您将把它们组织在那个大仓库的不同房间里。它们仍然属于一个仓库,但现在您可以根据您的数据库分区策略将它们分组在一个逻辑级别上。使用数据库分区有什么好处?一个好的分区策略是可行的,原因有很多,例如更好的性能、更好的可管理性、更高的可用性或负载平衡。(1)更好的性能如果以上面的杂志仓库为例,你要找的是2009年10月号的《体育画报》,而仓库是按发行年份划分的,你可以简单地在房间里看看或者找到你想要的2009分区。现在,想象一下,在你仓库的一个“2009”房间里,你放了几个大箱子,你把杂志按主题或出版物(“体育画报”、“专业摄影师”、“钓鱼英雄”、...).这将创建一个小节,这将使您更容易找到您想要的杂志,因为您将不再需要浏览所有的《 2009年》杂志,而是可以直接进入2009会议室,然后直奔体育画报的盒子。这就是性能的划分。现在,如果你把不同的杂志放在柜子里,所有杂志的背面(标题和月份/年份)都在外面,那就是一样的就像添加索引一样。这使您可以快速找到合适的杂志并挑选出来,而不是必须挑选每本杂志并通读整本杂志,直到找到您需要的那本。如果您需要来自的数据(杂志)两个或更多不同的分区(房间,盒子)你可以有两个或更多的过程es(人们)正在寻找它,同时您仍然确保他们不会重复两次查看同一部分。(2)更好的可管理性和负载平衡您可以将不同的逻辑分区存储在不同的物理磁盘上,甚至在某些情况下甚至可以存储在服务器上。这样,在一个分区/磁盘/服务器上工作并不一定意味着其他分区必须脱机。维护也是如此,如果只保留最近10年的数据,并且按年份范围对表进行分区,则可以轻松删除(或备份和删除)最旧的分区。回到仓库比较,如果你每年把你的仓库分成房间,你在2011年房间完成工作,其他所有房间仍然可用。如果你想删除2000年的所有杂志,你可以从一个房间里拿出所有东西,而不是每年都翻阅每本杂志。(3)HigherAvailability由于故障或其他原因导致的宕机并不一定会对其他分区产生影响。备份和恢复也是如此,您可以独立于其他分区对每个分区进行操作,从而减少停机时间。我应该什么时候对我的表进行分区?以下是分区策略中需要考虑的一些事项:大型表始终是分区的理想选择,超过2Gb的一切都是一个开始。如果您的表中有历史数据,并且数据将按时间顺序添加。例如,如果您每月或每天批量加载数据,则尤其如此。在这种类型的分区中,一个分区只能保持最新的分区可更新,而其他分区(旧的)是只读的。如果您需要在不同类型的存储(在某些情况下甚至是服务器)之间分发表。例如,大多数查询在最近三年的分区上运行,但您需要在表中保留10年的数据。最老的7岁很少被查询。这样,您可以将最新的三个分区放在高性能SSD驱动器上,而将最旧的7个分区放在较旧且价格较低但速度较慢的HD驱动器上。为什么不使用索引而是使用分区?好吧,索引很好。他们甚至很棒!它们绝对是您数据库性能工具箱中必不可少的。但是索引非常擅长检索小部分数据,尤其是分散在整个表中的数据。如果索引可以提供超过20%的数据,则可以认为它们最终表现最佳,而真正的临界点可能是数据的1%-5%。但当然这在很大程度上取决于许多不同的因素,例如服务器、设置、数据、天气(不,不是天气!),……最重要的是:不要考虑分区或索引。在一个好的分区策略中,仍然有很大的空间和机会可以很好地利用索引。例如,我上面的杂志仓库示例,在仓库内按年份分区,在房间内按出版物分区。通过使标题/月份在柜子中而不是框(将创建索引)中更加可见,这为性能改进留下了更多机会。我可以基于什么数据库分区策略?您在分区表中输入的每一行都应明确属于特定分区。分区键定义行将存储在哪个分区中。这个partitionkey可以是单个字段,也可以是字段的组合,只要是有歧义的,就是唯一的。回到杂志示例,您可以使用“出版年份”作为分区键,但不能使用“ImagesContainingCarBrands”作为分区键和每个品牌的分区,因为那意味着最新的“TopGearMagazine”“需要在“法拉利”和“阿斯顿马丁”两个部门,等等。有哪些不同类型的分区?RangepartitioningListpartitioningHashpartitioningSubpartitioning(1)Rangepartitioning按值的范围进行分区。这意味着表已分区,如果分区键的值在该分区范围内,则行属于特定分区。比如杂志:我们每年都会把仓库分房间。这意味着我们有范围分区,其中每个分区的范围从01–01-YYYY到31–12-YYYY。因此,如果我有一本发行日期为2015年5月的杂志,它将进入2015年5月1日至2015年1月31日至2015年12月31日的范围分区。间隔分区是一种特殊类型的范围分区,其中范围在间隔分区总是基于时间的,当新数据添加到应该属于新间隔范围的表时自动创建。(2)ListPartitioning数据库按列表分区,可以通过在表和每个分区的定义中定义partitionkey来显式控制定义:SQL>Createtablemagazines(Pub_Titlevarchar(150),Pub_Date(date))partitionbylist(Pub_Title)(partitionPub_Title1values("SportsIllustrated","MensHealth"),partitionPub_Title2values("Vanity","Flair"),partitionPub_Title3values("YogaMagazine","ZenMagazine"));或者,对于杂志,您可能已经可以从SQL中读取信息:我们将仓库按出版物名称划分为房间,但我们没有足够的空间容纳每个不同的出版物标题,因此我们“列出”每个房间一些。在第一房间,我们有体育画报和心理健康;在第二个房间,我们有虚荣心和天才;在三号房间,我们有瑜伽杂志和“禅宗杂志”。有道理,对吧?(3)哈希分区在哈希分区中,数据行根据分区键的哈希值映射到分区。如果您想对没有显式业务或数据逻辑分区的表使用分区,并且您想要均匀分布的分区,则此功能很有用。例如,您有一个装满杂志的整个仓库,但出版物标题和出版日期是随机的。没有完整的年份,依此类推。但是,你想把它们平均分布在仓库的十个不同的房间里,这样以后需要取一本(或几本)杂志时,可以同时派出十个人去找。十个不同的房间。哈希分区就派上用场了。例如,您选择出版物标题和出版日期的组合作为分区键,然后让数据库散列该键,然后选择合适的分区,同时将所有杂志平均分配到所有房间。(4)子分区子分区(又称复合分区)是在分区内部创建分区。它是对已经分区的表的每个分区的进一步划分。让我们回到杂志仓库。我们从每年将整套杂志放在不同的房间开始。这是第一个基于范围分区的分区。接下来,在这些年级的每个房间里,放上盒子,然后在每个盒子里放上所有刊名相同的杂志。因为在那个房间里我们只有特定年份的出版物,所以在那个盒子里我们只会有特定出版物名称和特定出版年份的杂志。因此,这是一种非常简单快捷的查找“瑜伽杂志”“2017年11月版”的方法。或者,在代码中:SQL>Createtablemagazines(Pub_Title(varchar(150)),Pub_Date(date)Partitionbyrage(Pub_Year(Pub_Date))Subpartitionbylist(Pub_Title)(partitionPub_Title1values("SportsIllustrated","MensHealth"),partitionPub_Title2values("Vanity","Flair"),partitionPub_Title3values("YogaMagazine","ZenMagazine"));如您所见,除了数据库工具箱中的许多其他工具之外,分区对于提高数据库性能、可用??性和可维护性来说是一个非常有用的工具。选择哪种分区策略当然取决于您的数据,但也取决于您将实施的特定数据库系统的技术可能性。
