0 0

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

int totalCount = Convert.ToInt32(DBsource.ReturnID("SELECT count(UserEmail) CategoryID FROM tableName where isactive=1").ToString());  // 获取用户列表总行数 totalCount=100000
            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++) // 外循环控制循环几个1000;            {
                for (int j = 0; j < 1000; j++) // 内循环空间循环1000次                {
                    rowCount++;
                    //得到用户列表为10万的其中一个用户                    string useremail = DBsource.ReturnUserEmail("select U.UserEmail from (select UserEmail,ROWNUM RN from tablename where isactive=1) U where RN=" + rowCount).ToString();
                    //给查询出来的用户发信息                    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());
                    //判断是进行到最后一个1000的 循环                    if (i == Count - 1)
                    {
                        if (rowCount == totalCount) //如果等于总行数,循环完毕跳出循环                        { break; }
                    }
                }
            }
    现在就是这个代码在程序运行时,直接就卡到那了,不能运行!
问题补充:
  谢谢您的回答, 准备采用批量从数据库取出用户列表。每次1500条! 使用OraclePreparedStatement  但是找不到这个类的引用啊? 请帮助
问题补充:
我用的是。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;
/
2009年4月01日 17:34

6个答案 按时间排序 按投票排序

0 0

采纳的答案

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


这个sql是需要优化的

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

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


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

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

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

2009年4月01日 22:06
0 0

10w数据10分钟的搬迁时间应该可以接受了

2009年4月02日 22:03
0 0

这速度太恐怖了,有没有配置查询优化器呢?

2009年4月02日 18:51
0 0

还是用PrepareStatment吧,这可是oracle的sql优化的关键。建议楼主了解一下oracle的内存管理方面的知识。

2009年4月02日 09:00
0 0

另一次操作10万数据,用存储过程可能更好

2009年4月01日 22:11
0 0

晕 sql 少写了一个 and

另不建议用拼串的方式,用PrepareStatment在数据量大的时候会更快

2009年4月01日 22:08

相关推荐

    oracle10gpl.rar

    3. **流程控制**:包括IF-THEN-ELSE、CASE语句进行条件判断,以及WHILE、FOR循环进行迭代。 4. **集合类型**:PL/SQL提供VARRAYs(固定大小数组)、NESTED TABLES(嵌套表)和INDEX BY TABLES(索引表)等集合类型...

    精通Oracle.10g.PLSQL编程

    使用游标 9.1 显式游标 9.2 参数游标 9.3 使用游标更新或删除数据 9.4 游标FOR循环 9.5 使用游标变量 9.6 使用CURSOR表达式 9.7 习题 第10章 处理例外 10.1 例外简介 10.2 ...

    Oracle9iPLSQL

    3. **控制结构**:PLSQL提供了循环(FOR、WHILE)、条件语句(IF-THEN-ELSIF-ELSE)、CASE表达式等,使得能够进行条件判断和流程控制。 4. **异常处理**:PLSQL中的异常处理机制允许捕获和处理运行时错误,通过...

    GP开发文档Oracle开发文档

    而当达到10万个以上时,性能将显著降低。 - **索引使用**: 不推荐建立索引,包括但不限于普通索引、唯一索引、主键等。 - **临时表管理**: 使用后的临时表应及时删除,以避免占用不必要的资源。 - **分区表策略**: ...

    10万字总结java面试题和答案

    - **流程控制**:掌握if条件语句、switch选择语句、for、while和do-while循环结构。 2. **类与对象**: - **类与对象的概念**:学习如何定义类,创建和使用对象。 - **封装**:理解隐藏实现细节,提供公共接口的...

    学习之数据库实验报告.pdf

    5. 为员工加薪10%,从最低工资开始,但不超过50万,展示了条件判断和计算操作。 6. 基于`DEPT`表返回的部门号,查询`EMP`表中的雇员信息,这里使用了带参数的游标。 7. 统计`EMP`表中工资大于3000的记录数,并为这些...

    SQL性能优化

     如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A&gt;2与A&gt;=3的效果就有很大的区别了,因为A&gt;2时ORACLE会先找出为2的记录索引再进行比较,而A&gt;=3时...

    整理后java开发全套达内学习笔记(含练习)

    ORACLE_SID=oral10g\ --变局部变量 export ORACLE_SID --变全局变量 unset ORACLE_SID --卸载环境变量 ORACLE_HOME=... --安装路径;直接用一句语句也可以,如下 export ORACLE_HOME=/oracledata/.../bin: ...

    经典SQL语句大全

    17、说明:随机取出10条数据 select top 10 * from tablename order by newid() 18、说明:随机选择记录 select newid() 19、说明:删除重复记录 1),delete from tablename where id not in (select max(id) from ...

    数据库操作语句大全(sql)

    17、说明:随机取出10条数据 select top 10 * from tablename order by newid() 18、说明:随机选择记录 select newid() 19、说明:删除重复记录 1),delete from tablename where id not in (select max(id) from ...

    万国模

    3. 控制结构:包括条件语句(if...else、switch)、循环语句(for、while、do...while、foreach)以及跳转语句(break、continue)。 4. 函数:PHP支持自定义函数,也有内置函数供开发者使用。 5. 类和对象:PHP5...

    最新Java面试宝典pdf版

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...

    MySQL实现类似于connect_by_isleaf的功能MySQL方法或存储过程

    然而,对于300万行的数据,这两种方法都可能面临性能问题。为了提高效率,可以考虑以下优化策略: 1. **索引优化**:在`tid`和`pid`字段上创建索引,以加速查询。 2. **批量处理**:分批处理数据,而不是一次性处理...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    3.2.3 for循环 74 3.2.4 while循环 75 3.2.5 break、continue 77 3.3 重点复习 78 3.4 课后练习 79 chapter4 认识对象 83 4.1 类与对象 84 4.1.1 定义类 84 4.1.2 使用标准类 87 4.1.3 对象指定与...

    Java面试宝典-经典

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...

    Java面试宝典2012新版

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43...

    java面试宝典2012

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 42 57、介绍Collection框架的结构 47 58、Collection框架中实现比较要实现什么接口 47 ...

    java面试题大全(2012版)

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...

Global site tag (gtag.js) - Google Analytics