作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 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 专家,但我猜上面的查询需要在主列上应用模运算符之前将相同的数据加载到内存中。
这是好/坏/最好/最坏的方式吗?还有其他方法吗,请留言。
提前致谢!!!
最佳答案
如果您确实需要内存中的所有 60M 记录,select * from ...
是最快的方法。是的,这是全面扫描;没有办法。它是磁盘绑定(bind)的,因此多线程对您没有任何帮助。没有足够的可用内存(交换)会立即降低性能。需要大量时间才能扩展的数据结构也会影响性能。
打开任务管理器,看看占用了多少CPU;可能很少;如果没有,请分析您的代码或仅注释掉阅读循环以外的所有内容。或者它可能是 SQL 服务器和您的计算机之间的网络瓶颈。
也许 SQL Server 可以使用一些内部路径(例如 Oracle 可以)更快地将数据卸载到已知格式的外部转储文件。我会探索将表转储到文件中然后用 C# 解析该文件的可能性;它可能会更快,例如因为它不会干扰 SQL 服务器同时处理的其他查询。
关于java - 将长时间运行的 SQL 查询拆分为多个较小的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5933263/
我是一名优秀的程序员,十分优秀!