门前有条河

 

笔记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)

posted on 2013-10-10 14:56  王述兵  阅读(367)  评论(0编辑  收藏  举报

导航