筆記9-徐 DBCC SHRINKFILE不起做用的緣由

1 --DBCC SHRINKFILE不起做用的緣由
  2
  3
  4 --因爲sp_spaceused這個存儲過程依賴於SQLSERVER存儲在一些系統視圖裏的空間使用統計信息來算出結果,可是SQLSERVER並不保證明時更新空間使用統計信息。尤爲是數據庫剛剛發生大的變化以後,sp_spaceused的結果經常不許確
  5
  6 --能夠在SSMS裏,在數據庫上點右鍵-》報表-》標準報表-》
  7 --磁盤使用狀況、
  8 --按排在前面的表的磁盤使用狀況、
  9 --按表的磁盤使用狀況、
10 --按分區的磁盤使用狀況
11 --4個報表來從不一樣角度統計出數據庫空間使用狀況
12
13
14 CREATE DATABASE test_shrink
15 GO
16 USE test_shrink
17 GO
18 CREATE TABLE show_extent(a INT,b NVARCHAR(3900))
19 GO
20 USE test_shrink
21 DECLARE @i INT
22 SET @i=1
23 WHILE @i<=1000
24 BEGIN
25 INSERT INTO show_extent VALUES(1,REPLICATE(N'a',3900))
26 INSERT INTO show_extent VALUES(2,REPLICATE(N'b',3900))
27 INSERT INTO show_extent VALUES(3,REPLICATE(N'c',3900))
28 INSERT INTO show_extent VALUES(4,REPLICATE(N'd',3900))
29 INSERT INTO show_extent VALUES(5,REPLICATE(N'e',3900))
30 INSERT INTO show_extent VALUES(6,REPLICATE(N'f',3900))
31 INSERT INTO show_extent VALUES(7,REPLICATE(N'g',3900))
32 INSERT INTO show_extent VALUES(8,REPLICATE(N'h',3900))
33 SET @i=@i+1
34 END
35 DBCC SHOWCONTIG('show_extent')
36 GO
37
38 ------------------------------
39 --刪除a列不是5的數據
40 DELETE dbo.show_extent WHERE a<>5
41 --顯示數據文件有64MB
42 EXEC sys.sp_spaceused @objname = N'show_extent' -- nvarchar(776)
43
44 DBCC SHOWCONTIG('show_extent')
45
46 ----------------------------------------
47 --收縮文件
48 EXEC sys.sp_helpfile
49 DBCC SHRINKFILE(2,40) --fileid爲1 收縮到40MB
50 --DBCC SHRINKFILE
51 --(
52 --    { file_name | file_id }
53 --    { [ , EMPTYFILE ]
54 --    | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ]
55 --    }
56 --)
57
58 --創建索引釋放沒有使用的區
59 CREATE CLUSTERED INDEX show_I ON dbo.show_extent(a)
60 DBCC SHOWCONTIG('show_extent')
61 DBCC SHRINKFILE(1,1)
62 EXEC sys.sp_spaceused @objname = N'show_extent' -- nvarchar(776)
63
64 SELECT * FROM dbo.show_extent
65
66
67 --找出每一個區的對象理論上區數目和實際數目,而後重建大對象類型的表
68 USE test_shrink
69 GO
70 DROP TABLE #extentinfo
71 GO
72 CREATE TABLE #extentinfo
73 (
74 [file_id] SMALLINT,
75 page_id INT,
76 pg_alloc INT,
77 ext_size INT,
78 obj_id INT,
79 index_id INT,
80 partition_number INT,
81 partition_id BIGINT,
82 iam_chain_type VARCHAR(50),
83 pfs_bytes VARBINARY(10)
84 )
85 GO
86 DROP PROC import_extentinfo
87 GO
88 CREATE PROCEDURE import_extentinfo
89 AS
90 DBCC extentinfo('test_shrink')
91 GO
92 INSERT INTO #extentinfo EXEC import_extentinfo
93 GO
94
95 SELECT [file_id],obj_id,index_id,partition_id,ext_size,
96 'actual extent count'=COUNT(*),'actual page count'=SUM(pg_alloc),
97 'possible extent count'=ceiling(SUM(pg_alloc)*1.0/ext_size),
98 'possible extents/actual extents'=
99 (ceiling(SUM(pg_alloc)*1.00/ext_size)*100.00)/COUNT(*)
100 FROM #extentinfo
101 GROUP BY file_id,obj_id,index_id,partition_id,ext_size
102 HAVING COUNT(*) -ceiling(SUM(pg_alloc)*1.0/ext_size)>0
103 ORDER BY partition_id,obj_id,index_id,file_id
104
105 --DBCC SHRINKFILE清空文件,不收縮到指定的大小
106 USE GPOSDB  --要收縮的數據庫名
107 DBCC SHRINKFILE(1,EMPTYFILE)數據庫

相關文章
相關標籤/搜索