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;
/
[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分多钟就可以取出来了。
晕 sql 少写了一个 and
另不建议用拼串的方式,用PrepareStatment在数据量大的时候会更快
另一次操作10万数据,用存储过程可能更好
还是用PrepareStatment吧,这可是oracle的sql优化的关键。建议楼主了解一下oracle的内存管理方面的知识。
这速度太恐怖了,有没有配置查询优化器呢?
10w数据10分钟的搬迁时间应该可以接受了