SQL:如何在JDBC程序中优化3个嵌套选择?

时间:2014-04-26 21:02:15

标签: java sql select jdbc nested

在Scala程序中,我使用JDBC从SQL DB(Hive)中的20行的简单表中获取数据。 表格包含用户评分的电影标题,其中包含以下格式的行:

user_id,movie_title,评分,日期。

我首先启动枚举用户的JDBC游标。接下来,使用JDBC光标2,为每个用户找到他评价的电影片名。接下来,JDBC游标3,对于当前用户评定的每个标题,我找到其他用户也评价了这个标题。结果,我获得了一组用户,其中每个用户与启动该组的第一个用户评定至少一个类似的标题。我需要在数据集中存在所有这些组。

因此,要按电影对用户进行分组,我会做3个嵌套选择请求,伪代码:

1) select distinct user_id  
     2) for each user_id: 
         select distinct movie_title  //select all movies that user saw
            3) for each movie_title:
                select distinct user_id  //select all users who saw this movie

在一个有20行的本地表上,这些嵌套查询工作26分钟!程序在一分钟后首先返回user_id

假设真正的应用程序必须处理10 ^ 6个用户,在这种情况下有没有办法优化3个嵌套选择?

1 个答案:

答案 0 :(得分:0)

没有看到确切的代码很难评估为什么这么长时间。鉴于你有20行你必须有一些根本错误的东西。

然而,作为一般建议,我建议回顾一下解决方案,并考虑是否无法使用单个SQL查询运行(而不是运行数百个查询),这将使您受益于索引并为您节省大量的网络流量。

假设您有以下表Movies(user_id: NUMERIC, movie_title: VARCHAR(50), rating: NUMERIC, date: DATE)尝试沿着这些行运行某些内容(尚未对其进行测试,因此可能需要稍微调整一下):

SELECT DISTINCT m1.user_id, m2.user_id
FROM Movies m1, Movies m2
WHERE m1.user_id != m2.user_id
  AND m1.movie_title = m2.movie_title

获得结果后,您可以先在{/ 1}}中将它们分组到Java / Scala代码中,然后将其加载到类似Multimap的数据结构中。