DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tino0914
今日帖子: 19
在线用户: 24
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 yuyujoke (yuyujoke) ▲▲▲▲△ -
普通会员
2015/11/26 15:43:26
标题:
关于内存表,求大神指点迷津! 浏览:1714
加入我的收藏
楼主: 业务中有一个循环要遍历整个数据表 , 表中有数据50万左右 , 逻辑如下 :

  sql := 'select * from db order by id asc'
query1.close;
query1.open(sql);

while not query1.Eof do
begin
  data1 := query1.FieldByName('data1').AsString;
  sql := 'select xxx from db where xxxxxx'
  query2.close;
  query2.open(sql);
  if query2.RecordCount > xxx then
  begin
    while not query2.Eof do
    begin
      xxx := query2.FieldByName('xx').AsString;
      xxx := query2.FieldByName('xx').AsString;
      .. ..
    end;
  end;

  sql := 'select xxxxxx from db where xxxxxxxxx'
  query2.close;
  query2.open(sql);
  if query2.RecordCount > xxx then
  begin
    while not query2.Eof do
    begin
      xxx := query2.FieldByName('xx').AsString;
      xxx := query2.FieldByName('xx').AsString;
      .. ..
    end;
  end;

  query1.next;
end;

也就是这个50万的循环中还有多个query.close / open 这样速度非常慢 , 字段该设索引的也都设了 , 计算一遍用了5个小时 。 。 。 。

  我现在尝试使用TFDMemTable , 以前没接触过内存表 , 我是这样用的 :

  sql := 'select * from db order by id asc'
query1.close;
query1.open(sql);
query1.FetchAll;
FDMemTable1.close;
FDMemTable1.data := query1.data;

while not query1.Eof do
begin
  data1 := query1.FieldByName('data1').AsString;
  FDMemTable1.Filtered := False;
  FDMemTable1.Filter := 'xxxxx';
  FDMemTable1.Filtered := True;
  if FDMemTable1.RecordCount > xxx then
  begin
    for I := 1 to 20 do
    begin
      xxx := FDMemTable1.FieldByName('xx').AsString;
      xxx := FDMemTable1.FieldByName('xx').AsString;
      .. ..
    end;
  end;

  FDMemTable1.Filtered := False;
  FDMemTable1.Filter := 'xxxxx';
  FDMemTable1.Filtered := True;
  if FDMemTable1.RecordCount > xxx then
  begin
    for I := 1 to 20 do
    begin
      xxx := FDMemTable1.FieldByName('xx').AsString;
      xxx := FDMemTable1.FieldByName('xx').AsString;
      .. ..
    end;
  end;

  query1.next;
end;

结果这样用了FDMemTable后,感觉还是很慢。。。。
我用的不对吗?该怎么使用FDMemTable 内存表呢?
我这样的业务需球该怎么提高运算速度呢???

大神啊大神啊大神啊救救我吧
----------------------------------------------
-
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2015/11/26 16:52:33
1楼: 用存储过程吧
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
作者:
男 qiuyan81 (苦恋树) ★☆☆☆☆ -
普通会员
2015/11/26 18:18:43
2楼: 这。。。光是50W的数据集循环就够呛了,你还得查询2次数据库。。
把循环写sql里面,返回有用的数据集。
----------------------------------------------
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2015/11/27 12:47:23
3楼: 别想多了,写个SP封装好逻辑调用就OK,50万行的处理时间应该在几秒以内是正常
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2015/11/27 15:15:42
4楼: 其实,楼主写了大堆的代码,
还是没写出逻辑来。
楼主写的,只不过是毫无意义的东西。

真正有意义的,楼主 都 ... 给省略了。

在这种情况下,最好的回答,就是写到 存储过程。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2015/11/27 19:17:38
5楼: 真要在程序中实现,用线程,一个线程取1万的数据运算.再将各线程结果合并.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2015/11/27 19:18:54
6楼: 内存表什么的,ClientDataset本身就是,瓶颈还是在从数据库载入数据的速度上.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 lps (lps) ★☆☆☆☆ -
盒子活跃会员
2015/11/28 11:01:59
7楼: 存储过程是唯一的方法,顺便说一下,程序中可以把参数传递给存储过程的

楼主这种方法,我以前曾经做过,只有不到2万的数据(实际是单机的CS,就是一个程序客户端,数据库为本机的sql server),反复这样操作,然后性能就一下子降低下来,要10多分钟才能反应过来。
所以,此路不通!
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS