怎么解决ACCESS数据库太大造成运行慢的问题

我的是ASP的网站,ACCESS数据库有100多M,运行很慢,请问怎么解决?以前好看见过BBS论坛有拆分表的方法,不知道代码该怎么写?还有,一个数据库里一个表拆分成两个表... 我的是ASP的网站,ACCESS数据库有100多M,运行很慢,请问怎么解决?
以前好看见过BBS论坛有拆分表的方法,不知道代码该怎么写?
还有,一个数据库里一个表拆分成两个表;还是一个数据库分成两个ACCESS数据库,最好是后者,可以减少数据库大小。
例子:sql="select Id,Name,Price from Produc where online=1"
“Produc”这个表有好几万条记录,怎么拆分啊?万分感谢!
展开
 我来答
dong_1984dd
推荐于2017-10-11 · TA获得超过1.1万个赞
知道小有建树答主
回答量:1070
采纳率:100%
帮助的人:226万
展开全部

1.时候在使用Access文件的时候,随着增删改的不断的连续,会导致文件越来越大。即使手动删除或者使用delete语句删除了大量的数据记录,会发现文件的大小依然没有减掉,而且随着你再往里写数据,又会增大。
2.产生这个现象的原因跟Access本身的机制有关,具体也不清楚,好像是有什么历史记录还是什么存储碎片。ACCESS数据库在进行删除操作后,并不从该数据库中把数据清除掉,而是删除其索引相关的东西,虽然显示不出来,但是那些东西还是在文件中存在的,所以会引起ACCESS数据库文件越来越大。即使是我们不通过代码来访问access文件,而只是通过用户界面访问,随着文件的增大,也会带来一系列的问题。其症状包括:对象可能打开得更慢,查询可能比正常情况下运行的时间更长,各种典型操作通常似乎也需要使用更长时间。更何况如果在网站应用中,采用的是Access作为数据库的话,这里就有了性能上的问题。文件越来越大,会影响查询的速度,而且ACCESS是采用独占方式工作的,也就是说一次只能一个进程打开这个数据库执行操作,如果是多个用户的话就要"排队"了,所以ACCESS数据库如果变为很大的话,执行一个查询时间就会变长,而进程"排队"的等待时间也就会变得很久,专业型的数据库就不同,可以同时接收多个并发的访问,可以采用SQL数据库或其它大型并发数很强的数据库。

3.但是很多时候我们是需要Access文件,往不同的地方拷贝的,比如说,一个Server上生成了一个Access文件,需要拷贝到另外的Server上,而且Server间如果网速不是很好的话,会需要很长的时间来传输这个文件。所以这时候我们希望这个文件在内容不变的前提下,越小越好。所以我们可以去除这个Access的冗余信息。

4.Office Access本身就有这种功能,我们可以通过菜单找到这个工具,然后单击这个图标手动压缩。

5.执行以下这几句代码就可以了。
首先引用C:\Program Files\Common Files\System\ado\msadox.dll,该DLL包含ADOX命名空间; 
接着引用C:\Program Files\Common Files\System\ado\msjro.dll,该DLL包含JRO命名空间 
注意:如,导入dll不成功,手动把com组件 导入为 .net组件,在用vs.net工具导入 

///压缩修复ACCESS数据库,mdbPath为数据库绝对路径
        public void Compact(string mdbPath)
        {
            if (!File.Exists(mdbPath)) //检查数据库是否已存在
            {
                throw new Exception("目标数据库不存在,无法压缩");
            }
            //声明临时数据库的名称
            string temp = DateTime.Now.Year.ToString();
            temp += DateTime.Now.Month.ToString();
            temp += DateTime.Now.Day.ToString();
            temp += DateTime.Now.Hour.ToString();
            temp += DateTime.Now.Minute.ToString();
            temp += DateTime.Now.Second.ToString() + ".bak";
            temp = mdbPath.Substring(0, mdbPath.LastIndexOf("\\") + 1) + temp;
            //定义临时数据库的连接字符串
            string temp2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + temp;
            //定义目标数据库的连接字符串
            string mdbPath2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + mdbPath + ";Jet OLEDB:Database Password=l1epc2";
            //创建一个JetEngineClass对象的实例
            JetEngineClass jt = new JetEngineClass();
            //使用JetEngineClass对象的CompactDatabase方法压缩修复数据库
            jt.CompactDatabase(mdbPath2, temp2);
            //拷贝临时数据库到目标数据库(覆盖)
            File.Copy(temp, mdbPath, true);
            //最后删除临时数据库
            File.Delete(temp);
        }

百度网友2c1f62e
2009-09-27 · TA获得超过1330个赞
知道小有建树答主
回答量:471
采纳率:0%
帮助的人:403万
展开全部
最好改成MSSQL数据库或MySql数据库。
几万条记录不管怎么拆分,速度也不会太快。

如果坚持要用Access,建议你在主要字段和经常查询的字段上建立索引,并定期删除长期历史数据,可以有部分改善。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
畅销图书网
推荐于2017-10-04
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
一个数据库分成两个ACCESS数据库比较好,数据库连接的地方可以做两个嘛,很简单的
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式