weixin_42301116 2009-04-01 17:34
浏览 382
已采纳

Oracle+for 循环10万数据,卡!

int totalCount = Convert.ToInt32(DBsource.ReturnID("SELECT count(UserEmail) CategoryID FROM tableName where isactive=1").ToString()); // [color=red]获取用户列表总行数 totalCount=100000[/color]
int Count = 0;
if (totalCount % 1000 == 0) /* 听说for 循环次数超过5000,就不能运行了。所以进行拆分,让循环
{ Count = totalCount / 1000; } 次数变为1000;
else
{
Count = totalCount / 1000;
Count = Count + 1;
}
int rowCount = 0;
for (int i = 0; i < Count; i++)[color=red] // 外循环控制循环几个1000;[/color] {
for (int j = 0; j < 1000; j++)[color=red] // 内循环空间循环1000次[/color] {
rowCount++;
[color=red]//得到用户列表为10万的其中一个用户[/color] string useremail = DBsource.ReturnUserEmail("select U.UserEmail from (select UserEmail,ROWNUM RN from tablename where isactive=1) U where RN=" + rowCount).ToString();
[color=red]//给查询出来的用户发信息[/color] mesg = ad.AddMessages(conn, ad.PlusNumber(conn, "select MAX(MessageID) from tablename"), this.txtTitle.Text, this.txtContent.Text, useremail, Session["adminname"].ToString(), DateTime.Now.ToString());
[color=red]//判断是进行到最后一个1000的 循环[/color] if (i == Count - 1)
{
if (rowCount == totalCount)[color=red] //如果等于总行数,循环完毕跳出循环[/color] { break; }
}
}
}
现在就是这个代码在程序运行时,直接就卡到那了,不能运行!
[b]问题补充:[/b]
谢谢您的回答, 准备采用批量从数据库取出用户列表。每次1500条! 使用OraclePreparedStatement 但是找不到这个类的引用啊? 请帮助
[b]问题补充:[/b]
我用的是。net ! 现在可以从数据库取出全部用户列表。效率也很快! 现在给用户发信息 就相当于往数据库-表插入10W 行数据! 我写了存储过程! 但是还是需要10分钟啊! 存储过程里面是一条一条的插入数据!
create or replace procedure addMsg
(
msgid number,
msgtitle varchar2,
msgcontent varchar2,
useremail user_list,
sender varchar2,
sendtime varchar2
)
as
begin
for x in 1..useremail.count loop
insert into T_Messages values(msgid,msgtitle,msgcontent,useremail(x),sender,0,sendtime);
end loop;
end;
/

  • 写回答

6条回答 默认 最新

  • shoes_2003 2009-04-01 22:06
    关注

    [code="java"]string useremail = DBsource.ReturnUserEmail("select U.UserEmail from (select UserEmail,ROWNUM RN from tablename where isactive=1) U where RN=" + rowCount).ToString();[/code]

    这个sql是需要优化的

    测试了一下这个sql在表数据为10w级别的时候每次取一条的需要花费0.1秒的时间。
    10万数据全取出来大概需要7天时间
    如果表数据更大比如1000w级别大概取一条需要3秒,10万数据大概就是1年了。

    [code="java"]string useremail = DBsource.ReturnUserEmail("select U.UserEmail from (select UserEmail,ROWNUM RN from tablename where isactive=1) U where RN >" + min + "RN <" + max ;[/code]

    max - min = 1000 ~ 2000之间,然后在结果集中循环插入给用户发信息。

    每次取1000 ~ 2000 条数据
    在表数据为10w级别的时候需要花费0.7 ~ 1.4秒的时间
    10万数据也就是1分多钟就可以取出来了。

    在表数据为10w级别的时候需要花费3 ~ 4秒的时间
    10万数据也就是5分多钟就可以取出来了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题