原文:SQL Server表分区的NULL值问题

SQL Server表分区的NULL值问题

SQL Server表分区只支持range分区这一种类型,往往会被大家吐槽

人家MySQL支持四种类型:RANGE分区、LIST分区、HASH分区、KEY分区

共同点是MySQL跟SQL Server也有分区对齐的问题,都是水平切分,大家都允许分区列存在NULL值

这次我们测试SQL Server表分区的分区列的NULL值,究竟NULL值是被存放在哪个区间,以前一直没有注意

测试脚本

--1.创建文件组
ALTER DATABASE [sss]
ADD FILEGROUP [FG_TinyBlog_Id_01]ALTER DATABASE [sss]
ADD FILEGROUP [FG_TinyBlog_Id_02]ALTER DATABASE [sss]
ADD FILEGROUP [FG_TinyBlog_Id_03]ALTER DATABASE [sss]
ADD FILEGROUP [FG_TinyBlog_Id_04]ALTER DATABASE [sss]
ADD FILEGROUP [FG_TinyBlog_Id_05]--2.创建文件
ALTER DATABASE [sss]
ADD FILE
(NAME = N'FG_TinyBlog_Id_01_data',FILENAME = N'E:\DataBase\sss\FG_TinyBlog_Id_01_data.ndf',SIZE = 96MB, FILEGROWTH = 24MB )
TO FILEGROUP [FG_TinyBlog_Id_01];ALTER DATABASE [sss]
ADD FILE
(NAME = N'FG_TinyBlog_Id_02_data',FILENAME = N'E:\DataBase\sss\FG_TinyBlog_Id_02_data.ndf',SIZE = 96MB, FILEGROWTH = 24MB )
TO FILEGROUP [FG_TinyBlog_Id_02];ALTER DATABASE [sss]
ADD FILE
(NAME = N'FG_TinyBlog_Id_03_data',FILENAME = N'E:\DataBase\sss\FG_TinyBlog_Id_03_data.ndf',SIZE = 96MB, FILEGROWTH = 24MB )
TO FILEGROUP [FG_TinyBlog_Id_03];ALTER DATABASE [sss]
ADD FILE
(NAME = N'FG_TinyBlog_Id_04_data',FILENAME = N'E:\DataBase\sss\FG_TinyBlog_Id_04_data.ndf',SIZE = 96MB, FILEGROWTH = 24MB )
TO FILEGROUP [FG_TinyBlog_Id_04];ALTER DATABASE [sss]
ADD FILE
(NAME = N'FG_TinyBlog_Id_05_data',FILENAME = N'E:\DataBase\sss\FG_TinyBlog_Id_05_data.ndf',SIZE = 96MB, FILEGROWTH = 24MB )
TO FILEGROUP [FG_TinyBlog_Id_05];--3.创建分区函数
CREATE PARTITION FUNCTION
Fun_TinyBlog_Id(INT) AS
RANGE LEFT
FOR VALUES(-10,0,1,6)--4.创建分区方案
CREATE PARTITION SCHEME
[Sch_TinyBlog_Id] AS
PARTITION [Fun_TinyBlog_Id]
TO([FG_TinyBlog_Id_01],[FG_TinyBlog_Id_02],[FG_TinyBlog_Id_03],[FG_TinyBlog_Id_04],[FG_TinyBlog_Id_05])

View Code

插入测试数据

USE [sss]CREATE TABLE TinyBlog(id INT  NULL,NAME VARCHAR(100)) ON [Sch_TinyBlog_Id](id)SELECT * FROM TinyBlog ORDER BY id INSERT INTO [dbo].[TinyBlog]( [id], [NAME] )
VALUES  ( NULL, -- id - int'3232'  -- NAME - varchar(100)
          )INSERT INTO [dbo].[TinyBlog]( [id], [NAME] )
VALUES  ( -2, -- id - int'-2'  -- NAME - varchar(100)
          )INSERT INTO [dbo].[TinyBlog]( [id], [NAME] )
VALUES  ( 66, -- id - int'66'  -- NAME - varchar(100)
          )INSERT INTO [dbo].[TinyBlog]( [id], [NAME] )
VALUES  ( 0, -- id - int'0'  -- NAME - varchar(100)
          )INSERT INTO [dbo].[TinyBlog]( [id], [NAME] )
VALUES  ( -30, -- id - int'-30'  -- NAME - varchar(100))

表数据如下

SELECT * FROM TinyBlog ORDER BY id 

分区分布

--查看分区架构文件组分布
SELECT  CONVERT(VARCHAR(MAX), ps.name) AS partition_scheme ,p.partition_number ,CONVERT(VARCHAR(MAX), ds2.name) AS filegroup ,CONVERT(VARCHAR(MAX), ISNULL(v.value, ''), 120) AS range_boundary ,STR(p.rows, 9) AS rows
FROM    sys.indexes iJOIN sys.partition_schemes ps ON i.data_space_id = ps.data_space_idJOIN sys.destination_data_spaces dds ON ps.data_space_id = dds.partition_scheme_idJOIN sys.data_spaces ds2 ON dds.data_space_id = ds2.data_space_idJOIN sys.partitions p ON dds.destination_id = p.partition_numberAND p.object_id = i.object_idAND p.index_id = i.index_idJOIN sys.partition_functions pf ON ps.function_id = pf.function_idLEFT JOIN sys.Partition_Range_values v ON pf.function_id = v.function_idAND v.boundary_id = p.partition_number- pf.boundary_value_on_right
WHERE   i.object_id = OBJECT_ID('TinyBlog')AND i.index_id IN ( 0, 1 )
ORDER BY p.partition_number--分区区间
--SELECT  *  FROM    sys.partition_range_values

