优化SQLServer–表和索引的分区(二)

优化SQLServer–表和索引的分区(二)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

简介

    之前一篇简单的介绍了语法和一些基本的概念,隔了一段时间,觉得有必要细致的通过实例来总结一下这部分内容。如之前所说,分区就是讲大型的对象(表)分成更小的块来管理,基本单位是行。这也就产生了很大优势, 比如在数据库维护备份还原操作的时候,比如在大量用户访问能导致死锁的时候等等。

接下来我们通过大量实例从分区到展示分区的效果以及一些实际案例来提高对这部分知识的理解。

–****************** –1.创建分区函数             –******************

–Create the partition function: dailyPF            DECLARE @StartDay DATE=DATEADD(dd,-3,CAST(SYSDATETIME() AS DATE));             CREATE PARTITION FUNCTION DailyPF (DATETIME2(0))                 AS RANGE RIGHT FOR VALUES                 (@StartDay, DATEADD(dd,1,@StartDay), DATEADD(dd,2,@StartDay),          DATEADD(dd,3,@StartDay), DATEADD(dd,4,@StartDay) );             GO

范围分区函数指定范围的边界,left和right关键字指定当数据库引擎按照剩余从左到右对区间值进行排序是,边界值属于那一边,默认为left。分区范围不能有间隔。

–******************            –2. 创建文件组

–******************

ALTER DATABASE PartitionThis ADD FILEGROUP DailyFG1            GO             ALTER DATABASE PartitionThis ADD FILEGROUP DailyFG2             GO             ALTER DATABASE PartitionThis ADD FILEGROUP DailyFG3             GO             ALTER DATABASE PartitionThis ADD FILEGROUP DailyFG4             GO             ALTER DATABASE PartitionThis ADD FILEGROUP DailyFG5             GO             ALTER DATABASE PartitionThis ADD FILEGROUP DailyFG6             GO

这里我们建立6个文件组,同时也可以为文件组创建文件,

创建好的文件和文件组文件

接下来我为文件组创建分区方案:

 

–******************           –3. 创建分区架构            –******************

—           CREATE PARTITION SCHEME DailyPS                 AS PARTITION DailyPF                TO (DailyFG1, DailyFG2, DailyFG3, DailyFG4, DailyFG5, DailyFG6);

 

–******************            –4. 在分区架构上建表            –******************

if OBJECT_ID(‘OrdersDaily’,’U’) is null            CREATE TABLE OrdersDaily (                OrderDate DATETIME2(0) NOT NULL,                OrderId int IDENTITY NOT NULL,                OrderName nvarchar(256) NOT NULL            ) on DailyPS(OrderDate)            GO

这里我们将分区函数映射到单个文件组里面,调用我们之前建立的分区函数即可。然后接着创建表在分区文件上,同时应用分区函数在

OrderDate时间上。这里我们还需要插入一部分测试数据便于观察,同时创建一个架构便于查询分区

–*******************************           –创建架构            –*******************************

–Create a schema for “partition helper” objects           CREATE SCHEMA [ph] AUTHORIZATION dbo;            GO

–插入测试数据           INSERT OrdersDaily(OrderDate, OrderName)             SELECT DATEADD(ss, t.N, DATEADD(dd,-3,CAST(CAST(SYSDATETIME() AS DATE) AS DATETIME2(0)))) AS OrderDate,                CASE WHEN t.N % 3 = 0 THEN ‘Robot’ WHEN t.N % 4 = 0 THEN ‘Badger’  ELSE ‘Pen’ END AS OrderName            FROM ph.tally AS t–tally是一个1到10万自增长的表,只有一个字段 N

WHERE N < = 1000;               

INSERT OrdersDaily(OrderDate, OrderName)            SELECT DATEADD(ss, t.N, DATEADD(dd,-2,CAST(CAST(SYSDATETIME() AS DATE) AS DATETIME2(0)))) AS OrderDate,                CASE WHEN t.N % 3 = 0 THEN ‘Flying Monkey’ WHEN t.N % 4 = 0 THEN ‘Junebug’  ELSE ‘Pen’ END AS OrderName            FROM ph.tally AS t            WHERE N < = 2000;

