SQL Server表分区的NULL值问题

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

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

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

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

  测试脚本

 

  1. --1.创建文件组 
  2. ALTER DATABASE [sss] 
  3. ADD FILEGROUP [FG_TinyBlog_Id_01] 
  4.  
  5. ALTER DATABASE [sss] 
  6. ADD FILEGROUP [FG_TinyBlog_Id_02] 
  7.  
  8. ALTER DATABASE [sss] 
  9. ADD FILEGROUP [FG_TinyBlog_Id_03] 
  10.  
  11. ALTER DATABASE [sss] 
  12. ADD FILEGROUP [FG_TinyBlog_Id_04] 
  13.  
  14. ALTER DATABASE [sss] 
  15. ADD FILEGROUP [FG_TinyBlog_Id_05] 
  16.  
  17.  
  18. --2.创建文件 
  19. ALTER DATABASE [sss] 
  20. ADD FILE 
  21. (NAME = N'FG_TinyBlog_Id_01_data',FILENAME = N'E:\DataBase\sss\FG_TinyBlog_Id_01_data.ndf',SIZE = 96MB, FILEGROWTH = 24MB ) 
  22. TO FILEGROUP [FG_TinyBlog_Id_01]; 
  23.  
  24. ALTER DATABASE [sss] 
  25. ADD FILE 
  26. (NAME = N'FG_TinyBlog_Id_02_data',FILENAME = N'E:\DataBase\sss\FG_TinyBlog_Id_02_data.ndf',SIZE = 96MB, FILEGROWTH = 24MB ) 
  27. TO FILEGROUP [FG_TinyBlog_Id_02]; 
  28.  
  29. ALTER DATABASE [sss] 
  30. ADD FILE 
  31. (NAME = N'FG_TinyBlog_Id_03_data',FILENAME = N'E:\DataBase\sss\FG_TinyBlog_Id_03_data.ndf',SIZE = 96MB, FILEGROWTH = 24MB ) 
  32. TO FILEGROUP [FG_TinyBlog_Id_03]; 
  33.  
  34. ALTER DATABASE [sss] 
  35. ADD FILE 
  36. (NAME = N'FG_TinyBlog_Id_04_data',FILENAME = N'E:\DataBase\sss\FG_TinyBlog_Id_04_data.ndf',SIZE = 96MB, FILEGROWTH = 24MB ) 
  37. TO FILEGROUP [FG_TinyBlog_Id_04]; 
  38.  
  39. ALTER DATABASE [sss] 
  40. ADD FILE 
  41. (NAME = N'FG_TinyBlog_Id_05_data',FILENAME = N'E:\DataBase\sss\FG_TinyBlog_Id_05_data.ndf',SIZE = 96MB, FILEGROWTH = 24MB ) 
  42. TO FILEGROUP [FG_TinyBlog_Id_05]; 
  43.  
  44.  
  45. --3.创建分区函数 
  46. CREATE PARTITION FUNCTION 
  47. Fun_TinyBlog_Id(INTAS 
  48. RANGE LEFT 
  49. FOR VALUES(-10,0,1,6) 
  50.  
  51.  
  52. --4.创建分区方案 
  53. CREATE PARTITION SCHEME 
  54. [Sch_TinyBlog_Id] AS 
  55. PARTITION [Fun_TinyBlog_Id] 
  56. TO([FG_TinyBlog_Id_01],[FG_TinyBlog_Id_02],[FG_TinyBlog_Id_03],[FG_TinyBlog_Id_04],[FG_TinyBlog_Id_05]) 

 

  插入测试数据

 

  1. USE [sss] 
  2.  
  3.  
  4.  
  5. CREATE TABLE TinyBlog(id INT  NULL,NAME VARCHAR(100))  
  6.  ON [Sch_TinyBlog_Id](id) 
  7.  
  8.  
  9.  
  10.  
  11. SELECT * FROM TinyBlog ORDER BY id  
  12.  
  13.  
  14. INSERT INTO [dbo].[TinyBlog] 
  15.         ( [id], [NAME] ) 
  16. VALUES  ( NULL-- id - int 
  17.           '3232'  -- NAME - varchar(100) 
  18.           ) 
  19.  
  20. INSERT INTO [dbo].[TinyBlog] 
  21.         ( [id], [NAME] ) 
  22. VALUES  ( -2, -- id - int 
  23.           '-2'  -- NAME - varchar(100) 
  24.           ) 
  25.  
  26.  
  27. INSERT INTO [dbo].[TinyBlog] 
  28.         ( [id], [NAME] ) 
  29. VALUES  ( 66, -- id - int 
  30.           '66'  -- NAME - varchar(100) 
  31.           ) 
  32.  
  33. INSERT INTO [dbo].[TinyBlog] 
  34.         ( [id], [NAME] ) 
  35. VALUES  ( 0, -- id - int 
  36.           '0'  -- NAME - varchar(100) 
  37.           ) 
  38.  
  39. INSERT INTO [dbo].[TinyBlog] 
  40.         ( [id], [NAME] ) 
  41. VALUES  ( -30, -- id - int 
  42.           '-30'  -- NAME - varchar(100) 
  43.           ) 

 

  表数据如下

 

  1. SELECT * FROM TinyBlog ORDER BY id  

  

 分区分布 

  1. --查看分区架构文件组分布 
  2. SELECT  CONVERT(VARCHAR(MAX), ps.nameAS partition_scheme , 
  3.         p.partition_number , 
  4.         CONVERT(VARCHAR(MAX), ds2.nameAS filegroup , 
  5.         CONVERT(VARCHAR(MAX), ISNULL(v.value, ''), 120) AS range_boundary , 
  6.         STR(p.rows, 9) AS rows 
  7. FROM    sys.indexes i 
  8.         JOIN sys.partition_schemes ps ON i.data_space_id = ps.data_space_id 
  9.         JOIN sys.destination_data_spaces dds ON ps.data_space_id = dds.partition_scheme_id 
  10.         JOIN sys.data_spaces ds2 ON dds.data_space_id = ds2.data_space_id 
  11.         JOIN sys.partitions p ON dds.destination_id = p.partition_number 
  12.                                  AND p.object_id = i.object_id 
  13.                                  AND p.index_id = i.index_id 
  14.         JOIN sys.partition_functions pf ON ps.function_id = pf.function_id 
  15.         LEFT JOIN sys.Partition_Range_values v ON pf.function_id = v.function_id 
  16.                                                   AND v.boundary_id = p.partition_number 
  17.                                                   - pf.boundary_value_on_right 
  18. WHERE   i.object_id = OBJECT_ID('TinyBlog'
  19.         AND i.index_id IN ( 0, 1 ) 
  20. ORDER BY p.partition_number 
  21.  
  22.  
  23. --分区区间 
  24. --SELECT  *  FROM    sys.partition_range_values 

 

 分区情况  

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

  

 

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

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

  

 

  分析一下

  

 

  总结

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

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/267565.html<

(0)
管理的头像管理
上一篇2025-05-06 11:46
下一篇 2025-05-06 11:48

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

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