SQL Server里在文件组间如何移动数据?
平常我不知道被问了几次这样的问题:“SQL Server里在文件组间如何移动数据?“你意识到这个问题:你只有一个主文件组的默认配置,后来围观了“SQL Server里的文件和文件组”后,你知道,有多个文件的自定义文件组会是个更好的主意。但你现在如何从主文件组里移动现有数据到新加的文件组?
这篇文章的目的是向你展示你如何在文件组间移动数据。首先我会谈下聚集和非聚集索引,然后我会谈下如何在堆表里移动数据。让我们开始吧!
移动聚集和非聚集索引
一般来说在你的表上通常应该有一个聚集索引。有了现存的聚集索引就很容易移动表数据(即聚集索引)到不同的文件组。下列代码我为表创建了一个简单的聚集和非聚集索引,并插入近800MB的测试数据到表。
CREATE TABLE TestTable
(
ID INT IDENTITY(1, 1) PRIMARY KEY NOT NULL,
SomeData1 INT NOT NULL,
SomeData2 CHAR(5000)
)
GO -- Create a supporting Non-Clustered Index
CREATE NONCLUSTERED INDEX idx_SomeData1 ON TestTable(SomeData1)
GO -- Insert around 800 MB of data
DECLARE @i INT = 0
WHILE (@i < 100000)
BEGIN
INSERT INTO TestTable (SomeData1, SomeData2)
VALUES (@i, REPLICATE('a', 5000)) SET @i += 1
END
GO
但你在表上执行sp_help的系统存储过程,你可以看到在主文件组里看到2个索引(聚集索引和非聚集苏音)。
sp_help TestTable
假设现在我已经让你相信一个有多个文件的自定义文件组是个好主意,并且你付诸行动了:
-- Add a new file group to the database
ALTER DATABASE MultipleFileGroups ADD FILEGROUP CustomFileGroup
GO -- Add a new file to the previous created file group
ALTER DATABASE MultipleFileGroups ADD FILE
(
NAME = 'CustomFile1',
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\CustomFile1.ndf',
SIZE = 1048576KB,
FILEGROWTH = 65536KB
) TO FILEGROUP CustomFileGroup
GO -- Add a new file to the previous created file group
ALTER DATABASE MultipleFileGroups ADD FILE
(
NAME = 'CustomFile2',
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\CustomFile2.ndf',
SIZE = 1048576KB,
FILEGROWTH = 65536KB
) TO FILEGROUP CustomFileGroup
GO
现在的问题是现存的你的所有数据还在主文件组。你如何移动它们到新加的文件组?这个问题的答案非常简单:重建这些索引(聚集和非聚集索引)即可,并且指定新加的文件组作为目标!我们先从聚集索引开始(索引名称从sys.index里得到):
SELECT * FROM sys.indexes WHERE object_id=OBJECT_ID('TestTable')
-- Move the Clustered Index into the newly created file group
CREATE UNIQUE CLUSTERED INDEX PK__TestTabl__3214EC27D9EE93A9 ON TestTable(ID)
WITH
(
DROP_EXISTING = ON
)
ON CustomFileGroup
GO
当你再次执行sp_help,你会看到SQL Server已经讲聚集索引完全移入不同的文件组。
现在我们继续处理非聚集索引:
-- Create a supporting Non-Clustered Index
CREATE NONCLUSTERED INDEX idx_SomeData1 ON TestTable(SomeData1)
WITH
(
DROP_EXISTING = ON
)
ON CustomFileGroup
GO
最后,我们可以收缩主文件组的数据文件来回收已分配的空间:
-- Shrink the MDF file in the PRIMARY file group
DBCC SHRINKFILE ('TestDatabase' , 0)
GO
现在当你插入另一个800MB的数据,你最终可以验证新分配在新加的文件组里发生,主文件组还是很小。搞定!
移动堆表
如果你想从堆表移动数据到自定义的文件组,这需要一点技巧。主要的问题是SQL Server不提供在文件组间移动堆表数据的方法。
因此我们要变通下:你在堆表上临时创建一个聚集索引(会把数据移入自定义文件组),然后你删除聚集索引恢复为堆表。
-- Create a new Clustered Index on the Heap table that moves the data into the custom file group
CREATE UNIQUE CLUSTERED INDEX idx_ci ON TestTable(ID)
ON CustomFileGroup
GO -- Drop the previous created Clustered Index again ;-)
DROP INDEX idx_ci ON TestTable
GO
我知道这样有点奇怪,但没有其他更高效的方法。另一个方法是在自定义文件组里创建新的堆表,移动数据到新的堆表,删除原来的堆表,重命名新的堆表。还不是一个完美的解决方法……
小结
在文件组间移动数据可以简单也可以复杂——取决于有没有聚集索引存在。如果你有聚集索引,你只需要在自定义文件组重建索引即可。如果你要处理堆表,你要临时增加聚集索引(它会移动表数据到别的文件组),然后删除聚集索引。真的不是个完美的解决方法……
感谢关注!
原文链接
https://www.sqlpassion.at/archive/2016/09/26/how-to-move-data-between-file-groups-in-sql-server
SQL Server里在文件组间如何移动数据?的更多相关文章
- SQL Server 在缺少文件组的情况下如何还原数据库
SQL Server 在缺少文件组的情况下如何还原数据库 一.背景 我有一个A库,由于a,b两张表的数据量比较大,所以对表进行分区:在把A库迁移到一个新的集群上去,我只备份了A库的主分区过去进行还原为 ...
- SQL Server里的文件和文件组
在今天的文章里,我想谈下SQL Server里非常重要的话题:SQL Server如何处理文件的文件组.当你用CREATE DATABASE命令创建一个简单的数据库时,SQL Server为你创建2个 ...
- sql server 里的文件和文件组使用
转自:https://www.cnblogs.com/woodytu/p/5821827.html 参考:https://www.sqlskills.com/blogs/paul/files-and- ...
- SQL Server架构 -- 数据库文件和文件组
在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,也是在特定文件夹下创建不同的文件,然后经过文件存储系统去抓取数据信息.理解文件和文件组的概念可以帮 ...
- SQL Server中数据库文件的存放方式,文件和文件组
原文地址:http://www.cnblogs.com/CareySon/archive/2011/12/26/2301597.html SQL Server中数据库文件的存放方式,文件和文件组 ...
- SQL Server里的闩锁介绍
在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch).闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构.文章的第1部分我会介 ...
- SQL Server里一些未公开的扩展存储过程
SQL Server里一些未公开的扩展存储过程 [转帖] 博客天地 www.inbaidu.com SQL Server里一些未公开的扩展存储过程 扩展存储过程(xp)是直接运行在SQL Server ...
- SQL Server里的INTERSECT
在今天的文章里,我想讨论下SQL Server里的INTERSECT设置操作.INTERSECT设置操作彼此交叉2个记录集,返回2个集里列值一样的记录.下图演示了这个概念. INTERSECT与INN ...
- SQL Server里的自旋锁介绍
在上一篇文章里我讨论了SQL Server里的闩锁.在文章的最后我给你简单介绍了下自旋锁(Spinlock).基于那个基础,今天我会继续讨论SQL Server中的自旋锁,还有给你展示下如何对它们进行 ...
随机推荐
- TODO:Laravel 使用blade标签布局页面
TODO:Laravel 使用blade标签布局页面 本文主要介绍Laravel的标签使用,统一布局页面.主要用到到标签有@yield,@ stack,@extends,@section,@stop, ...
- Asp.Net 操作XML文件的增删改查 利用GridView
不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...
- continue break 区别
在循环中有两种循环方式 continue , break continue 只是跳出本次循环, 不在继续往下走, 还是开始下一次循环 break 将会跳出整个循环, 此循环将会被终止 count = ...
- 记录一次bug解决过程:数据迁移
一 总结 不擅长语言表达,勤于沟通,多锻炼 调试MyBatis中SQL语法:foreach 问题:缺少关键字VALUES.很遗憾:它的错误报的让人找不着北. 二 BUG描述:MyBatis中批量插入数 ...
- SAP CRM 性能小技巧
导言 本页面打算收集SAP CRM实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识. 如果你有其他的技巧想要说出来,别犹豫! 性能注意事项 通用 缓存读取类访问,特别是在性能关键的地方,比 ...
- Atitit.技术管理者要不要自己做开发??
Atitit.技术管理者要不要自己做开发?? 1. 为什么很多管理者不能自己亲自做了1 1.1. 沟通成本多了1 1.2. .组织分散. 1 1.3. 会议多 .协调多 1 1.4. 问题的根源在于我 ...
- Java集合类--温习笔记
最近面试发现自己的知识框架有好多问题.明明脑子里知道这个知识点,流程原理也都明白,可就是说不好,不知道是自己表达技能没点,还是确实是自己基础有问题.不管了,再巩固下基础知识总是没错的,反正最近空闲时间 ...
- PMON failed to acquire latch, see PMON dump
前几天,一台Oracle数据库(Oracle Database 10g Release 10.2.0.4.0 - 64bit Production)监控出现"PMON failed to a ...
- Linux的学习笔记
Linux,1991年,系统安全,良好的可移植性,多用户,多任务,良好的兼容性,良好的用户界面, 主流的是RedHat或者CentOS, CentOS 设置的网关 192.168.2.2 Window ...
- System进程(pid=4)占用80端口的解决方案
问题 Mail服务器在安装TFS服务(含SQLServer2016)后启动不了网页服务. 排查问题 使用命令查看端口占用情况 netstat -nao | find ":80" n ...