程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL SERVER truncate table後會不會重置表的自增值

SQL SERVER truncate table後會不會重置表的自增值

編輯:關於SqlServer

今天清理業務庫數據的時候,開發人員說可以使用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)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved