首页 > 数据库 >SQL Server【提高】分区表

SQL Server【提高】分区表

时间:2023-01-08 22:47:27浏览次数:37  
标签:-- 创建 分区 partition Server ByIdGroup1 分区表 SQL

分区表 分区视图

分区表可以从物理上将一个大表分成几个小表,但是从逻辑上来看,还是一个大表。

什么时候需要分区表

  1. 数据库中某个表中的数据很多。

  2. 数据是分段的

分区的方式

  • 水平分区

    水平表分区就是将一个具有大量数据的表,进行拆分为具有相同表结构的若干个表;

  • 垂直分区

    垂直表分区就是把一个拥有多个字段的表,根据需要进行拆分列,然后根据某一个字段进行关联

如何创建分区表

  1. 创建数据库文件组

可以点击数据库属性在文件组里面添加

alter database <数据库名> add filegroup <文件组名>

---创建数据库文件组
alter database testSplit add filegroup ByIdGroup1
alter database testSplit add filegroup ByIdGroup2
 
  1. 创建数据库文件

可以点击数据库属性在文件里面添加

将不同的文件放在文件组中。当然一个文件组中也可以包含多个不同的文件。

如果可以的话,将不同的文件放在不同的硬盘分区里,最好是放在不同的独立硬盘里。要知道IQ的速度往往是影响SQL Server运行速度的重要条件之一。将不同的文件放在不同的硬盘上,可以加快SQL Server的运行速度。

alter database <数据库名称> add file <数据标识> to filegroup <文件组名称>

--<数据标识> (name:文件名,fliename:物理路径文件名,size:文件初始大小kb/mb/gb/tb,filegrowth:文件自动增量kb/mb/gb/tb/%,maxsize:文件可以增加到的最大大小kb/mb/gb/tb/unlimited)