View Code

分区情况

--分区情况
SELECT  c.* ,b.[groupname] AS '分区方案对应的文件组名称' ,d.name '当前分区函数对应的分区方案'
FROM    sys.destination_data_spaces AS aINNER JOIN sysfilegroups AS b ON a.[data_space_id] = b.[groupid]INNER JOIN ( SELECT $PARTITION.Fun_TinyBlog_Id(id) AS 分区编号 ,MIN(id) AS Min_value ,MAX(id) AS Max_value ,COUNT(id) AS 记录数FROM   [dbo].[TinyBlog]GROUP BY $PARTITION.Fun_TinyBlog_Id(id)) AS c ON c.[分区编号] = a.[destination_id]INNER JOIN sys.partition_schemes AS d ON a.[partition_scheme_id] = d.data_space_id
ORDER BY c.[分区编号]

View Code

第二个视图直接把NULL值忽略了

根据第一个视图,我们画出一个总结图

分析一下


总结

结论其实很清晰,分区列不要允许NULL,如果允许列,那么我们交换分区归档数据的时候就会有麻烦了,因为无法判断分区列是NULL值的那些数据行是老数据还是新数据

相关文章:

http://www.cnblogs.com/gaizai/archive/2010/11/05/1870071.html

https://msdn.microsoft.com/zh-cn/library/ms187802.aspx

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

SQL Server表分区的NULL值问题相关推荐

  1. SQL Server表分区【转】

    转自:http://www.cnblogs.com/knowledgesea/p/3696912.html SQL Server表分区 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个 ...

  2. SQL Server表分区-水平分区

    SQL Server表分区,sql server水平分区 转自:http://www.cnblogs.com/knowledgesea/p/3696912.html  根据时间的,直接上T-SQL代码 ...

  3. sql server表分区_SQL Server中的FORCESCAN和分区表

    sql server表分区 I would like to share one curios case that I recently came across. 我想分享一下我最近遇到的一个古玩案例. ...

  4. sql server表分区_介绍分区表SQL Server增量统计信息

    sql server表分区 If you are maintaining a very large database, you might be well aware of the pain to p ...

  5. sql server表分区_SQL Server 2016增强功能– SQL截断表和表分区

    sql server表分区 The idea behind this article is to discuss the importance and the implication of SQL P ...

  6. SQL Server 表分区实战系列(文章索引)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 前言(Introduction) 实战说明(In Action) 表分区逻辑结构图(Construction) 表分区学 ...

  7. SQL Server 表分区注意事项(转载)

    在园子里看到 听风吹雨 关于SQL Server 表分区注意事项 ,总结的太好了.备忘,方便以后查询! http://www.cnblogs.com/gaizai/archive/2011/05/31 ...

  8. 52. SQL Server -- 表分区实战系列(文章索引)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 前言(Introduction) 实战说明(In Action) 表分区逻辑结构图(Construction) 表分区学 ...

  9. SQL Server 表分区之水平表分区

    什么是表分区? 表分区分为水平表分区和垂直表分区,水平表分区就是将一个具有大量数据的表,进行拆分为具有相同表结构的若干个表:而垂直表分区就是把一个拥有多个字段的表,根据需要进行拆分列,然后根据某一个字 ...

最新文章

  1. 读博前三年0文章,后期发力一口气11篇一作!这个“90后”现任职985博导
  2. 小猿圈解析vue数据双向绑定的缺点
  3. PLSQL导出表的数据insert语句
  4. ubuntu搭建tiny4412环境【学习笔记】
  5. tomcat5应用移植到WAS5.1中的一些问题及解决
  6. Actor-ES框架:Ray-Handler之ToReadHandler编写
  7. 载波聚合或双连接的方式进行_处理载波聚合及双连接的装置及方法与流程
  8. php 方法参数传递,在PHP中将实例方法作为参数传递
  9. DLL导出函数名称改编的解决方法
  10. 10个最佳jQuery Lightbox效果插件收集
  11. python中read函数解释_Python内置函数解释教程,readwill(非常详细的代码演示截图),详解,看,了,就,会,很...
  12. 用装饰器来进行登录验证
  13. php mysql 模型_ThinkPHP数据库与模型
  14. 敏感词过滤的php代码,ThinkPHP敏感词汇过滤
  15. 中国DCS品牌知名度调查
  16. 联想G480黑苹果安装成功
  17. 高仿QQ空间广告位 ——— 一个位置来回切换两张广告图
  18. 鸟哥的Linux私房菜基础学习篇 第2章的重点探索
  19. SCLK时钟信号可以高电平有效也可以低电平有效
  20. ftp服务器文件访问路径,ftp服务器访问路径格式

热门文章

  1. c一:指针引用(int * p )和指针(int * q)的区别
  2. 辨析Java与Javascript
  3. Vue组件中使用Sass或者Less全局变量
  4. 第十三章:位图(三)
  5. 由event target引发的关于事件流的一连串思考(二)
  6. 第 30 章 lvs-rrd
  7. 快速部署Telegraf Influxdb
  8. 测试Hadoop2.7.1
  9. 部署JTBC2.0网上商城(apache+tomcat+mysql)
  10. 查看imooc服务器文件