VB+ACCESS多表查询 效率低的有关问题

VB+ACCESS多表查询 效率低的问题本帖最后由 bestofbest 于 2012-05-03 17:19:29 编辑使用过很多数据库,ACC

VB+ACCESS多表查询 效率低的问题
本帖最后由 bestofbest 于 2012-05-03 17:19:29 编辑 使用过很多数据库,ACCESS比较绿色,感觉很方便,一般用用非常好
最近要在ACCESS数据库里查询多个表里的数据,使用EXCEL的CopyFromRecordset方法来导出,大概是花费5到10分钟
我做实验的是一个2M大小的ACCESS数据库,10个表,每个表10-20个字段,这也太让人疯狂了

另外用EXCEL的QueryTables方法来导出,效果基本上没什么太大的区别(毕竟数据库才那么一点小),5到10分钟才完成,跟前面一种方法一样,在出结果之前,程序一直死在那里。。。

最后用最常规的方法:Rs.Open Sqlstr, oConn, 1, 3
悲剧了,半个小时过去了,没有任何反应

如果坚持使用ACCESS不换成SQL SERVER,有什么办法可以快速的查询?小数据库查询都这么慢,那我真正的数据库查询起来怕是要一个小时才有结果,这谁受得了呢?

人人有分,请多多支持
[最优解释]
SELECT RANDOMACC.BSC, RANDOMACC.Cell,100*CELTCHFP.TFCONGPGSM/(RANDOMACC.CNROCNT+RANDOMACC.RAACCFA+0.001)*(CLTCH.TCASSALL/(CLTCH.TASSALL+0.001)) as 无线接入性,100*CELTCHFP.TFCONGPGSM/(RANDOMACC.CNROCNT+RANDOMACC.RAACCFA+0.001) as SD分配成功率,100*CLSDCCH.CMSESTAB/(CLSDCCH.CCALLS-CLSDCCH.CCONGS+0.001) as SD接通率 
FROM 
(
(
(
(
(
(
(
(
  RANDOMACC 
  inner join CELTCHF   on RANDOMACC.CELL = CELTCHF.CELL
) inner join CELLGPRS  on RANDOMACC.Cell=CELLGPRS.Cell
) inner join IDLEUTCHF on RANDOMACC.Cell=IDLEUTCHF.Cell
) inner join CLTCHDRF  on RANDOMACC.Cell=CLTCHDRF.Cell
) inner join CELTCHH   on RANDOMACC.Cell=CELTCHH.Cell
) inner join CELTCHFP  on RANDOMACC.Cell=CELTCHFP.Cell
) inner join CLSDCCH   on RANDOMACC.Cell=CLSDCCH.Cell
) inner join CLTCH     on RANDOMACC.Cell=CLTCH.Cell
) inner join CLTCHDRH  on RANDOMACC.Cell=CLTCHDRH.Cell


给你改了一下,对不对自己检查一下
[其他解释]
方法有问题,Access查询速度是很快的,甚至比SQLserver还快,将你的代码发出来看看
[其他解释]
日常的一个表查询确实是飞快,2个表结合在一起查询也是非常快,我这次是查询了10个表,很慢:

SELECT RANDOMACC.BSC, RANDOMACC.Cell,100*CELTCHFP.TFCONGPGSM/(RANDOMACC.CNROCNT+RANDOMACC.RAACCFA+0.001)*(CLTCH.TCASSALL/(CLTCH.TASSALL+0.001)) as 无线接入性,100*CELTCHFP.TFCONGPGSM/(RANDOMACC.CNROCNT+RANDOMACC.RAACCFA+0.001) as SD分配成功率,100*CLSDCCH.CMSESTAB/(CLSDCCH.CCALLS-CLSDCCH.CCONGS+0.001) as SD接通率 FROM CELTCHFP,CELTCHH,CELTCHF,CLSDCCH,CLTCH,RANDOMACC,CLTCHDRF,CLTCHDRH,CELLGPRS,IDLEUTCHF Where RANDOMACC.CELL = CELTCHF.CELL AND RANDOMACC.Cell=CELTCHFP.Cell AND RANDOMACC.Cell=CELTCHH.Cell AND RANDOMACC.Cell=CLSDCCH.Cell AND RANDOMACC.Cell=CLTCH.Cell AND RANDOMACC.Cell=CLTCHDRF.Cell AND RANDOMACC.Cell=CLTCHDRH.Cell AND RANDOMACC.Cell=CELLGPRS.Cell AND RANDOMACC.Cell=IDLEUTCHF.Cell

我在SYBASE里用的几乎一模一样的查询语句(它还支持格式化结果的STR()函数,ACCESS不支持),非常快就有结果了
[其他解释]
FROM CELTCHFP,CELTCHH,CELTCHF,CLSDCCH,CLTCH,RANDOMACC,CLTCHDRF,CLTCHDRH,CELLGPRS,IDLEUTCHF

这样查询不慢才怪。
按照这样的查询,假设每个表有10条记录,那么按照“笛卡尔积”你这么10个表,就要先算出10^10条记录出来,然后再按你的条件进行筛选,能快吗?

使用内联查询:

FROM ((CELTCHFP inner join CELTCHH on RANDOMACC.CELL = CELTCHF.CELL)inner join CELTCHF on .... )
[其他解释]
要想使得速度快,被上述 on 中的等号使用的字段,应该设置索引
[其他解释]
真的是非常感谢,看来直接用别人的查询语句是不行的,SYBASE和SQL SERVER可以用的,在ACCESS里要换个方法