当前位置: 首页 > 科技观察

SQLServer表分区的NULL值问题

时间:2023-03-16 14:20:29 科技观察

SQLServer表分区只支持范围分区的类型,经常被大家吐槽  MySQL支持四种类型:RANGE分区,LIST分区,HASH分区,KEY分区  共同点是MySQL和SQLServer也存在分区对齐的问题。它们都是水平分区的。每个人都允许分区列具有NULL值。值存储在哪个区间,之前没注意过  测试脚本--1.创建文件组ALTERDATABASE[sss]ADDFILEGROUP[FG_TinyBlog_Id_01]ALTERDATABASE[sss]ADDFILEGROUP[FG_TinyBlog_Id_02]ALTERDATABASE[sss]ADDFILEGROUP[FG_TinyBlog_Id_03]ALTERDATABASE[sss]ADDFILEGROUP[FG_TinyBlog_Id_04]ALTERDATABASE[sss]ADDFILEGROUP[FG_TinyBlog_Id_05]--2.创建文件ALTERDATABASE[sss]ADDFILE(NAME=N'FG_TinyBlog_Id_01_data',FILENAME=N'E:\DataBase\sss\FG_TinyBlog_Id_01_data.ndf',SIZE=96MB,FILEGROWTH=24MB)TOFILEGROUP[FG_TinyBlog_Id_01_data][ALTERDsBASE];]ADDFILE(NAME=N'FG_TinyBlog_Id_02_data',FILENAME=N'E:\DataBase\sss\FG_TinyBlog_Id_02_data.ndf',SIZE=96MB,FILEGROWTH=24MB)TOFILEGROUP[FG_TinyBlog_Id_02];ALTERDATABASE[sss]ADD3FILE(TinyBlog_data_data.ndf',NAME=N'logIdFG',FILENAME=N'E:\DataBase\sss\FG_TinyBlog_Id_03_data.ndf',SIZE=96MB,FILEGROWTH=24MB)TOFILEGROUP[FG_TinyBlog_Id_03];ALTERDATABASE[sss]ADDFILE(NAME=N'FG_TinyBlog_Id_04_data',FILENAME=N'E:\DataBase\sss\FG_TinyBlog_Id_04_data.ndf',SIZE=96MB,FILEGROWTH=24MB)TOFILEGROUP[FG_TinyBlog_Id_04];ALTERDATABASE[sss]addfile(name=n'fg_tinyblog_id_05_data',filename=n'e:\database\sss\sss\fg_tinyblog_id_id_data.ndf',size=96mb,filegrowth=24mb=24mb)(-10,0,1,6)-4。 使用[sss]CREATETABLETinyBlog(idINTNULL,NAMEVARCHAR(100))ON[Sch_TinyBlog_Id](id)SELECT*FROMTinyBlogORDERBYidINSERTINTO[dbo].[TinyBlog]([id],[NAME])VALUES(NULL,--id-int'3232'--NAME-varchar(100))INSERTINTO[dbo].[TinyBlog]([id],[NAME])VALUES(-2,--id-int'-2'--NAME-varchar(100))INSERTINTO[dbo].[TinyBlog]([id],[NAME])VALUES(66,--id-int'66'--NAME-varchar(100))INSERTINTO[dbo].[TinyBlog]([id],[NAME])VALUES(0,--id-int'0'--NAME-varchar(100))INSERTINTO[dbo].[TinyBlog]([id],[NAME])VALUES(-30,--id-int'-30'--NAME-varchar(100))  表数据如下SELECT*FROMTinyBlogORDERBYid   partitiondistribution --查看分区schema文件组分布SELECTCONVERT(VARCHAR(MAX),ps.name)ASpartition_scheme,p.partition_number,CONVERT(VARCHAR(MAX),ds2.name)ASfilegroup,CONVERT(VARCHAR(MAX),ISNULL(v.value,''),120)ASrange_boundary,STR(p.rows,9)ASrowsFROMsys.indexesiJOINsys.partition_schemespONi.data_space_id=ps.data_space_idJOINsys.destinsysation_data_spacesddsONps.data_space_INme_spacesddsONi.data_space_id=dds.partitionJOs.data_spacesds2ONdds.data_space_id=ds2.data_space_idJOINsys.partitionspONdds.destination_id=p.partition_numberANDp.??object_id=i.object_idANDp.??index_id=i.index_idJOINsys.partition_functionspfONps.function_id=pf.function_idLEFTJOINsys.Partition_Range_valuesvONpf.function_id=v.function_idANDv.boundary_id=p.partition_number-pf.boundary_value_on_rightWHEREi.object_id=OBJECT_ID('TinyBlog')ANDi.index_idIN(0,1)ORDERBYp.partition_number--分区范围--SELECT*FROMsys.partition_range_values♂分区情况  --分区条件SELECTc.*,b.[groupname]AS'分区方案对应的文件组名',d.name'当前分区函数对应的分区方案'FROMsys.destination_data_spacesASaINNERJOINsysfilegroupsASbONa.[data_space_id]=b.[groupid]INNERJOIN(SELECT$PARTITION.Fun_TinyBlog_Id(id)AS分区号,MIN(id)ASMin_value,MAX(id)ASMax_value,COUNT(id)AS记录号FROM[dbo].[TinyBlog]GROUPBY$PARTITION.Fun_TinyBlog_Id(id))AScONc.[partitionnumber]=a.[destination_id]INNERJOINsys.partition_schemesASdONa.[partition_scheme_id]=d.data_space_idORDERBYc.[partitionnumber]    第二种观点直接忽略NULL值  根据第一种看来,我们画个总结图    分析一下    总结  结论其实很明确。分区列不应允许NULL。如果列是允许的,那么我们在交换分区归档数据的时候就会遇到麻烦,因为我们无法判断那些分区列为NULL值的数据行是旧数据还是新数据。

最新推荐
猜你喜欢