问一个数据库的问题

hityct1 2008-11-30 09:49:32
很简单的问题。
我们在使用stl或vc提供的文件操作接口时(如ifstream,CFile),在更改文件中间的数据时,如果新的数据大于(或者)旧的数据,(保存时)会导致文件全部重写(到硬盘);如果等于旧的数据长度时,(保存时)只是修改的部分重写。
1)我的理解对不对?或者操作系统会用某种方法减少文件重写的可能性?
2)数据库文件通常很大,更改一个数据不可能导致全部重写文件。他是怎么避免的?有哪些策略。我理解是数据库的每个项的数据长度是固定的,或者有最大长度限制,这样会导致许多空间没有被利用。
...全文
171 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xqchang 2008-12-06
  • 打赏
  • 举报
回复
1、普通文件的内容被修改,不管新数据长度大于或小于旧数据长度,该文件以后的部分肯定都会被重写,等于的情况不好说,如果文件保存的扇区位置没有改变的话,可能只重写被修改的部分。
2、数据库在修改时,其文件肯定不会全部重写,因为数据库文件是按照一定的数据结构组织的。拿SQL Server来说,每一个数据库都有单独的数据库文件,在数据库文件中,首先建立表的索引,每个表中再建立记录的索引。修改一条记录时,会首先找到该记录的索引,再根据索引找到数据保存的具体位置,然后进行修改,因为不需要对整个数据库文件进行搜索,因此速度会很快。当记录中包含长度不固定的字段时,会另外为这些字段再建立索引,以便查询和修改。
数据库文件的空间肯定会有一定的浪费,不会是100%的被利用,至少有两个理由:一是数据库在保存数据记录时一般都会采用数据块的办法,比如在SQL Server中,不固定长度的二进制字段就按照类似16K或64K的块来保存,当数据不够16K时也占用16K的空间,超过16K,譬如为17K时,就会再占用一个16K的块,因此会有空间浪费;二是因为数据库在删除记录时,并不是真正删除,而是在索引表中做个标记,好处是不需要修改整个文件,既提高了数据处理速度,也便于以后恢复数据,不好处就是再一次造成空间浪费。

说的不一定对,仅供参考,建议多看看数据结构。
boterhan 2008-12-04
  • 打赏
  • 举报
回复
我刚遇到过一个问题,就是文件长度不时改变,导致写入不能完全覆盖,最后是一位老大给我一个函数解决的.
file.SetLength(0);
这样还会不会造成空间浪费?
闪破风浪 2008-12-02
  • 打赏
  • 举报
回复
太底层了,不懂~
hityct1 2008-12-02
  • 打赏
  • 举报
回复
o
hityct1 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ok1234567 的回复:]
问题来自更新锁的粒度问题,一般数据库可以达到行级(一条记录),普通的为页面(链表)
但是普通的文件,没有通用的粒度控制,如果某处插入或者删除一个字符,会带来后面的部分全部重写
[/Quote]
1)更改文件中间的数据时,如果等于旧的数据长度时,(保存时)只是修改的部分重写?
ok1234567 2008-12-01
  • 打赏
  • 举报
回复
问题来自更新锁的粒度问题,一般数据库可以达到行级(一条记录),普通的为页面(链表)
但是普通的文件,没有通用的粒度控制,如果某处插入或者删除一个字符,会带来后面的部分全部重写
hityct1 2008-11-30
  • 打赏
  • 举报
回复
up
hityct1 2008-11-30
  • 打赏
  • 举报
回复
d
hityct1 2008-11-30
  • 打赏
  • 举报
回复
up,似乎效率高低没有定论。
ilovedrv 2008-11-30
  • 打赏
  • 举报
回复
第一个,无论是什么情况,如果使用CreateFile,CloseHanle之类的操作,好像都要重新保存,因为这些接口区分不了那些是更新的,或则插入的

第二个,数据库物理实现不熟悉,只能说个大概,一般的数据库都是直接操作物理硬盘,绕过了操作系统,即使用了Raw I/O方式

看下这两篇文章

http://zhidao.baidu.com/question/24846123.html

http://www.chinaunix.net/jh/23/527591.html

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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