【发布时间】:2011-05-09 06:22:06
【问题描述】:
我正在使用 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 条件来拆分查询,
上面的代码 sn-p 将查询拆分为 10 个并行运行的查询。这使用了 java 的 ExecutorCompletionService。
我不是 SQL 专家,但我猜上述查询需要先在内存中加载相同的数据,然后再在主列上应用模数运算符。
这是好/坏/最好/最坏的方式吗?有没有其他方法,请发帖。
提前致谢!!!
【问题讨论】:
-
我认为将整个数据加载到内存是个坏主意。您应该考虑使用存储过程!
-
@Sandy 我同意,但是程序将如何帮助减少时间,请您指导一下?
-
为什么需要加载所有记录?为什么需要几个小时?我会检查获取大小,并检查查询是如何执行的。
-
这个查询是用来获取记录缓存的吗?
-
@Kaj 我们正在内存数据库中构建,所以我需要内存中的整个表,根据数据库上的负载,加载需要 1.25-1.5 小时,您指的是 java / sql server 的获取大小
标签: java sql sql-server-2008 jdbc