关于如何提升数据库的效率的问题 大家可以讨论看看

ziplj 2009-08-24 07:48:28
先说场景:
数据库中的一张表中有200W条数据 原始数据
现在 我要将数据库中的原始数据处理 然后分发到几个表中间去

我的实现方法
连接数据库之后

for(int i = 0 ; i < 2000000 ; i++)
{
//组织好结构体
MYSTRUCt Struct = MakeStruct(); //将数据库中的一条记录组织成结构体
DispatchDate(Struct); //处理数据 分发至各个表
}


请问 有没有办法能够提高效率 ??
能否实现集中查询 将Struct存储到数组中

我的查询代码如下就是大量的PutCollect() 这个过程有没有办法提升效率??
...全文
95 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
在程序方面,也应考滤SQL语句来实现!
例如:你把NAME='XX'的分发到表X中;
insert into x select * from table where NAME='XX';

//这样的处理,都交给数据库服务器来处理!数据库服务器,对表的索引建立要健壮!

如果按楼主的方法来处理,分析一下:
一,要从数据库里取数出来,而且是一条一条的记录取。
二,然后是把数据传到客户端内存处理。
三,在然后是经过加工后在传到数据库进行处理。

以上只是建意,不正确的地方,请拍砖!
ziplj 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tttyd 的回复:]
引用 9 楼 ziplj 的回复:
多线程    忘了...这个确实可以大量提示性能  谢谢提示...

对于操作同一个数据库,如果不是并发的数据库,使用多线程并不能提高什么性能。
不过,如果数据库操作比多多的话,还是要避免在主线程中操作数据库。
另外MFC中有指针数组,CPtrArray,指针链表CPtrList可以使用。
[/Quote]

情景可能没说清楚 我的程序里面主要是提取数据 一般的自然数据里面都有大量的废数据 因此 主要集中在逻辑判断方面 因此 多线程应该可以大量的提升性能 理论上应该可以
MoXiaoRab 2009-08-24
  • 打赏
  • 举报
回复
LS没看清楚。不是开多线程去数据库里面取数据库,而是单线程一个个取完了,然后多线程处理这些取出来的数据
雪影 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ziplj 的回复:]
多线程    忘了...这个确实可以大量提示性能  谢谢提示...
[/Quote]
对于操作同一个数据库,如果不是并发的数据库,使用多线程并不能提高什么性能。
不过,如果数据库操作比多多的话,还是要避免在主线程中操作数据库。
另外MFC中有指针数组,CPtrArray,指针链表CPtrList可以使用。
ziplj 2009-08-24
  • 打赏
  • 举报
回复
多线程 忘了...这个确实可以大量提示性能 谢谢提示...
MoXiaoRab 2009-08-24
  • 打赏
  • 举报
回复
for(int i = 0 ; i < 2000000 ; i++)
{
//组织好结构体
MYSTRUCt Struct = MakeStruct(); //将数据库中的一条记录组织成结构体
DispatchDate(Struct); //处理数据 分发至各个表
}


这样不好,做的太死

MYSTRUCt *Struct=NULL
for(int i = 0 ; i < 2000000 ; i++)
{
//组织好结构体
MYSTRUCt *Struct2=new MYSTRUCT();
Struct->next=Struct2;
p=Struct2; //p用来指示当前位置

}


先串成个链表,最后一起进行

你这样一条进来判断一条不好,我串成一根链表,逻辑判断和派发可以从2端同时开始,你的效率不就提升了一倍吗?
ziplj 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tr0j4n 的回复:]
你是怎么分发的?
一条进来分发一条?
[/Quote]
一次进来一条数据


[Quote=引用 6 楼 tr0j4n 的回复:]
DispatchDate这个派发函数中如果有逻辑操作的话,为什么不放到SQL的存储过程里做呢?这样可以提升效率,取出来的记录数量就少了很多
[/Quote]
暂时先不考虑存储过程 这个主要是用程序做的 存储过程我就可以去数据库专区问了
MoXiaoRab 2009-08-24
  • 打赏
  • 举报
回复
DispatchDate这个派发函数中如果有逻辑操作的话,为什么不放到SQL的存储过程里做呢?这样可以提升效率,取出来的记录数量就少了很多
MoXiaoRab 2009-08-24
  • 打赏
  • 举报
回复
你是怎么分发的?
一条进来分发一条?
ziplj 2009-08-24
  • 打赏
  • 举报
回复
有没有办法一次能取多条记录 快速存储到一个结构体数组里面
尽量减少大表(200W数据)的读取应该可以提高程序的效率
ziplj 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tttyd 的回复:]
先看看这便文章,如何提高数据库效率
http://blog.csdn.net/wncnke/archive/2009/05/05/4150545.aspx
我觉得主要也就是从这便文章所说的几个因素下手。

我觉得关键在于尽量避免引起全表扫描


[/Quote]
看了一下 都是SQL语句方面的 我感觉现在性能的提升应该主要在程序方面 责任应该还没到数据库上...
我现在的程序太慢了
雪影 2009-08-24
  • 打赏
  • 举报
回复
另外,使用PutCollect语句并不会影响什么效率
雪影 2009-08-24
  • 打赏
  • 举报
回复
先看看这便文章,如何提高数据库效率
http://blog.csdn.net/wncnke/archive/2009/05/05/4150545.aspx
我觉得主要也就是从这便文章所说的几个因素下手。

我觉得关键在于尽量避免引起全表扫描

4,011

社区成员

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

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