我正在使用SQL Server 2008和Java 6 / Spring jdbc.我们有一张记录数量约为6000万的桌子.我们需要将整个表加载到内存中,但是在此表上触发select *需要数小时才能完成.所以我分裂查询如下String query = select...
我正在使用SQL Server 2008和Java 6 / Spring jdbc.
我们有一张记录数量约为6000万的桌子.
我们需要将整个表加载到内存中,但是在此表上触发select *需要数小时才能完成.
所以我分裂查询如下
String query = " select * from TABLE where " ;
for(int i =0;i<10;i++){
StringBuilder builder = new StringBuilder(query).append(" (sk_table_id % 10) =").append(i);
service.submit(new ParallelCacheBuilder(builder.toString(),namedParameters,jdbcTemplate));
}
基本上,我通过在主键列上添加where条件来拆分查询,
上面的代码片段将查询拆分为10个并行运行的查询.这使用java的ExecutorCompletionService.
我不是SQL专家,但我猜上面的查询需要在主列上applyinh modulo operator之前在内存中加载相同的数据.
这是好/坏/最好/最糟糕的方式?还有其他方法,请发帖.
提前致谢!!!
解决方法:
如果确实需要内存中的所有60M记录,请选择* from …是最快的方法.是的,这是一次完整的扫描;没有办法解决.这是磁盘绑定所以多线程不会帮助你.没有足够的可用内存(交换)会立即终止性能.需要大量时间扩展的数据结构也会妨碍性能.
打开任务管理器,看看花了多少CPU;可能很少;如果没有,请对您的代码进行概要分析,或只是注释除了读取循环之外或者它可能是SQL服务器和您的机器之间网络的瓶颈.
也许SQL Server可以使用一些内部路径(例如Oracle可以)将数据更快地卸载到已知格式的外部转储文件中.我将探讨将表转储到文件中然后使用C#解析该文件的可能性;它可能更快,例如因为它不会干扰SQL服务器同时提供的其他查询.
本文标题为:java – 将长时间运行的SQL查询拆分为多个较小的查询
基础教程推荐
- Java基础之String类使用与字符串比较 2023-04-23
- springboot如何使用thymeleaf完成页面缓存 2022-12-27
- 一篇文章带你搞懂Java线程池实现原理 2023-07-01
- mybatis plus乐观锁及实现详解 2022-11-16
- 一文详解Java中流程控制语句 2023-06-06
- 利用Spring框架为自己的校园卡充值(推荐) 2023-06-06
- Java子线程调用RequestContextHolder.getRequestAttributes()方法问题详解 2023-06-01
- Spring JdbcTemplate执行数据库操作详解 2023-06-16
- springboot自定义starter方法及注解实例 2023-03-31
- Spring Retry重试框架的使用讲解 2023-06-30