INSERT OrdersDaily(OrderDate, OrderName)             SELECT DATEADD(ss, t.N, DATEADD(dd,-1,CAST(CAST(SYSDATETIME() AS DATE) AS DATETIME2(0)))) AS OrderDate,                CASE WHEN t.N % 2 = 0 THEN ‘Turtle’ WHEN t.N % 5 = 0 THEN ‘Eraser’  ELSE ‘Pen’ END AS OrderName            FROM ph.tally AS t            WHERE N < = 3000;

INSERT OrdersDaily(OrderDate, OrderName)             SELECT DATEADD(ss, t.N, CAST(CAST(SYSDATETIME() AS DATE) AS DATETIME2(0))) AS OrderDate,                CASE WHEN t.N % 3 = 0 THEN ‘Lasso’ WHEN t.N % 2 = 0 THEN ‘Cattle Prod’  ELSE ‘Pen’ END AS OrderName            FROM ph.tally AS t            WHERE N < = 4000;            GO

随即在创建相关的索引

–******************           –7. 创建索引            –******************            –添加聚集索引            ALTER TABLE OrdersDaily            ADD CONSTRAINT PKOrdersDaily                PRIMARY KEY CLUSTERED(OrderDate,OrderId)            GO

–对齐索引            —            CREATE NONCLUSTERED INDEX NCOrderIdOrdersDaily                 ON OrdersDaily(OrderId)            GO

–非对齐索引            CREATE NONCLUSTERED INDEX NCOrderNameOrdersDailyNonAligned                 ON OrdersDaily(OrderName) ON [PRIMARY]            GO

此时建立分区文件数据等条件后,我们可以看一下相应的文件及数据的情况,可以同过如下DMV来查看

SELECT  SCHEMA_NAME(so.schema_id) AS schema_name ,                   OBJECT_NAME(p.object_id) AS object_name ,                    p.partition_number ,                    p.data_compression_desc ,                    dbps.row_count ,                    dbps.reserved_page_count * 8 / 1024. AS reserved_mb ,                    si.index_id ,                    CASE WHEN si.index_id = 0 THEN ‘(heap!)’                            ELSE si.name                    END AS index_name ,                    si.is_unique ,                    si.data_space_id ,                    mappedto.name AS mapped_to_name ,                    mappedto.type_desc AS mapped_to_type_desc ,                    partitionds.name AS partition_filegroup ,                    pf.name AS pf_name ,                    pf.type_desc AS pf_type_desc ,                    pf.fanout AS pf_fanout ,                    pf.boundary_value_on_right ,                    ps.name AS partition_scheme_name ,                    rv.value AS range_value            FROM    sys.partitions p            JOIN    sys.objects so                    ON p.object_id = so.object_id                        AND so.is_ms_shipped = 0            LEFT JOIN sys.dm_db_partition_stats AS dbps                    ON p.object_id = dbps.object_id                        AND p.partition_id = dbps.partition_id            JOIN    sys.indexes si                    ON p.object_id = si.object_id                        AND p.index_id = si.index_id            LEFT JOIN sys.data_spaces mappedto                    ON si.data_space_id = mappedto.data_space_id            LEFT JOIN sys.destination_data_spaces dds                    ON si.data_space_id = dds.partition_scheme_id                        AND p.partition_number = dds.destination_id            LEFT JOIN sys.data_spaces partitionds                    ON dds.data_space_id = partitionds.data_space_id            LEFT JOIN sys.partition_schemes AS ps                    ON dds.partition_scheme_id = ps.data_space_id            LEFT JOIN sys.partition_functions AS pf                    ON ps.function_id = pf.function_id            LEFT JOIN sys.partition_range_values AS rv                    ON pf.function_id = rv.function_id                        AND dds.destination_id = CASE pf.boundary_value_on_right                                                    WHEN 0 THEN rv.boundary_id                                                    ELSE rv.boundary_id + 1                                                END

查询结果如图:

分区表

可以发现按照日期的分布产生了不同文件组的数据插入到了不同的文件里面和索引里面了。

