数据库表分区优化

数据库表分区优化,第1张

对SQL Server数据表进行分区的过程分为三个步骤:

1)建立分区函数

2)建立分区方案

3)对表格进行分区

第一个步骤:建立分区函数

分区函数定义[u]how[/u],即你想要SQL Server如何对数据进行分区。这里就不以某一个表格作为例子,而是总体概括分割数据的技术。

分区是通过指定每个分区的分割界线实现的。例如,假定我们有一个Customers表格,里面包含了企业所有的客户的信息,客户信息以唯一的客户号进行辨识,客户号从1到1000000。我们可以运用以下的分区函数(这里称之为customer_Partfunc)把这个表格平均分为四个分区:

CREATE PARTITION FUNCTION customer_partfunc (int)

AS RANGE RIGHT

FOR VALUES (250000, 500000, 750000)

这些分割界线指定了四个分区。第一个分区包含所有值小于250000的记录。第二个分区包含所有值在250000和499999之间的记录。而第三个分区包含所有值在500000和749999之间的记录。其他所有大于或等于750000的记录都包含在第四个分区里。

注意这个例子中使用了“RANGE RIGHT”从句。这说明分界值是在分区的右边。同样,如果使用的是“RANGE LEFT”从句,那么第一个分区就会包含所有值小于或等于250000的记录;第二个分区就会包含所有值在250001和500000之间的记录,如此类推。

第二个步骤:建立分区方案

一旦建立完定义如何对数据进行分区的分区函数之后,下一步就是建立一个分区方案,定义[u]where[/u],即你想在哪里对数据进行分区。这是一个很直接明了的过程,例如,如果我有四个文件组,名称分别从“fg1”到“fg4”,那么就可以使用以下分区方案:

CREATE PARTITION SCHEME customer_partscheme

AS PARTITION customer_partfunc

TO (fg1, fg2, fg3, fg4)

注意我们现在把一个分区函数连接到了分区方案,但是我们还没有把分区方案连接到任何具体的数据库表格。这就是重复使用功能发挥功能的时候。我们可以通过这个功能把分区方案(或者只是分区函数)用于数据库表格的任何数据上。

第三个步骤:对表格进行分区

建立好分区方案之后,就可以开始对表格进行分区了。这是最简单的一个步骤,只需要在表格创建语句中添加“ON”从句,指定表格分区方案和要应用该分区方案的表列。你不需要指定分区函数,因为分区方案已经定义了分区函数。

举个例子,假设你想要用上述的分区方案来创建一个客户表格,你需要使用以下Transact-SQL语句:

CREATE TABLE customers (FirstName nvarchar(40), LastName nvarchar(40), CustomerNumber int)

ON customer_partscheme (CustomerNumber)

前面的两篇文章中,我们分别介绍了扩大与缩小SQL数据库环境之间的区别以及通过水平数据分区或垂直数据分区分解数据表。在本系列的最后一部分,我们将深入了解如何利用分布式分区视图来分解数据表。

分布式分区视图可以将来自一个或多个SQL Server数据库中的数据连接起来。当开发一个水平分区数据库环境时,你可以使用分布式分区视图将来自不同服务器的分区表连接起来,使得这些数据看起来像来自同一个服务器。

你可以设计这些视图,因此,如果你的潜在数据表结构设计合理的话,查询优化器就可以知道从那个数据表得到查询需要的数据,从而加速运行。一个设计合理的分布式分区视图还可以实现更新、插入和删除。我们将在本文的下一部分深入探讨它是如何实现这样 *** 作的。

示例

本例中,我们假设SalesHistory表非常大,如果水平分割表中的各行记录到不同的服务器上,这将对我们很有利。每个服务器上的SalesHistory表的表结构是一样的,不过,一台服务器上存放该国东部地区的销售信息,而另外一台存放该国西部地区的销售信息。

我们根据Region(地区)字段和SaleID 来区分表中的各条记录。其中SaleID字段是整型数据域,我们为该国不同的地区设定了不同的SaleID。

这个字段对于设计概念来说非常重要,因为这是我们用来作为分区键值字段。(注意:要在缩小场景中进行表的设计,这一点极其重要,因为这样表中的各行是唯一的,从而可区别于其它服务器上的表。)这个字段集合是分区键。

设计很多SaleHistory表,根据所在的表SaleID始终是唯一可区别的。我们可以通过CHECK约束来实现这一点。

我们将使用两个独立的SQL Server实例,对于本例,这两个实例在同一台机器上。服务器的名字叫Chapman,实例分别称为实例A和实例B。这两个实例都是SQL Server 2005开发版,允许远程连接以及Windows和SQL Server认证。

使用脚本创建SalesDB数据库,设置每台服务器的lazy schema validation选项,使用该选项在SQL Server中通过确保在确实需要服务器上的数据时才进行服务器链接请求来提高性能。

列表A中的脚本需要在两个数据库实例上运行。列表B用来创建SalesDB数据库中的读者登录及用户,该脚本也需要在两个数据库实例上运行。

数据量很大,而且经常按照某个字段进行条件过滤或者分组时,可以考虑使用分区,例如某种商品的销售情况,经常要查看某个月、某个季度的销售明细或者总计,则可以根据销售日期进行分区,每个月分为一个区,而且最好是能够把不同区的数据分别存放在不同的物理硬盘上,这样在进行查询的时候,如果查询某个月的数据,可以直接在特定硬盘查询,数据量小,速度快,如果查询所有月份的数据,多块硬盘可以并行查询,速度也会明显提高。

我们的业务只存近一段时间的数据,因此有大量表需要清理 历史 数据,目前使用的delete清理数据,存在以下问题。为避免同时支持大量delete,我们的清理任务只在低峰期串行执行,导致任务过多时需要排队,甚至失败的情况;数据清理使用delete语句,表数据量较大时,对数据库造成很大压力;即使我们删除了旧数据,已删除的数据仍占据存储空间,底层数据文件并没有立刻变小,以至于形成数据空洞。

查看MySQL官方文档时,发现了分区表,因此基于官方文档总结一下。

MySQL逻辑上为一个表,物理上存储在多个文件中,这是 MySQL 支持的功能(51 开始), 80 版本只 InnoDB 和 NDB 支持分区表。

优点:

缺点:

根据分区表键值的范围把数据存储到表的不同分区中,适用于以时间或日期作为分区类型,方便数据清理。

小提示:

1当插入数据分区不存在时会报错:Table has no partition for value xxx;

2Range类型分区字段必须是数值,时间类型可用函数转换为数值;

3分区字段列值可以为null,所有为null的数据将存在最小的分区中;

按分区键取值的列表进行分区,每一行数据须找到对应的分区列表,否则数据插入失败

小提示:

根据指定分区表达式的整数值以及分区数进行数据划分(mod函数)

小提示:

按键分区类似于按哈希分区,只是哈希分区使用用户定义的表达式,用于键分区的哈希函数由 MySQL 服务器提供。NDB 集群为此使用 MD5() ; 对于使用其他存储引擎的表,服务器使用自己的内部哈希函数。

小提示:

子分区(subpartitioning)也称为复合分区(composite partitioning) ,是已分区表中每个分区的进一步划分

小提示:

小提示:

以上就是关于数据库表分区优化全部的内容,包括:数据库表分区优化、分区:怎样将数据分布到多个redis实例、请教下数据库分区、分表主要是解决什么问题出现的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9740344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存