繁体   English   中英

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

[英]Splitting Long running SQL query into multiple smaller queries

我正在使用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记录,请select * from ...是最快的方法。 是的,这是一次完整的扫描; 没有办法解决。 这是磁盘绑定所以多线程不会帮助你。 没有足够的可用内存(交换)会立即终止性能。 需要大量时间扩展的数据结构也会妨碍性能。

打开任务管理器,看看花了多少CPU; 可能很少; 如果没有,请对您的代码进行概要分析,或只是注释除了读取循环之外 或者它可能是SQL服务器和您的机器之间网络的瓶颈。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM