sql server 分区(上)

原文:sql server 分区(上)

分区发展历程

     基于表的分区功能为简化分区表的创建和维护过程提供了灵活性和更好的性能。追溯到逻辑分区表和手动分区表的功能.

二.为什么要进行分区

为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性。

大型表除了大小以数百 GB 计算,甚至以 TB 计算的指标外,还可以是无法按照预期方式运行的数据表,运行成本或维护成本超出预定要求。例如发生性能问题、阻塞问题、备份。

三. 分区的概念

分区范围

分区范围是指在要分区的表中,根据业务选择表中的关键字段做为分区边界条件, 
           分区后,数据所在的具体位置至关重要,这样才能在需要时只访问相应的分区。

注意分区是指数据的逻辑分离,不是数据在磁盘上的物理位置, 数据的位置由文件组来决定,所以一般建议一个分区对应一个文件组。

分区键

在我下面的演示中,有一个库存表,我选择了UpByMemberID(会员ID) 作为分区键。 对表和索引进行分区的第一步就是定义分区的关键数据。

索引分区

除了对表的数据集进行分区之外,还可以对索引进行分区, 使用相同的函数对表及其索引进行分区通常可以优化性能
       在下面的第六步中有创建分区索引。

三.创建分区实现

在test库 添加四个文件组,  用于存储每个分区的数据,这里有四个文件组对应四个分区

多个文件组是为了有助于优化性能和维护,应使用文件组分离数据。文件组的数目一定程度上由硬件资源决定:一般情况下,文件组数最好与分区数相同,

并且这些文件组通常位于不同的磁盘上(演示有条有限,只在一个磁盘上做逻辑盘存放)。

1 --第一步:创建四个文件组
2 alter database test add filegroup ByIdGroup1
3 alter database test add filegroup ByIdGroup2
4 alter database test add filegroup ByIdGroup3
5 alter database test add filegroup ByIdGroup4
--第二步: 创建四个ndf文件,对应到各文件组中,FILENAME文件存储路径
ALTER DATABASE test ADD FILE(
NAME=‘File1‘,
FILENAME=‘C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\testFile1.ndf‘,
SIZE=5MB,
FILEGROWTH=5MB)
TO FILEGROUP ByIdGroup1

ALTER DATABASE test ADD FILE(
NAME=‘File2‘,
FILENAME=‘E:\testFile2.ndf‘,
SIZE=5MB,
FILEGROWTH=5MB)
TO FILEGROUP ByIdGroup2

ALTER DATABASE test ADD FILE(
NAME=‘File3‘,
FILENAME=‘E:\testFile3.ndf‘,
SIZE=5MB,
FILEGROWTH=5MB)
TO FILEGROUP ByIdGroup3

ALTER DATABASE test ADD FILE(
NAME=‘File4‘,
FILENAME=‘E:\testFile4.ndf‘,
SIZE=5MB,
FILEGROWTH=5MB)
TO FILEGROUP ByIdGroup4

执行完成后,查看如下图所示:

--第三步:创建分区函数(每个分区的边界值)

每个会员统计的产品数

--record: 126797 Partition1 --PRIMARY
SELECT COUNT(1) FROM dbo.Product WHERE UpByMemberID<=1740
--record: 90882 Partition2
SELECT COUNT(1) FROM dbo.Product WHERE UpByMemberID>1740 AND UpByMemberID<=3000
--record: 4999999 Partition3
SELECT COUNT(1) FROM dbo.Product WHERE UpByMemberID>3000 AND UpByMemberID<=9708
--record: 4999999 Partition4
SELECT COUNT(1) FROM dbo.Product WHERE UpByMemberID>9708 AND UpByMemberID<=9709
--record: 2018464 Partition5 ---ByIdGroup4
SELECT COUNT(1) FROM dbo.Product WHERE UpByMemberID>9709

CREATE PARTITION FUNCTION pf_UpByMemberID(int)
AS RANGE LEFT FOR VALUES (1740,3000,9708,9709)

执行完后如下图所示:

--第四步:创建分区方案

CREATE PARTITION SCHEME ps_UpByMemberID
AS PARTITION pf_UpByMemberID TO ([PRIMARY], [ByIdGroup1],[ByIdGroup2],[ByIdGroup3],[ByIdGroup4])

  执行完后如下图所示:

--第五步:创建分区表

右击要分区的表-->存储-->创建分区-->选择分区列(这里UpByMemberID)-->选择分区函数

--第六步创建分区索引

CREATE NONCLUSTERED INDEX [ixUpByMemberID] ON [dbo].[Product]
(
    [UpByMemberID] ASC
)
INCLUDE ( [Model]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
GO



-- 最后  查看各分区有多少行数据
select $PARTITION.pf_UpByMemberID([UpByMemberID]) as Patition,COUNT(*) countRow from dbo.product
group by $partition.pf_UpByMemberID([UpByMemberID])

查出有五个分区(带主分区),以及各分区的数量

最后看下是否用了分区索引

sql server 分区的优势:

  1. 当表和索引变得非常大时,分区可以将数据分为更小、更容易管理的部分。
  2. 减少索引维护时间。
  3. 常用的where条件字段做分区依据是较佳的。
  4. 并行操作获得更好的性能, 可以改善在极大型数据集(例如数百万行)中执行大规模操作的性能。
  5. 一般情况下,文件组数最好与分区数相同。文件组允许您将各个表放置到不同的物理磁盘上

原文地址:https://www.cnblogs.com/lonelyxmas/p/9059198.html

时间: 2024-08-25 22:18:02

sql server 分区(上)的相关文章

SQL Server分区详解

一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区.SQL Server中数据是按水平方式分区,是多行数据映射到单个分区.已经分区的表或者索引,在执行查询或者更新时,将被看作为单个逻辑实体,简单说来利用分区将一个表数据分多个表来存储,对于大数据量的表,将表分成多块查询,若只查询某个分区数据将降低消耗提高效率.需要注意的是单个索引或者表的分区必须位于一个数据库中. 在使用大量数据管理

SQL Server分区详解Partition

一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区. SQL Server中数据是按水平方式分区,是多行数据映射到单个分区.已经分区的表或者索引,在执行查询或者更新时,将被看作为单个逻辑实体: 简单说来利用分区将一个表数据分多个表来存储,对于大数据量的表,将表分成多块查询,若只查询某个分区数据将降低消耗提高效率.需要注意的是单个索引或者表的分区必须位于一个数据库中. 在使用大量数据

SQL SERVER分区具体例子详解

在日常工作中,我们会遇到以下的情况,一个表每日数万级的增长,而查询的数据通常是在本月或今年,以前的数据偶尔会用到,但查询和插入的效率越来越慢,用数据库分区会有助于解决这个问题.关于分区的理论知识网上很多我这里就不在累赘,我从一个实际例子出发,看如何将一个已经运行了很长时间的普通表进行分区. 回到目录 提出问题 需解决问题:有一个数据表数据很大,我们通常的查询是在一个季度中.我们需要将以往年份的数据按不同年份存在文件组里,当年的数据分为4个季度存,如果到了新的一年,将之前4个季度的合并到一年中,新

(二)SQL Server分区创建过程

虽然分区有很多好处(一)SQL Server分区详解Partition,却不能随意使用:且不说分区管理的繁琐,只是跨分区带来的负面影响就需要我们好好分析是否有必要使用分区.一般分区创建的业务特点:用于统计.历史数据少使用.数据自增长.可能数据冗余大.数据量庞大插入量大.在确定是否合适使用分区前,需了解分区是如何创建的,分区的创建包括: 1.新建分区函数 2.新建文件和文件组 3.新建分区架构 4.新建分区表或者分区索引 如下图所示:分区函数定义了分区的具体方式,分区架构使用分区函数和文件组,确定

Sql Server 分区演练 【转】

Sql Server 分区演练 [转] 代码加注释,希望对初学者有用. USE [master]GOif exists (select * from sys.databases where name = 'Test_1')drop database Test_1GO--创建新库,要演练分区所以我们会多创建两个文件组Test_A,Test_B,以便在后面的分区方案中使用.CREATE DATABASE [Test_1] ON  PRIMARY ( NAME = N'test_1', FILENAM

sql server 分区

 一.分区发展历程      基于表的分区功能为简化分区表的创建和维护过程提供了灵活性和更好的性能.追溯到逻辑分区表和手动分区表的功能. 二.为什么要进行分区 为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性. 大型表除了大小以数百 GB 计算,甚至以 TB 计算的指标外,还可以是无法按照预期方式运行的数据表,运行成本或维护成本超出预定要求.例如发生性能问题.阻塞问题.备份. 三.创建分区实现 在test库 添加四个文件组 1 --第一步:创建四个文件组 2 alter databas

SQL Server服务器上需要导入Excel数据的必要条件

SQL Server服务器上需要导入Excel数据,必须安装2007 Office system 驱动程序:数据连接组件,或者Access2010的数据库引擎可再发行程序包,这样就不必在服务器上装Excel了.

009.Working with SQL Server LocalDB --【在sql server localdb 上操作数据】

Working with SQL Server LocalDB 在sql server localdb 上操作数据 2017-3-7 2 分钟阅读时长 本文内容 1.SQL Server Express LocalDB SQL Server Express LocalDB  sql server 的一个简化免费版本 2.Seed the database 初始化数据库的初始表数据 By Rick Anderson The MvcMovieContext object handles the ta

SQL Server分区键列必须是主键一部分

SQL Server分区键列必须是主键一部分. 必须把分区列包含在主键/唯一约束/唯一索引的键列中. USE tempdb GO -- 测试表 CREATE TABLE dbo.tb( id int, CONSTRAINT PK_id PRIMARY KEY CLUSTERED( id) ) INSERT dbo.tb SELECT 1 UNION ALL SELECT 10 GO -- 切换为分区表 -- 分区函数 CREATE PARTITION FUNCTION PF_test(int)