当前位置:首页 » 编程语言 » sql分区规则
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql分区规则

发布时间: 2023-03-23 14:06:13

‘壹’ sql server 怎样可以让一个数据库用几个磁盘分区

向数据库添加数据文件就行了, 可以添加多个

ALTER DATABASE 你的库名
ADD FILE
(
NAME = Test1dat2,
FILENAME = 'x:\t1dat2.ndf', -- 设定文件在不同的磁盘分区
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
一个数据库可以由以下三种数据库文件组成:
1.主数据文件(*.mdf)
2.次数据文件(*.ndf)
3.事务日志文件(*.ldf)

其中主数据文件是所有数据库文件的起点,每个数据库有且只有一个主数据文件。
次数据文件用来保存主数据文件中容纳不下的数据,可以有0个或者多个。
事务日志文件就不说了,看名字就知道是做什么用的。

使用create database 语句建库的时候可以设定数据库文件的属性(包括文件名称和保存位置)。
使用alter database 语句可以添加,删除和修改数据库文件的属性。

‘贰’ 什么是SQL Server自动化管理分区设计方案

(图1:整体概念图) 数据流经过分区方案,被分配到不同的分区中,从图中可以看出,分区是可以重复利用的,后台有一个所谓的自动化切换分区的作业在跑,目的就是如果重复 利用这些分区。这里的PRIMARY目的就是说明它与其它文件组的一个平级关系,而且我们在做交换分区时候也会用到PRIMARY,需要事先分配足够的空间; (图2:自动化设计图) 自动化切换分区作业的逻辑处理,其中分区管理表的设计是比较重要的,它的灵活度关系到整个自动化的效果; 这个逻辑有以下几个特点: 1、 分区的索引进行存储位置对齐;其它索引在创建时就使用了分区方案,索引数据跟随分区数据一起存储在分区中; 2、分区管理表,包含了分区记录数预警设计,在Id达到这个值后就会进行交换分区; 3、分区管理表,FileGroup_String字段的数据可以通过SQL脚本自动化生成,条件就是分区文件组名称需要有规律; 4、 临时表是创建在PRIMARY主分区上,跟原表使用相同的分区方案;需要事先给PRIMARY分配大于或者等于一个分区文件大小的空间,这样在交换分区的时候就不用增量为主分区分配数据空间; 5、 交换旧数据到临时表,使用下面的语句可以把数据交换到相同的分区中编号,这样可以应对临时表就是一个历史表,而好处就是历史表也同样使用了分区; ALTER TABLE [tb] SWITCH PARTITION @PARTITION_num TO [Temp_tb] 6、这里需要先修改分区方案,才能修改分区函数,这个跟创建分区函数与分区方案的顺序是刚好相反的; 分区管理表(PartitionManage)是能应对比较多的情况: 1、 比如我们可以修改预警值(Change_Value),让数据提早进入交换分区; 2、比如我们可以修改分区值(Part_Value),达到调整分区间隔的目的; 3、比如我们可以修改分区文件组名称(FileGroup_String),达到跳级文件组的目的;通过修改分区管理表来设置分区值与分区文件组的对应关系; 4、再比如,我们一次性修改了分区方案和分区函数,已经去到很后面的分区值了,那么我们只要设置这些分区值的状态(IsDone)为1(True)就可以解决; 5、记录了进行交换分区的时间(UpdateTime),方便查询; 不知道朋友们看到这个标题是会陌生还是熟悉呢?今天带大家一起看看一起介绍下SQL Server自动化管理分区设计方案; 一、设计说明 设计这个自动化的目的是想要交替、重复地使用固定的几个分区(分区编号01~05)来保存数据,当最后一个分区就是快满的时候,我们会把最旧数据的分区的数据清空出分区,新数据就可以使用老分区空间了; 应用这个自动化管理分区的环境是有些限制的; 其一:分区的数据是呈现递增的,比如分区字段是自增Id值,或者是以日期作为分区; 其二:可以接受历史 数据被移除分区表带来的问题; 其三:一天进库的数量不应大于分区管理表PartitionManage中Part_Value与Change_Value 的差,因为我们作业执行的频率是1天,不过你可以调整Change_Value或者作业的执行频率;二、看图说话

‘叁’ SQL Server 自动化管理分区设计方案

一 设计说明

设计这个自动化的目的是想要交替 重复地使用固定的几个分区(分区编号 ~ )来保存数据 当最后一个分区就是快满的时候 我们会把最旧数据的分区的数据清空出分区 新数据就可以使用老分区空间了

应用这个自动化管理分区的环境是有些限制的 其一 分区的数据是呈现递增的 比如分区字段是自增Id值 或者是以日期作为分区;其二 可以接受 历史数据被移除分区表带来的问题 其三 一天进库的数量不应大于分区管理表PartitionManage中Part_Value与 Change_Value的差 因为我们作业执行的频率是 天 不过你可以调整Change_Value或者作业的执行频率;

具体脚本可以参考 SQL Server 自动化删除表分区设计方案

二 看图说话

(图 整体概念图)

数据流经过分区方案 被分配到不同的分区中 从图中可以看出 分区是可以重复利用的 后台有一个所谓的自动化切换分区的作业在跑 目的就是如果 重复利用这些分区 这里的PRIMARY目的就是说明它与其它文件组的一个平级关系 而且我们在做交换分区时候也会用到PRIMARY 需要事先分配足够 的空间

(图 自动化设计图)

这是自动化切换分区作业的逻辑处理 其中分区管理表的设计是比较重要的 它的灵活度关系到整个自动化的效果; 这个逻辑有以下几个特点

分区的索引进行存储位置对齐;其它索引在创建时就陵孙咐使用了分区方案 索引数据跟随分区数据一起存储在分区中;

分区管理表 包含了分区记录数预警设计 在Id达到这个值后凯樱就会进行交换分区;

分区管理表 FileGroup_String字段的数据可以通过SQL脚本自动化生成 条件就是分区文件组名称需要有规律;

临时表是创建在PRIMARY主分区上 跟原表使用相同的分区方案;需要事先给PRIMARY分配大于或者等于一个分区文件大小的空间 这样在交换分区的时候就不用增量为主分区分配数据空间;

交换旧数据到临时表 使用下面的语句可以把数据交换到相同的分区中编号 这样可以应对临时表就是一个历史表 而好处就是历史表也同样使用了分区

ALTER TABLE [tb] SWITCH PARTITION @PARTITION_num TO [Temp_tb] PARTITION@PARTITION_num

这里需要先修改分区方案 才能修改分区函数 这个跟创建分区函数与分区方案的顺序是刚好相反的

(图 分区管理表PartitionManage)

字段说明 Change_Value(预警Id值)Part_Value(分区函数值)FileGroup_String(分区文件组名称)IsDone(状态)UpdateTime(更新时间);

这就是那个分区管理表(PartitionManage) 它是经过了几个版本后才把字段确定下来的 现在它已经比较完善了 能应对比较多的情况

比如我们可以修改预警值(Change_Value) 让数据提早进入交换分区;

比如我们可以修改分区值(Part_Value) 达到调整分区间隔的目的;

比如我们可以修改分区文件组名称(FileGroup_String) 达到跳级文件组的目的;通过修改分区管理表来设置分区值与分区文件组的对应关系;

再比如 我们一次性修改了分区方案和分区函数 已经去到很后面的分区值了 那么我们只要设置这些分区值的状态(IsDone)为 (True)就可以解决了

记录了进行交换分区的时间(UpdateTime) 方便查询;

(图 分区为Id字段的记录分布图)

这是一个实战中的分区情况 这样的分区特点就是分区里面的记录数基本上是持平的 在Partition_num= 的记录中明显多了很多记录 这就是因为我们没有及时进行交换分区造成的

(图 分尺纯区为ClassId(分类)字段的记录分布图)

lishixin/Article/program/SQLServer/201311/22352

‘肆’ Oracle SQL调优之分区表

@[toc]

其它类型的表设计可以看博客: https://smilenicky.blog.csdn.net/article/details/90315980
普通表和分区表区别,分区表分成几部分就有几个segment,RANGE_PART_TAB是一个分区表

引用Oracle官方文档的说法, https://docs.oracle.com/cd/B19306_01/server.102/b14220/partconc.htm#sthref2604 :

分区类型:分区分为范围分区、列表分区、HASH分区、组合分区四种,图来自Oracle官方网站

关键字partition by range

散列分区也叫hash分区,partitions后接分区数,尽量设置为物铅偶数,

组合分区又称复合分区,主要有两种:oracle11之前只支持范围列表分区(RANGE-LIST)和范围散列分区(RANGE-HASH),oracle11之后支持(范围范围分区)RANGE-RANGE、 (列表范围分区)LIST-RANGE、(列表散列分区)LIST-HASH、(列表列表分区)LIST-LIST这几种组合,为了避免每个主分区中都写相同的从分区,可以旦蚂慎用模板方式(subpartition template)

图来模敬自Oracle官方网站:

新增子分区,子分区名称是P13SUB1

删除子分区,子分区名称P13SUB1

TRUNCATE子分区

分区相关查询

ps:表格来自《收获,不止SQL调优》一书作者的整理

‘伍’ SQL 2005 如何按月把表分区

创建分碧缺区迟慧悔函数
按月区分的例子 (目前只有前3季度)

CREATE PARTITION FUNCTION sale_date_part_func(DATETIME)
AS RANGE RIGHT FOR VALUES(
CONVERT(DATETIME, '2010-01-01 00:00:00', 120),
CONVERT(DATETIME, '2010-02-01 00:00:00', 120),
CONVERT(DATETIME, '2010-03-01 00:00:00'码正, 120),
CONVERT(DATETIME, '2010-04-01 00:00:00', 120),
CONVERT(DATETIME, '2010-05-01 00:00:00', 120),
CONVERT(DATETIME, '2010-06-01 00:00:00', 120),
CONVERT(DATETIME, '2010-07-01 00:00:00', 120),
CONVERT(DATETIME, '2010-08-01 00:00:00', 120),
CONVERT(DATETIME, '2010-09-01 00:00:00', 120)
);
go

创建分区架构(Schema)
CREATE PARTITION SCHEME sale_date_part_sche
AS PARTITION sale_date_part_func
TO (
[PRIMARY], [PRIMARY], [PRIMARY],
[PRIMARY], [PRIMARY], [PRIMARY],
[PRIMARY], [PRIMARY], [PRIMARY],
[PRIMARY]
);
go

创建分区表
CREATE TABLE sale_data (
sale_date DATETIME NOT NULL ,
sale_item VARCHAR(2) NOT NULL ,
sale_money DECIMAL(10,2) NOT NULL
) ON sale_date_part_sche(sale_date);
go

‘陆’ Spark-sql读取hive分区表限制分区过滤条件及限制分区数量

在开发过程中使用spark去读取hive分区表的过程中(或者使用hive on spark、nodepad开发工具),部分开发人员未注意添加分区属性过滤导致在执行过程中加载了全量数据,引起任务执行效率低、磁盘IO大量损耗等问题

1、自定义规则CheckPartitionTable类,实现Rule

然后通过此种方法创建SparkSession
2、自定义规则CheckPartitionTable类,实现Rule,将规则类追加致Optimizer.batches: Seq[Batch]中

1、CheckPartitionTable规则执行类,需要通过引入sparkSession从而获取到引入conf;需要继承Rule[LogicalPlan];

2、通过splitPredicates方法,分离分区谓词,得到分区谓词表达式
在sql解析过程中将谓词解析为TreeNode,此处采用递归的方式获取分区谓词

3、判断是否是分区表,且是否添加分区字段

4、实现Rule的apply方法

关于spark-sql的主要执行流程及预备知识,可参照我同学的这篇博文 https://www.jianshu.com/p/4cc6797fb9ce

‘柒’ SQL 分区限制

select*fromtableAllwhere(class='01'andsex='男')orclass<>'01';
有问题再追问,望采纳。

‘捌’ SQLserver中分区与表的关系式什么样(我只知道表和构架之间的关系)

分区是表的物理特性,分区主要用来改善大型表以及具有各种访问模式的表的可伸缩巧罩性高顷和可管理性,譬如每个每个分区可在不同硬盘上,孝念闹可以并行访问,对上层使用是透明的,不能手动指定把数据放在哪个分区,它得先定义规则(类似于case when),这个每种数据库的语法不一样。

‘玖’ 最近在研究SQL分区,想问问是不是只能针对表里某个字段分区,不能根据表名分区吗,我的表名已经有日期

表名分区属于弯轿 表空间,这个属于数埋培肆据库管理员的工作,我没接触过,所以也不知道怎么搞。。
表内分区中散 应该是用一般的语句用partition by

‘拾’ 如何对一个已经存在的SQL Server表分区

有两轿滚盯种方法可以实现对一个表分区.一是创建一个新闭和的标识为分区表的表(你可参照此步骤),然后把数据复制到这张新表,再对这两张表分别改名.或者,像我写在下面的,通过重建或创建一个聚集索引来达到分区一个表.
一个SQL Server表和数据进行分区示例
--Table/备缓Index creation
CREATE TABLE [dbo].[TABLE1]
([pkcol] [int] NOT NULL,
[datacol1] [int] NULL,
[datacol2] [int] NULL,
[datacol3] [varchar](50) NULL,
[partitioncol] datetime)
GO
ALTER TABLE dbo.TABLE1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY CLUSTERED (pkcol)
GO
CREATE NONCLUSTERED INDEX IX_TABLE1_col2col3 ON dbo.TABLE1 (datacol1,datacol2)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]