SQL数据库变大的原因

wolaile27 2007-12-18 11:49:22
有一个数据库,开始有600M 我将数据库表中所有的NUMERIC 改为DECIMAL 类型的,可是数据库就变大到2G
我想请教一下是怎么回事,如何保留DECIMAL类型,直接在该库上操作将其边小?
...全文
1154 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2007-12-19
  • 打赏
  • 举报
回复

压缩日志及数据库文件大小

/*--特别注意

请按步骤进行,未进行前面的步骤,请不要做后面的步骤
否则可能损坏你的数据库.


一般不建议做第4,6两步
第4步不安全,有可能损坏数据库或丢失数据
第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.
--*/

--下面的所有库名都指你要处理的数据库的库名

1.清空日志
DUMP TRANSACTION 库名 WITH NO_LOG

2.截断事务日志:
BACKUP LOG 库名 WITH NO_LOG

3.收缩数据库文件(如果不压缩,数据库的文件不会减小
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了

也可以用SQL语句来完成
--收缩数据库
DBCC SHRINKDATABASE(库名)

--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
DBCC SHRINKFILE(1)

4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
a.分离数据库:
企业管理器--服务器--数据库--右键--分离数据库

b.在我的电脑中删除LOG文件

c.附加数据库:
企业管理器--服务器--数据库--右键--附加数据库

此法将生成新的LOG,大小只有500多K

或用代码:
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。

a.分离
EXEC sp_detach_db @dbname = '库名 '

b.删除日志文件

c.再附加
EXEC sp_attach_single_file_db @dbname = '库名 ',
@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\库名.mdf '

5.为了以后能自动收缩,做如下设置:
企业管理器--服务器--右键数据库--属性--选项--选择 "自动收缩 "

--SQL语句设置方式:
EXEC sp_dboption '库名 ', 'autoshrink ', 'TRUE '

6.如果想以后不让它日志增长得太大
企业管理器--服务器--右键数据库--属性--事务日志
--将文件增长限制为xM(x是你允许的最大数据文件大小)

--SQL语句的设置方式:
alter database 库名 modify file(name=逻辑文件名,maxsize=20)
hangzhou_hammer 2007-12-19
  • 打赏
  • 举报
回复
vmark
云中客 2007-12-18
  • 打赏
  • 举报
回复
无论修改的类型所在空间增加或减少,都会使用数据库所在空间增大
例如将一列类型由int 改变为 smallint,同样会使用数据库文件增大
这也许是由于数据库系统在做类型的转换时产生的垃圾造成的,所以建议在做了相应数据类型的转换后,使用以下命令对数据库空间进行整理:
DBCC SHRINKDATABASE (数据库名)
w2jc 2007-12-18
  • 打赏
  • 举报
回复
数据库尺寸增大是因为你这些字段,数据库把修改后的数据写到了另外的物理位置上。

不是收缩日志文件,而是收缩数据文件,就是.MDF结尾的文件

使用dbcc shrinkfile命令可以单独收缩MDF文件,看联机文档
云中客 2007-12-18
  • 打赏
  • 举报
回复
至所以修改前与修改后,数据文件相关的很大,有可能是所修改表的记录(内容)比较多造成的
andy84 2007-12-18
  • 打赏
  • 举报
回复
关注
云中客 2007-12-18
  • 打赏
  • 举报
回复
没有做过类似的处理,个人以为:
在数据类型修改后,数据存储空间发生了变化,可以尝试利用DBCC命令对表及索引进行重新整理

云中客 2007-12-18
  • 打赏
  • 举报
回复
1.疑问:decimal 和 numeric使用是相同,为什么要改变?
2.由于两个数据类型的使用时,需要输入参数,也就是定点精度和小数位数,不知这两个参数是否相同
3.此修改列是否为特殊列(如索引列/外键等)
wolaile27 2007-12-18
  • 打赏
  • 举报
回复
arrow_gx ,你的这个方法是对日志进行收缩,现在我的日志已经最小了
arrow_gx 2007-12-18
  • 打赏
  • 举报
回复
压缩一下数据库就好


--截断事务日志
backup log 你的库 with no_log
go

--收缩数据库
dbcc shrinkdatabase(你的库)
go
wolaile27 2007-12-18
  • 打赏
  • 举报
回复
我的日志文件已经是最小的了,504K ,已经无法在收缩了
wolaile27 2007-12-18
  • 打赏
  • 举报
回复
我想应该不是,我从新建了一个完全相同的库,类型为DECIMAL,导过去,大小还没有600M
dawugui 2007-12-18
  • 打赏
  • 举报
回复
收缩数据库
Microsoft® SQL Server™ 2000 允许收缩数据库中的每个文件以删除未使用的页。数据和事务日志文件都可以收缩。数据库文件可以作为组或单独地进行手工收缩。数据库也可设置为按给定的时间间隔自动收缩。该活动在后台进行,并且不影响数据库内的用户活动。

当使用 ALTER DATABASE AUTO_SHRINK 选项(或 sp_dboption 系统存储过程)将数据库设置为自动收缩,且数据库中有足够的可用空间时,则会发生收缩。但是,如果不能配置要删除的可用空间的百分比,则将删除尽可能多的可用空间。若要配置将删除的可用空间量,例如只删除数据库中当前可用空间的 50%,请使用SQL Server 企业管理器内的"属性"对话框进行数据库收缩。

不能将整个数据库收缩到比其原始大小还要小。因此,如果数据库创建时的大小为 10 MB,后来增长到 100 MB,则该数据库最小能够收缩到 10 MB(假定已经删除该数据库中所有数据)。

但是,使用 DBCC SHRINKFILE 语句,可以将单个数据库文件收缩到比其初始创建大小还要小。必须分别收缩每个文件,而不要试图收缩整个数据库。

事务日志文件可在固定的边界内收缩。虚拟日志的大小决定可能减小的大小。因此,不能将日志文件收缩到比虚拟日志文件还小。另外,日志文件可以按与虚拟日志文件的大小相等的增量收缩。例如,一个初始大小为 1 GB 的较大事务日志文件可以包括五个虚拟日志文件(每个文件大小为 200 MB)。收缩事务日志文件将删除未使用的虚拟日志文件,但会留下至少一个虚拟日志文件。因为此示例中的每个虚拟日志文件都是 200 MB,所以事务日志最小只能收缩到 200 MB,且每次只能以 200 MB的大小收缩。若要让事务日志文件收缩得更小,可以创建一个更小的事务日志,并允许它自动增长,而不要创建一个较大的事务日志文件。

在 SQL Server 2000 中,DBCC SHRINKDATABASE 或 DBCC SHRINKFILE 操作试图立即将事务日志文件收缩到所要求的大小(以四舍五入的值为准)。在收缩文件之前应截断日志文件,以减小逻辑日志的大小并将其标记为不包含逻辑日志任何部分的不活动的虚拟日志。有关更多信息,请参见收缩事务日志。

dawugui 2007-12-18
  • 打赏
  • 举报
回复
压缩一下库就行了.
areswang 2007-12-18
  • 打赏
  • 举报
回复
是字段类型的原因吗?帮顶!
leihentulong 2007-12-18
  • 打赏
  • 举报
回复
dbcc loginfo时,status = 2的为活动的
leihentulong 2007-12-18
  • 打赏
  • 举报
回复
精度增加了吧,如果数据文件太大就不太可能变小了。
dbcc loginfo 看看是不是活动的日志影响了
back transaction 数据库 with truncate_only
dbcc loginfo 再看看,如果可以缩小就shrinkfile 下
walker1116_2005 2007-12-18
  • 打赏
  • 举报
回复
应该是你的数据库日志文件变大了。如果是的采用6楼的办法即可。
w2jc 2007-12-18
  • 打赏
  • 举报
回复
使用 dbcc shrinkfile ,DBCC SHRINKDATABASE 都没有作用
---------------------------------------
如果你正确使用DBCC SHRINKFILE 也不能缩小数据库的话

使用下面的两句看看数据实际占了多少空间
dbcc updateusage
sp_spaceused

如果数据库就是2G的话,就不能缩小了。
rouqu 2007-12-18
  • 打赏
  • 举报
回复
数据库变大是很正常的 你压着不让它变大又是为何?

如上 对表结构的改动 数据库可能是先把整张表读到内存里来 统一修改数据格式 再存回去 存回去的过程中如果数据库判断有效空间不足以使用 可能会先申请新磁盘空间 存入新数据 再把原先的表数据清除

shrinkdatabase实际有时候效果不尽人意 感觉图形界面里压缩到最小项的常常比他有效 楼主可以一试
加载更多回复(4)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