锁定老帖子 主题:关于性能优化
精华帖 (2) :: 良好帖 (10) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-11-19
ironsabre 写道 qdexception 写道 ouchxp 写道 新手避免性能问题,就让他按规范操作就可以.(不许循环里调用数据库....XXXX)
俺是新手,想问一下,如果不在循环里调用数据库,一般都是用什么解决方案? 俺以前写的一个功能,是每次遍历都要查询出几个表的相关数据,然后经过逻辑判断再插入和更新表。 像这样的需求应该怎么实现? 先查询出所有需要的数据分别放入不同集合类,再遍历集合类去做判断,把插入或更新的条件放入集合类X,再遍历X去做批量的update操作吗? 俺做逻辑判断所需要的数据挺多的,例如要先查A表,再查B表,再查C表,再查D表,而A,B,C,D表都超过百万甚至上千万数据。 像这种情况一般都怎么解决呢?望指教! 密集表查询比较适合用pl/sql来解决。 数据库性能高就直接存储过程处理 |
|
返回顶楼 | |
发表时间:2010-11-19
最后修改:2010-11-19
qdexception 写道 俺以前写的一个功能,是每次遍历都要查询出几个表的相关数据,然后经过逻辑判断再插入和更新表。 先查询出所有需要的数据分别放入不同集合类,再遍历集合类去做判断,把插入或更新的条件放入集合类X,再遍历X去做批量的update操作吗? 大批量复杂数据处理就写PL/SQL,不想放在PL/SQL里就用缓存.上内存数据库. 如果程序要求实时性不高,直接用select update语句可以做到批量的处理. 好好考虑下是否是数据库或程序逻辑设计不合理. |
|
返回顶楼 | |
发表时间:2010-12-04
喜欢javaeye
|
|
返回顶楼 | |
发表时间:2010-12-07
ouchxp 写道 qdexception 写道 俺以前写的一个功能,是每次遍历都要查询出几个表的相关数据,然后经过逻辑判断再插入和更新表。 先查询出所有需要的数据分别放入不同集合类,再遍历集合类去做判断,把插入或更新的条件放入集合类X,再遍历X去做批量的update操作吗? 大批量复杂数据处理就写PL/SQL,不想放在PL/SQL里就用缓存.上内存数据库. 如果程序要求实时性不高,直接用select update语句可以做到批量的处理. 好好考虑下是否是数据库或程序逻辑设计不合理. 前几天又有需求优化那个功能(其实就是一个比较复杂的业务算法) 那个功能的大概需求是:加载一个拓扑结构,根据N条规则进行分析后,将分析后的数据插入数据库。 用了2种方法实现: 1,一次性关联了3,4张千万数据量的表查出所有能用到的数据,之后进行相关操作后插入。 2,不论是拓扑还是关联的其他表,都是需要数据的时候现去查,之后进行相关操作后插入。 第一种方法中,那一条sql要运行接近2秒才能出结果,最后经测试,性能跟第二种差不多,对数据库压力稍微小点。 但是现在的需求是,要求在15分钟以内完成3000多次流程:运行我写的这个算法前要现进行文件的写入操作(约1千行的xml文件),之后还要读取这个文件。 后来开了20个线程同时跑,貌似还满足不了这个需求,搞的现在也头晕脑胀的。 你有碰到过类似的情况么? 这种情况一般都是怎么解决的? 有什么好的方案没? |
|
返回顶楼 | |
发表时间:2010-12-07
qdexception 写道 ouchxp 写道 qdexception 写道 俺以前写的一个功能,是每次遍历都要查询出几个表的相关数据,然后经过逻辑判断再插入和更新表。 先查询出所有需要的数据分别放入不同集合类,再遍历集合类去做判断,把插入或更新的条件放入集合类X,再遍历X去做批量的update操作吗? 大批量复杂数据处理就写PL/SQL,不想放在PL/SQL里就用缓存.上内存数据库. 如果程序要求实时性不高,直接用select update语句可以做到批量的处理. 好好考虑下是否是数据库或程序逻辑设计不合理. 前几天又有需求优化那个功能(其实就是一个比较复杂的业务算法) 那个功能的大概需求是:加载一个拓扑结构,根据N条规则进行分析后,将分析后的数据插入数据库。 用了2种方法实现: 1,一次性关联了3,4张千万数据量的表查出所有能用到的数据,之后进行相关操作后插入。 2,不论是拓扑还是关联的其他表,都是需要数据的时候现去查,之后进行相关操作后插入。 第一种方法中,那一条sql要运行接近2秒才能出结果,最后经测试,性能跟第二种差不多,对数据库压力稍微小点。 但是现在的需求是,要求在15分钟以内完成3000多次流程:运行我写的这个算法前要现进行文件的写入操作(约1千行的xml文件),之后还要读取这个文件。 后来开了20个线程同时跑,貌似还满足不了这个需求,搞的现在也头晕脑胀的。 你有碰到过类似的情况么? 这种情况一般都是怎么解决的? 有什么好的方案没? 1.流程中还有没有可以合并的余地.? 比如查寻一条sql 提出更多的数据 把巨量的数据变成内存中的数据. 整理变更后 批量更新. 2.不能合并的流程的话可以尝试使用更好的sql 很多人喜欢写200行带逻辑的sql 提高硬件也是一种办法. |
|
返回顶楼 | |
发表时间:2010-12-07
抛出异常的爱 写道 qdexception 写道 ouchxp 写道 qdexception 写道 俺以前写的一个功能,是每次遍历都要查询出几个表的相关数据,然后经过逻辑判断再插入和更新表。 先查询出所有需要的数据分别放入不同集合类,再遍历集合类去做判断,把插入或更新的条件放入集合类X,再遍历X去做批量的update操作吗? 大批量复杂数据处理就写PL/SQL,不想放在PL/SQL里就用缓存.上内存数据库. 如果程序要求实时性不高,直接用select update语句可以做到批量的处理. 好好考虑下是否是数据库或程序逻辑设计不合理. 前几天又有需求优化那个功能(其实就是一个比较复杂的业务算法) 那个功能的大概需求是:加载一个拓扑结构,根据N条规则进行分析后,将分析后的数据插入数据库。 用了2种方法实现: 1,一次性关联了3,4张千万数据量的表查出所有能用到的数据,之后进行相关操作后插入。 2,不论是拓扑还是关联的其他表,都是需要数据的时候现去查,之后进行相关操作后插入。 第一种方法中,那一条sql要运行接近2秒才能出结果,最后经测试,性能跟第二种差不多,对数据库压力稍微小点。 但是现在的需求是,要求在15分钟以内完成3000多次流程:运行我写的这个算法前要现进行文件的写入操作(约1千行的xml文件),之后还要读取这个文件。 后来开了20个线程同时跑,貌似还满足不了这个需求,搞的现在也头晕脑胀的。 你有碰到过类似的情况么? 这种情况一般都是怎么解决的? 有什么好的方案没? 1.流程中还有没有可以合并的余地.? 比如查寻一条sql 提出更多的数据 把巨量的数据变成内存中的数据. 整理变更后 批量更新. 2.不能合并的流程的话可以尝试使用更好的sql 很多人喜欢写200行带逻辑的sql 提高硬件也是一种办法. 1,现在可以用一条sql查出一次用的数据,但问题是3000多次要15分钟内执行完的话,只运行这条sql时间都跟不上。 2,现在只能想办法优化sql了,不知道千万级数据量的3表左连效果一般怎么实现比较快? |
|
返回顶楼 | |
发表时间:2010-12-07
qdexception 写道 抛出异常的爱 写道 qdexception 写道 ouchxp 写道 qdexception 写道 俺以前写的一个功能,是每次遍历都要查询出几个表的相关数据,然后经过逻辑判断再插入和更新表。 先查询出所有需要的数据分别放入不同集合类,再遍历集合类去做判断,把插入或更新的条件放入集合类X,再遍历X去做批量的update操作吗? 大批量复杂数据处理就写PL/SQL,不想放在PL/SQL里就用缓存.上内存数据库. 如果程序要求实时性不高,直接用select update语句可以做到批量的处理. 好好考虑下是否是数据库或程序逻辑设计不合理. 前几天又有需求优化那个功能(其实就是一个比较复杂的业务算法) 那个功能的大概需求是:加载一个拓扑结构,根据N条规则进行分析后,将分析后的数据插入数据库。 用了2种方法实现: 1,一次性关联了3,4张千万数据量的表查出所有能用到的数据,之后进行相关操作后插入。 2,不论是拓扑还是关联的其他表,都是需要数据的时候现去查,之后进行相关操作后插入。 第一种方法中,那一条sql要运行接近2秒才能出结果,最后经测试,性能跟第二种差不多,对数据库压力稍微小点。 但是现在的需求是,要求在15分钟以内完成3000多次流程:运行我写的这个算法前要现进行文件的写入操作(约1千行的xml文件),之后还要读取这个文件。 后来开了20个线程同时跑,貌似还满足不了这个需求,搞的现在也头晕脑胀的。 你有碰到过类似的情况么? 这种情况一般都是怎么解决的? 有什么好的方案没? 1.流程中还有没有可以合并的余地.? 比如查寻一条sql 提出更多的数据 把巨量的数据变成内存中的数据. 整理变更后 批量更新. 2.不能合并的流程的话可以尝试使用更好的sql 很多人喜欢写200行带逻辑的sql 提高硬件也是一种办法. 1,现在可以用一条sql查出一次用的数据,但问题是3000多次要15分钟内执行完的话,只运行这条sql时间都跟不上。 2,现在只能想办法优化sql了,不知道千万级数据量的3表左连效果一般怎么实现比较快? 预分析 将你需要的数据 预分析成少量的数量. 之后在少量数据中查找 |
|
返回顶楼 | |
发表时间:2010-12-07
预分析是用sql过滤某些结果么?
现在需要的数据量也并不大 一次运行也就一千条左右 但问题是要运行3000多遍 而且时间只给15分钟 |
|
返回顶楼 | |
发表时间:2010-12-07
qdexception 写道 预分析是用sql过滤某些结果么?
现在需要的数据量也并不大 一次运行也就一千条左右 但问题是要运行3000多遍 而且时间只给15分钟 为什么不能只运行一次把1K多条放到cache中去呢? |
|
返回顶楼 | |
发表时间:2010-12-30
ironsabre 写道 qianhd 写道 对于新手 写的时候动动脑子 别写出内存泄漏的代码 就谢天谢地了
有些人习惯性的爱写内存泄漏的代码 真不知道怎么想的 我觉得新手想要写出内存泄漏的代码是很难的,或者说你让他写一段内存泄漏的代码他都写不出来。要不你写一个试试? int [] i =new int[1000000000]; |
|
返回顶楼 | |