存储结果集以供以后获取

3 java mysql sql sql-server oracle

我有一些运行了很长时间(20-30分钟)的查询.如果同时启动大量查询,则会快速耗尽连接池.

是否有可能来包装长时间运行的查询到语句(程序),将通用的查询结果存储到一个临时表,terminanting连接,并fetchin(投票)结果以后的需求呢?

编辑:优化查询和数据结构,像"检查您的索引和执行计划"这样的提示对我不起作用.我正在寻找一种方法来存储通用结果集的[也许]字节表示,以便以后进行检索.

Pis*_*3.0 6

首先,20-30分钟是一个非常长的查询时间 - 你确定你没有错过查询的任何索引吗?检查您的执行计划 - 您可以通过良好的索引获得巨大的性能提升.

在MySQL中,你可以做到

INSERT INTO `cached_result_table` (
    SELECT your_query_here
)
Run Code Online (Sandbox Code Playgroud)

(当然,cached_result_table需要具有与SELECT返回完全相同的列结构,否则您将收到错误).

然后,您可以查询这些缓存的结果(而不是原始表),并且只是不时运行上述查询 - 更新cached_result_table.

当然,查询最初需要至少运行一次,这需要你提到的20-30分钟.我建议在请求数据之前预先填充缓存表,并保留一些锁定机制以防止更新查询同时运行多次.伪代码:

init:
insert select your_big_query

work:
if your_big_query cached table is empty or nearing expiration:
  refresh in the background:
     check flag to see if there's another "refresh" process running
     if yes
       end // don't run two your_big_queries at the same time
     else 
       set flag
       re-run your_big_query, save to cached table
       clear flag
serve data to clients always from cached table
Run Code Online (Sandbox Code Playgroud)