alter database testSplit add file 
(name=N'ById1',filename=N'J:\Work\数据库\data\ById1.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup1
alter database testSplit add file 
(name=N'ById2',filename=N'J:\Work\数据库\data\ById2.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup2
 
  1. 创建分区表

    1. 创建分区函数

    目的是用来规范不同数据存放到不同目录的标准,简单讲就是如何分区

    分区函数只定义了分区的方法,此方法具体用在哪个表的那一列上,则需要在创建表或索引是指定

     ```sql
     create partition function 分区函数名(<分区列类型>) as range [left/right] 
     for values (每个分区的边界值,....) 
    
     --创建分区函数
     CREATE PARTITION FUNCTION [bgPartitionFun](int) AS RANGE LEFT FOR VALUES (N'1000000', N'2000000', N'3000000', N'4000000', N'5000000', N'6000000', N'7000000', N'8000000', N'9000000', N'10000000')
    
     --删除分区
    
     --删除分区语法
     drop partition function <分区函数名>
     
     --删除分区函数 bgPartitionFun
     drop partition function bgPartitionFun  --只有没有应用到分区方案中的分区函数才能被删除
     ```
    
    1. 创建分区方案

      指定分区对应的文件组

      分区函数必须关联分区方案才能有效,然而分区方案指定的文件组数量必须与分区数量一致,哪怕多个分区存放在一个文件组中。

      --创建分区方案语法
      create partition scheme <分区方案名称> as partition <分区函数名称> [all]to (文件组名称,....) 
      
      --创建分区方案,所有分区在一个组里面
      CREATE PARTITION SCHEME [bgPartitionSchema] AS PARTITION [bgPartitionFun] TO ([ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1])
      
      --删除分区方案
      
      --删除分区方案语法
      drop partition scheme<分区方案名称>
      
      --删除分区方案 bgPartitionSchema
      drop partition scheme bgPartitionSchema1
      
    2. 创建分区表

    如果在表中创建主键或唯一索引,则分区依据列必须为该列

     ```sql
     --创建分区表语法
     create table <表名> (
     <列定义>
     )on<分区方案名>(分区列名)
     
     --创建分区表
     create table BigOrder (
     OrderId              int                  identity,
     orderNum             varchar(30)          not null,
     OrderStatus          int                  not null default 0,
     OrderPayStatus       int                  not null default 0,
     UserId               varchar(40)          not null,
     CreateDate           datetime             null default getdate(),
     Mark                 nvarchar(300)        null
     )on bgPartitionSchema(OrderId)
     ```
    
    1. 创建分区索引

      --创建分区索引语法
      create <索引分类> index <索引名称> 
      on <表名>(列名)
      on <分区方案名>(分区依据列名)
      
      --创建分区索引
      CREATE CLUSTERED INDEX [ClusteredIndex_on_bgPartitionSchema_635342971076448165] ON [dbo].[BigOrder] 
      (
      	[OrderId]
      )WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [bgPartitionSchema]([OrderId])
      
      --使用分区索引查询,可以避免多个cpu操作多个磁盘时产生的冲突。
      
    2. 查看分区表明细信息

      --查看分区依据列的指定值所在的分区 
      --查询分区依据列为10000014的数据在哪个分区上
      select $partition.bgPartitionFun(2000000)  --返回值是2,表示此值存在第2个分区 
      
      
      --查看分区表中,每个非空分区存在的行数
      
      --查看分区表中,每个非空分区存在的行数
      select $partition.bgPartitionFun(orderid) as partitionNum,count(*) as recordCount
      from bigorder
      group by  $partition.bgPartitionFun(orderid)
      
      --查看指定分区中的数据记录 
      ---查看指定分区中的数据记录
      select * from bigorder where $partition.bgPartitionFun(orderid)=2
      

分区拆分合并移动

  1. 拆分分区

    在分区函数中新增一个边界值,即可将一个分区变为2个。

    --分区拆分
    alter partition function bgPartitionFun()
    split range(N'1500000')  --将第二个分区拆为2个分区
    
  2. 合并分区

    与拆分分区相反,去除一个边界值即可。

    --合并分区
    alter partition function bgPartitionFun()
    merge range(N'1500000')  --将第二第三分区合并
    

标签:--,创建,分区,partition,Server,ByIdGroup1,分区表,SQL
From: https://www.cnblogs.com/thomerson/p/17035611.html

相关文章

  • SQL Server【提高】事务
    事务事务是作为单个逻辑单元执行的一系列操作,它是一个不可分割的工作逻辑单元。它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。特性原子性Atomicit......
  • SQL Server【提高】碎片
    碎片当对索引所在的基础数据表进行增删改时,若存储的数据进行了不适当的跨页(SQLServer中存储的最小单位是页,页是不可再分的),就会导致索引碎片的产生。外部碎片插入的数......
  • mysql
    mysqlMySQL上篇:基础篇】【第1子篇:数据库概述与MySQL安装篇】p01-p11学习建议:零基础同学必看,涉及理解和Windows系统下MySQL安装【第2子篇:SQL之SELECT使用篇】p12-p48......
  • 登录他人mysql
    //登录参数:mysql-u用户名-p密码-h要连接的mysql服务器的ip地址(默认127.0.0.1)-P端口号(默认3306)  ......
  • 2.Mysql的角色管理
    1.Mysql角色Mysql从8.0开始就支持roles,这个在Oracle可是一直存在的,然后Mysql终于在8.0上开始支持了。2.什么是Mysql的roles?Mysql的roles说直白就是一堆权限的集......
  • ubuntu20下mysql5.7数据库修改密码
    --找到mysql配置文件修改/etc/mysql/mysql.conf.d/mysqld.cnf#加上下面的可以不要密码登录#skip-grant-tables#skip-networking然后重启mysql服务servicemysqlr......
  • mysql定时事件设置
    //查看事件调度器是否开启SHOWVARIABLESLIKE'event_scheduler';//开启事件调度器SETGLOBALevent_scheduler=ON;//创建定时事件DELIMITER$$CREATEEVENTIFNOTE......
  • MSSQL攻击面探索
    xp_cmdshell开启id=1'EXECsp_configure'showadvancedoptions',1;RECONFIGURE;execSP_CONFIGURE'xp_cmdshell',1;RECONFIGURE;--+命令执行id=1'execm......
  • sql注入学习笔记
    一.基础sql语法知识SELECT查询信息SELECT*FROMTABLES查询表中所有列SELECTCOLUMN1,COLUMN2FROMTABLES查询表中具体的列SELECTDISTINCTCOLUMN1FROMTABLES......
  • MySQL8免安装版下载安装与配置(linux)
    一、前言基于Linux平台的MySQL安装文件有三个版本,分别是RPM软件、GenericBinaries软件包、源码包,具体介绍如下:①RPM软件包是一种Linux平台下的安装文件,通过相关命令可以......