SQLSERVER truncate table之后是否会重置表的自增值

今天清理业务库数据的时候,开发人员说可以使用truncate table把两个表的所有数据清理掉

这两个表都有自增ID,都做了表分区,单表200GB,使用 SELECT IDENT_CURRENT('') 的时候两个表

的当前自增值是3000012,这两个表几乎是一模一样的,除了一两个字段不一样

我执行两个SQL语句把两个表都truncate掉,然后就忘记了收缩数据库和重置种子值

由于分区函数的最后一个值是2000000,那么后插入的数据都会积聚在最后一个文件组

1、重置种子值,让数据重新利用第一个文件组

2、修改分区方案,使用 split range,向分区函数添加新值

虽然不重置也可以,但是如果使用 split range,向分区函数添加新值工作量就大了,为了不增加工作量当然重置种子值最好

因为当时太忙,继续搬数据库去了

下班回来才想起这件事,还需要收尾工作,马上远程到业务数据库的机器,使用下面的SQL语句查看分区情况

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

发现两个表的新插入的数据都放在第一个文件组,并且自增id又从1开始了

马上测试一下,结果发现truncate table真的重置了种子,以前是知道的,不过以前用到truncate的情况很少

USE [test]
GO
CREATE TABLE truncatetabletestidentity (id INT IDENTITY(1,1),NAME NVARCHAR(20))
GO INSERT [dbo].[truncatetabletestidentity]
SELECT 'ni' UNION ALL
SELECT 'we' UNION ALL
SELECT 'pp' SELECT * FROM [dbo].[truncatetabletestidentity]
GO TRUNCATE TABLE [dbo].[truncatetabletestidentity]

接下来收缩数据库,磁盘空间又“多出“了450GB空间,磁盘预警消失了~

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

2014-4-7补充:

在MSDN里面提到

DBCC CHECKIDENT (Transact-SQL)

DBCC CHECKIDENT (table_name, RESEED,new_reseed_value )

将当前标识值设置为 new_reseed_value。 如果自从创建表以来未在表中插入任何行,或者已使用 TRUNCATE TABLE 语句删除所有行,则在运行 DBCC CHECKIDENT 之后插入的第一行将使用 new_reseed_value 作为标识。 否则,插入的下一行将使用new_reseed_value + 当前增量值。

如果该表不为空,那么将标识值设置为小于标识列中的最大值的数字时,将会出现下列情况之一:

  • 如果标识列中存在 PRIMARY KEY 或 UNIQUE 约束,则随后在表中执行插入操作时将生成错误消息 2627,原因是生成的标识值将与现有值冲突。

  • 如果不存在 PRIMARY KEY 或 UNIQUE 约束,则随后的插入操作将产生重复的标识值。

SQLSERVER truncate table之后是否会重置表的自增值的更多相关文章

  1. SQL Server 2008 R2——TRUNCATE TABLE 无法截断表 该表正由 FOREIGN KEY 约束引用

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  2. MySql清空表的方法介绍 : truncate table 表名

    清空某个mysql表中所有内容 delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate tabl ...

  3. 【转载】delete table 和 truncate table 的区别

    使用delete语句删除数据的一般语法格式: delete [from] {table_name.view_name} [where] 将XS表中的所有行数据删除 delete XS 执行完后,发现X ...

  4. truncate table 和delete

    delete table 和 truncate table 使用delete语句删除数据的一般语法格式: delete [from] {table_name.view_name} [where< ...

  5. delete table 和 truncate table

    delete table 和 truncate table 使用delete语句删除数据的一般语法格式: delete [from] {table_name.view_name} [where< ...

  6. Oracle 使用TRUNCATE TABLE删除所有行

    若要删除表中的所有行,则 TRUNCATE TABLE 语句是一种快速.有效的方法.TRUNCATE TABLE 与不含 WHERE 子句的 DELETE 语句类似.但是,TRUNCATE TABLE ...

  7. TRUNCATE TABLE 与 DELETE (转)

    TRUNCATE TABLE 删除表中的所有行,而不记录单个行删除操作.TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似:但是,TRUNCATE TABLE 速度更快, ...

  8. TRUNCATE TABLE (Transact-SQL)

    删除表中的所有行,而不记录单个行删除操作. TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似:但是,TRUNCATE TABLE 速度更快,使用的系统资源和事务日志资源 ...

  9. SQL Server数据恢复准备之TRUNCATE TABLE理解

    SQL Server数据恢复准备之TRUNCATE TABLE理解 转自:https://blog.51cto.com/aimax/2142553 易语随风去关注0人评论6717人阅读2018-07- ...

随机推荐

  1. 一致性hash介绍

    像Memcache以及其它一些内存K/V数据库一样,Redis本身不提供分布式支持,所以在部署多台Redis服务器时,就需要解决如何把数据分散到各个服务器的问题,并且在服务器数量变化时,能做到最大程度 ...

  2. EmptyRecycle() 清空回收站

    //在uses下面引用 function SHEmptyRecycleBinA(Wnd:HWND;str:PChar;WRD:DWORD):Integer;stdcall; external 'SHe ...

  3. 一步步编写avalon组件01:弹出层组件

    avalon2已经稳定下来,是时候教大家如何使用组件这个高级功能了. 组件是我们实现叠积木开发的关键. avalon2实现一个组件非常轻松,并且如何操作这个组件也比以前的avalon2,还是react ...

  4. JavaIDL开发CORBA实例演示

    转载 http://www.micmiu.com/opensource/corba/corba-javaidl-dev-demo/

  5. 在C#中创建和读取XML文件

    1.创建简单的XML文件 为了便于测试,我们首先创建控制台应用程序,项目命名为CreateXml,Program.cs代码如下: 这样会在C盘根目录下创建data2.xml文件,文件内容为 using ...

  6. Asp.net Session 保存到MySql中

    一 网站项目引入"mysql.web.dll" 二 web.config配置中添加mysql数据库连接字符串 <connectionStrings> <remov ...

  7. js灵活打印web页面区域内容的通用方法

      我们做网站,经常需要打印页面指定区域的内容,而网上关于这块的说法很多,各种各样的打印控件也不少.但许多打印方案都不怎么好,至少我不喜欢,要么封装复杂,要么难以维护.正好现在的项目也需要用到 ...

  8. 在Linux终端命令行下播放音乐的命令(Ubuntu)

    现在的 Linux 桌面已经发展的很好了,在桌面下播放音乐操作起来也很简单.那么我们还记得在桌面不是那么好的时候我们是怎么播放音乐的么?哎,我是想不起来了,实在是太难了. 不过现在我们可以先安装一个小 ...

  9. 创建solr集群简述

    综述: 用两台服务器,每台服务器上启动两个solr实例(端口分别为8983.7574),即一共有2x2=4个节点.4个节点分散在两个分片上,每台机器上存放两个分片的各一个replica,这样等于每台机 ...

  10. HTML、CSS小知识--兼容IE的下拉选择框select

    HTML <div class="s_h_ie"> <select id="Select1" disabled="disabled& ...