SQL Server部分有趣的整理(7)表分区踩坑记录

前两篇相关的:
SQL Server部分有趣的整理(2)分表和表分区,按日分区和分表的结合使用
SQL Server部分有趣的整理(6) 分区的数据清理和合并

第一篇中贴的脚本好像有点问题,当时走进一个误区
使用情景如下:
某个分区表内,有多个传感器的数据,同时是按照日期进行分区的
创建的是按日期分区的分区函数及分区方案
同时,在数据量大的时候,需要查出某个传感器的在某个时间段的范围内的数据,单靠建立时间的非唯一非聚集索引是不够的
(为啥是非唯一非聚集索引,是因为每个传感器上来的时间有可能相同,也有可能不同,所以是非唯一,然后更不适用于对时间进行聚集索引,以传感器编号进行聚集索引更符合实际需求)

当时的解决方法是直接在primary文件组下创建传感器编号的聚集索引

问题的发现是系统跑了三个多月后,C盘满了,无可用字节写入,然后提示xxx表的xxx索引(即传感器编号的聚集索引)无法分配字节

犯了几个错误:

1.创建数据库时不要放在c盘(系统盘)
由于平时图省事,创建数据库的脚本语句直接是

Create DataBase xxx

应该对其指定创建路径(或者在数据库图形界面中创建选中路径)

CREATE DATABASE xxx ON(NAME=N'xxx',FILENAME=N'D:\xxx')

c盘基本都是系统盘,万一系统崩了,数据库就丢了
其次,作为程序员的强迫症习惯,装啥能不装c盘的都不会装c盘
c盘空间一般会比其他盘小,再加上装些啥乱七八糟的进去,c盘就会没有什么空间了

2.对于分区表,索引不要创建在primary文件组下

为了查询效率,我在上面中创建了两种索引,总共有4个分区表,这些表的索引都创建在了primary文件组下,这样就导致primary底下存储了8个索引信息,同时加上我犯的第一个错误,数据库在c盘,这样就导致c盘莫名其妙的占了75G,而c盘本身才100G,加上系统的25G就刚好满了

解决办法:
尽量不要依赖数据库表设计页面右键的索引创建,可以通过以下几行:

create clustered  --NONCLUSTERED 非聚集
index idx_SensorNum --索引名称
on AccelData(SensorNum) --表(索引键)

on PARTITION_SCHEME_AccelData(occTime); --分区函数
go

查询索引情况:

 EXEC sp_helpindex N'AccelData' --表名称

在这里插入图片描述如上图,索引创建的位置 on 分区方案上,而不是primary

这些索引信息的储存东西都到哪去了?
总之不在primary上,我猜估计都存到了文件上吧(没有仔细考证)

或者方法二:
正常的在表设计的界面中添加了关系后,可以在下面选择你需要的文件组(当时好像无法选中分区方案)

方法三:
随便选择一个文件组(或者默认就primary文件组也可以)创建索引
创建完后如下结构:
在这里插入图片描述
(但是并不是你需要的文件组)
右键点击索引->编写索引脚本为->Create
在这里插入图片描述数据库会自动替你生成一堆比较官方规范的脚本

在这里插入图片描述加上一行即可

3.文件组满了怎么办

之前遇到的原因就是C盘满了,如果没满,可以看看primary文件组是否设置了自增长

use xxx--你的数据库名称
go

--看看你的primary组里的文件

select ds.name,
       df.physical_name,  --主文件组的物理文件的路径
                          --打开我的电脑,查看文件所在盘,是否磁盘已满
                          
       df.name  ,         --物理文件所对应的逻辑名称  
                     
       df.is_percent_growth, --是否自动增长
       df.growth             --增长多少
from sys.data_spaces ds
inner join sys.database_files df
        on ds.data_space_id = df.data_space_id
where ds.name = 'primary'

在这里插入图片描述
is_percent_growth:是否按百分比增长
growth:每次增长的百分比

如果这两个都是0的话,可以通过这段修改

ALTER DATABASE xxx
MODIFY FILE ( NAME = N'xxx', FILEGROWTH  = 10%)--设置文件组自增长

如果该数据库所在的物理路径所在的盘满了,就没办法了
这时候大概可以通过收缩数据库(但是这个大概是个迫不得已的办法,包括设置数据库自动收缩,手动执行收缩语句等等,具体网上有蛮多案例,直接百度即可,这边懒得贴了)

发布了29 篇原创文章 · 获赞 3 · 访问量 2132

猜你喜欢

转载自blog.csdn.net/weixin_40683787/article/details/104668276
今日推荐