将长时间运行的 SQL 查询拆分为多个较小的查询

blo*_*lob 5 java sql jdbc sql-server-2008

我正在使用 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));
        }
Run Code Online (Sandbox Code Playgroud)

基本上,我通过在主键列上添加 where 条件来拆分查询,

上面的代码片段将查询拆分为 10 个并行运行的查询。这使用了 java 的ExecutorCompletionService

我不是 SQL 专家,但我想上面的查询需要在主列上应用模运算符之前在内存中加载相同的数据。

这是好/坏/最好/最差的方式吗?还有其他方法吗,欢迎留言。

提前致谢!!!

900*_*000 1

如果确实需要将所有60M记录存入内存,select * from ...是最快的方法。是的,这是全面扫描;没有办法。它受磁盘限制,因此多线程对您没有任何帮助。没有足够的可用内存(交换)会立即降低性能。需要大量时间来扩展的数据结构也会影响性能。

打开任务管理器,查看CPU占用情况;可能很少;如果没有,请分析您的代码或仅注释掉除读取循环之外的所有内容。或者它可能是 SQL 服务器和您的计算机之间的网络瓶颈。

也许SQL Server 可以使用一些内部路径更快地将数据卸载到已知格式的外部转储文件(例如Oracle 可以)。我会探索将表转储到文件中然后使用 C# 解析该文件的可能性;它可能会更快,例如因为它不会干扰 SQL 服务器同时提供的其他查询。