~~~[技术][26]给被Access过大问题困扰的网站,提供几种解决方案。~~~
|
 
- 帖子
- 59394
- 积分
- 40451
- 贡献
- 0
- 鲜花
- 26
- 臭蛋
- 5
- 来自
- 武汉 - H.K
- 在线时间
- 7567 小时
- 注册时间
- 2004-6-2
 
|
~~~[技术][26]给被Access过大问题困扰的网站,提供几种解决方案。~~~
作者:小K(Kid)
! H% o' k1 C; s& ?% }2 w; {4 ~网站:http://www.kidx.cn- {2 `: _" j+ y' V
QQ:6661635
$ C' F/ w% }, D3 `
% _0 k9 D, e1 M1 m" a# _7 d问题:
. y% ?0 q3 w% o6 f$ p' }4 g; U: N: l* K$ ~% q
1、我的Access数据库里面没存多少数据,为什么体积很大,别人和我存一样的数据为什么只有我的文件体积的1/10。! w9 U, F0 T& H4 G4 ^7 p- c) t
2、为什么我删除了数据,但是数据库体积没有减小?
8 p3 j/ Q5 E( e3、为什么我存了几张图片到ole字段里面数据库体积就变大,而且变大的速度超过图片的总体积?, f/ e7 U1 c2 C+ O- J9 e9 r* y
4、为什么我的数据库没有几条记录,体积就20多MB
6 Z" M& y5 W7 C3 j0 N* S- l5、每次体积变大后都要手动压缩?有没有办法自动压缩?
2 `' z" m: a- d; h" D- H1 W8 ]+ H: S( O$ F5 w
" s' M- ^8 c) N0 V9 U
回答:
! B# e4 J6 [8 Z) L7 Q/ ?9 u
& [, ~# ]0 E% ~* e) z1、2、你只要在Access里面菜单 工具->数据库实用工具 -> 压缩修复数据库 就可以了5 ]+ W" T1 A% M! y" y& L- A3 s
原因是:Access在删除记录或者进行其他需要临时数据的操作后,并不物理删除这些无用数据,只有压缩修复数据库的时候才真正删除。就象windows中将文件放进回收站中无法增加可用空间必须清空回收站是一个道理。- k# k" B% Y" p H4 {
9 l: U- n% m' L; L& g: B) n如何操作请参考以下 FLASH 动画:; A+ K/ j% q- L" V
手动压缩修复数据库。
5 X6 k5 D- x8 X8 ~) Q* _7 lhttp://access911.net/down/eg/swf/rc.htm9 ?4 s: z2 k$ v& M3 m
http://access911.net/down/eg/swf/rc.swf
, I0 Q4 F! j @3 R
# M' E$ K8 }. `# y/ p O6 {8 y% |2 a3、手动将文件插入ole字段的文件,实际保存在数据库中时ole引擎会在文件数据的前面增加一段信息,用于让ole引擎处理你放进去的文件,所以体积会变大。
* w4 n4 A0 e0 @+ v8 P, k- ~, S3 b, T" }/ G9 U
4、请查看一下,你的数据库里面是否有包含ole字段的表,ole字段可以存储体积非常大的文件,导致体积增长很正常。再看一下你的数据库中窗体、报表中有没有嵌入使用图片做背景。Access中的背景图片全部是以bmp图片格式存放的,即使你原先指定的是jpg格式,Access也会自动将文件格式转换为bmp再存放。/ @$ {" D: f7 u' v' i t- }
无论是背景还是控件,只要有图片,体积就会不正常地增大。还有,如果你的程序设计成运行时会使用大量临时数据,用完了再删除的,也会造成体积暴增。
3 i. o' ~. ?5 n% O0 n$ b
1 o. u( S0 r: X' J5、可以设置退出时自动压缩,步骤如下:
% p" B2 X9 Z! q* T9 \6 G菜单 -> 工具 -> 选项 -> 常规关闭时压缩 -> 前面打上勾
- x7 {$ z2 C/ t# Q
5 X, ^- w% n: n0 p% d以上为转贴,以下为原创。7 a: _$ e+ P7 _4 _" t' l) N1 g
2 ]+ m+ Y2 r6 l( i9 \: ~
上面的是几种数据库变大后的解决方案。
1 y% u$ n9 m: ^. L! ]- n+ a8 f$ ~% N8 [
我想说的是如何防止数据库变的如此大。
3 P7 h: Y0 C' p0 w- A- F/ [: _) A3 a7 \. F: L6 K
站在程序员的角度来说,所以不一定对各位站长有用。! N6 h2 ^1 w1 w
+ j! B0 D4 M, _- V. c! L
只是或许可以给各位Asp+Access的程序作者一点小小的建议而已。。+ H! l" ^' `" K" A
5 H7 \+ v3 S# n$ z采用多个数据库,而不是一个数据库。
* D C _) K7 T2 Q( t6 c! R: H9 x& I0 l6 ^
可以大概指定一定范围,例如从0到1W使用1号数据库。
0 J# D9 e( T% d m! N4 W
: ^2 z2 o0 [; A/ T9 \1W到2W使用2号数据库。3 F4 `% h) e0 D) j+ Y* ]- I' I
3 P5 p# Z3 N3 u7 O8 D7 W如何使用?。。 @" l" u4 T, S2 C2 o/ \+ [
9 Y2 Q& a- H0 X$ s& \
con和rs定义多个。。5 u8 N7 N5 y) ~5 i
+ R$ P" `* n' G2 ?con1是一号数据库的,con2是二号数据库的。。
3 k: y! T& `/ c! V- t0 p& A( [
# d* z$ @/ r3 c- jrs1是一号数据库的,rs2是二号数据库的。。6 S( T( C" ?9 {' a5 h7 S: w- Z
# U$ U0 w( M* o. K, L* f
添加:
0 Z5 j6 w* `, z5 L- L5 ~" x5 d$ j# b6 |: E4 L- m' k) j/ c2 A6 S( p( W
当数据达到XW条时使用新的conX和rsX。。
& z s& a, @( }. k: J: G+ @9 x# S! d4 b9 T. \; e
修改:
, b5 j/ O" O. W
- w5 s2 ~: ]3 O+ T, a$ R查询要修改的ID号。。去指定是数据库执行操作。
6 [8 |; K3 u* b0 ?3 K& w& W- Y+ q) x D
删除:
1 V/ A5 p5 Q* q6 G
1 L9 x! v' ?8 e% R$ m- [% U3 q5 H同修改。
, d1 I) _. K7 Q/ I
; w2 G( }$ ~% K7 z2 X: I2 @用这个有一个不是很好解决的地方。比如我要查询用户排行,查询积分最大的10个用户。1 S \: u- `* M) [# W* [
! V) P# n* |8 ~由于用的多个数据库,而且用的多个rs。。" ~9 C, f) Y# P6 e, T' ?
. w, L* j' c' X
找到了两种方法,各位依照喜好使用。
8 Q9 X; l3 }. A' B# P4 ~6 l( A s* ?; f3 k9 E' a' D! `
第一种:- Private Function UnionRs(rsA As Recordset, rsB As Recordset) As Recordset
- Dim rs As New Recordset, i%
- For i = 0 To rsA.Fields.Count - 1
- '设置记录集标题列
- rs.Fields.Append rsA.Fields(i).Name, rsA.Fields(i).Type, adFldMayBeNull + adFldIsNullable + adFldUpdatable
- Next
- '添加rsA到rs
- If Not rsA.EOF Then
- rsA.MoveFirst
- If rs.State = adStateClosed Then rs.Open
- While Not rsA.EOF
- rs.AddNew
- For i = 0 To rs.Fields.Count - 1
- rs(i) = rsA(i)
- Next
- rsA.MoveNext
- Wend
- rs.UpdateBatch
- End If
- '添加rsB到rs
- If Not rsB.EOF Then
- rsB.MoveFirst
- If rs.State = adStateClosed Then rs.Open
- While Not rsB.EOF
- rs.AddNew
- For i = 0 To rs.Fields.Count - 1
- rs(i) = rsB(i)
- Next
- rsB.MoveNext
- Wend
- rs.UpdateBatch
- End If
- '返回合成后的新的记录集
- Set UnionRs = rs
- End Function
- '调用合并函数
- Private Sub Command1_Click()
- Dim rs As Recordset
- Set rs = UnionRs(rsA, rsB) '合并rsA和rsB
- Set DataGrid1.DataSource = rs
- End Sub
复制代码 第二种:- 当记录条数很多的时候,用循环的方法确实比较慢,比较快一点的,可以借助临时表来做:
- 假设你的两个数据库位置为:C:\testA.mdb和C:\testB.mdb
- Dim cnA As New ADODB.Connection, cnB As New ADODB.Connection, rs As New ADODB.Recordset
- cnA.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\TestA.mdb;User Id=admin;Password=;"
- cnB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\TestB.mdb;User Id=admin;Password=;"
- cn.Execute ("select * into temp from tableA") '把tableA的数据插入到临时表temp里(具体的查询数据的语句自己改)
- cn1.Execute ("INSERT INTO [C:\testA.mdb].temp SELECT * From tableB") 'tableB的数据追加testA的临时表temp里(具体的查询数据的语句自己改)
- rs.Open "temp", cnA, adOpenDynamic, adLockReadOnly, adCmdTable
复制代码 % n9 z& G5 d+ W
6 V" ~9 `' V* C1 A
采用多个相同数据库,访问时随机选择数据库。
. X4 U; Z. b9 l0 J% @# G' U: c, x0 Q; [7 H0 x7 p1 L
这个相对来说方便一点,不过不会减少数据库的体积,而是减少数据库的连接数。$ X0 G0 j( J |5 t
' k5 e5 p! s4 J% _
也在一定程度上减轻了数据库的压力。) M! a% m* B( @! @/ }& h/ ?
' S1 O; m4 n7 U* A' ?* z. E0 ]
灵感来自镜像站点的访问。2 r. e; E7 D0 n6 Q5 O
& `4 n# y# s" @" ]* X' Q, K. _' K3 lconn.asp(通常为数据库文件)里面加个随机数。。
7 Y& ~( ]" t& d9 D/ b: z; q, j, R! ^
例如有10个相同数据库,那么随机小于10的整数就OK。- ^# \4 X" E6 A: e3 ]- r1 x6 S8 y
+ Y8 L9 b' |. t/ d/ O, ?5 S& C+ Q
这样以前一个数据库的压力会分配给10个数据库。$ T/ B( U5 d3 i6 P _& i
( h+ [! @( h# o/ @虽然不一定平均。。(如果你算法不错,做到平均也不难)/ Y* n& E- N+ U! U
! I1 B4 V# h# p记得后台要有个克隆数据库的操作选项,当然手工也可以。6 m& L0 h! T0 F% O1 I! x- z* e
4 o7 \' y/ n- W6 X
OK。写完了。希望对各位程序员有点小小的作用。2 z/ n c9 a# y' i/ K
: ^; I, }2 C4 Y期望你们写出更优秀的程序来。谢谢。 |
|
|
|
|
|
|
|
|

- 帖子
- 4561
- 积分
- 4177
- 贡献
- 0
- 鲜花
- 2
- 臭蛋
- 0
- 来自
- JJJJJJJJJJJJJJJJJJJJJJJJJ
- 在线时间
- 4862 小时
- 注册时间
- 2005-8-18
|
沙发
发表于 2007-3-23 23:50
| 只看该作者
技术贴
/ L2 o3 X7 G5 O: y+ ^  |
|
|
|
|
|
|
|
|

- 帖子
- 19241
- 积分
- 16423
- 贡献
- 0
- 鲜花
- 3
- 臭蛋
- 6
- 来自
- 中国
- 在线时间
- 2681 小时
- 注册时间
- 2005-5-25
|
板凳
发表于 2007-3-23 23:53
| 只看该作者
|
|
|
|
|
|
|
|
 
- 帖子
- 23906
- 积分
- 5443
- 贡献
- 4
- 鲜花
- 2
- 臭蛋
- 3
- 在线时间
- 2666 小时
- 注册时间
- 2002-2-14
|
地板
发表于 2007-3-23 23:54
| 只看该作者
|
|
|
|
|
|
|
|

- 帖子
- 2307
- 积分
- 2306
- 贡献
- 2480
- 鲜花
- 0
- 臭蛋
- 0
- 在线时间
- 1654 小时
- 注册时间
- 2006-2-10

|
5楼
发表于 2007-3-23 23:59
| 只看该作者
|
|
|
|
|
|
|
|

- 帖子
- 3086
- 积分
- 2451
- 贡献
- 189
- 鲜花
- 10
- 臭蛋
- 2
- 在线时间
- 1816 小时
- 注册时间
- 2006-11-26
|
6楼
发表于 2007-3-24 00:01
| 只看该作者
|
|
|
|
|
|
|
|

- 帖子
- 637
- 积分
- 535
- 贡献
- 0
- 鲜花
- 0
- 臭蛋
- 0
- 来自
- 广东
- 在线时间
- 1502 小时
- 注册时间
- 2006-3-22
|
7楼
发表于 2007-3-24 00:02
| 只看该作者
|
|
|
|
|
|
|
|

- 帖子
- 2160
- 积分
- 2224
- 贡献
- 0
- 鲜花
- 0
- 臭蛋
- 0
- 在线时间
- 852 小时
- 注册时间
- 2005-9-5
|
8楼
发表于 2007-3-24 00:03
| 只看该作者
|
|
|
|
|
|
|
|

- 帖子
- 14946
- 积分
- 12555
- 贡献
- 9993
- 鲜花
- 8
- 臭蛋
- 2
- 来自
- 广州
- 在线时间
- 2908 小时
- 注册时间
- 2005-12-10
|
9楼
发表于 2007-3-24 00:04
| 只看该作者
|
|
|
|
|
|
|
|
 
- 帖子
- 6063
- 积分
- 5962
- 贡献
- 933
- 鲜花
- 2
- 臭蛋
- 2
- 在线时间
- 1453 小时
- 注册时间
- 2006-6-27
|
10楼
发表于 2007-3-24 00:05
| 只看该作者
|
|
|
|
|
|
|