接下来我们通过分区切换来更好的理解分区的意义,首先要建立新的文件组(DailyF7)来切换分区,同时创建一个分区表OrdersDailyLoad,并向这个表里面插入5000条数据创建索引等以上的操作单独对此表进行一遍重复操作,来实现对新分区的新标的对齐。注意5000条数据一定要在指定范围内,比如使用check约束使数据在11.30-12.1日内的数据。

 

代码:

在切换之前我们一定要禁用或者删除掉这个分区的对其的索引   ALTER INDEX NCOrderNameOrdersDailyNonAligned ON OrdersDaily DISABLE;    GO    ALTER TABLE OrdersDailyLoad    SWITCH TO OrdersDaily PARTITION 6;    GO

如图,分区切换后文件组6中变为了5000条数据,而7中变为了空。

image

如果需要切换回来执行

ALTER TABLE PARTITION 6  SWITCH TO OrdersDaily OrdersDailyLoad ;  GO

如果需要合并分区

ALTER PARTITION FUNCTION DailyPF ()           MERGE RANGE (‘2015-11-27 00:00:00.000’)

结果:此界点两个分区将合并为一个

 

 

 

总结:

           通过以上代码和实例的展示,我们能了解如何使用分区。同时我们要知道分区的意义。但是要知道分区也是一把双刃剑,它可以看做是一个性能选项、管理选项、可扩展工具,在提高数据查询、维护性能的同时也对数据库的备份还原策略、索引的维护、并发性以及变分区锁等有副作用,所以具体是否选用表分区要根据实际情况来判断,然后推荐一个工具(DataBase Tuning Adcisor)运行工作负载来提供是否分区的建议。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119625.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月28日 上午9:00
下一篇 2021年11月28日 上午10:00


相关推荐

  • ERNIE-4.5-VL-28B推理延迟过高如何优化?

    ERNIE-4.5-VL-28B推理延迟过高如何优化?

    2026年3月12日
    1
  • 神经网络的反向传播算法推导

    神经网络的反向传播算法推导有了上一篇神经网络的反向传播算法推导—前期知识准备做铺垫,下一步来看看反向传播算法具体的推导过程。一、定义机器学习中常说的两个函数:损失函数(lossfunction):是定义在单个样本上的,算的是一个样本的值和预测值的误差,记为C(Θ);代价函数(costfunction):是定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均,记为J(Θ);假设函数:二、神经网络结构图以三层神经网络为例:…

    2022年5月27日
    30
  • 亿级大表分库分表实战总结(万字干货,实战复盘)

    亿级大表分库分表实战总结(万字干货,实战复盘)

    2020年11月19日
    223
  • Winscp连接Amazon Ec2实例传送文件

    Winscp连接Amazon Ec2实例传送文件使用WinSCP将文件传输到您的Linux实例WinSCP是适用于Windows的基于GUI的文件管理器,您可以通过它来使用SFTP、SCP、FTP和FTPS协议将文件上传并传输到远程计算机。通过WinSCP,您可以将Windows计算机中的文件拖放到Linux实例或同步这两个系统之间的所有目录结构。要使用WinSCP,您将需要在 使用P

    2022年7月20日
    22
  • 性能和稳定性测试报告模板下载_产品稳定性报告怎样写

    性能和稳定性测试报告模板下载_产品稳定性报告怎样写目的:描述此次测试的目的:(以下目的请做参考)验证改进的性能效果,需要和以前的测试结果进行比对。新的业务上线,验证新系统能够满足系统的上线指标。验证系统稳定性验证系统的架构是否存在瓶颈测试环境:提供网络拓扑图可以使用visio来花图,描述清楚几个要点:几台测试服务器,每台都有什么服务,前台web服务、memcache、数据库?几台服务器的连接关系服务器软件信息说明: 服务器IP地址 服务器角色 数据库说明

    2025年10月11日
    7
  • Heartbleed心脏出血漏洞原理分析

    Heartbleed心脏出血漏洞原理分析Heartbleed心脏出血漏洞原理分析Heartbleed心脏出血漏洞原理分析2017年01月14日18:14:25阅读数:27182017年01月14日18:14:25阅读数:271

    2022年7月1日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号