当一个表小得多时,以编程方式连接表或使用SQL Join语句会更快吗?
更具体地说,如何从较小的表的hashmap<int, string>
中获取字符串并将其值设置为从较大的表返回的对象与预先加入数据库中的表相比较?这两个表的相对大小是否有所不同?
更新: 重新解释我的问题。抓取较大表的子集(我关心的5,000 - 20,000条记录)然后以编程方式加入较小的表(我会在本地缓存)执行SQL连接吗? SQL连接是应用于整个表还是仅应用于将返回的较大表的子集?
SQL Join语句:
SELECT id, description
FROM values v, descriptions d
WHERE v.descID=d.descID
AND v.something = thingICareAbout;
个人陈述:
SELECT id, descID
FROM values
WHERE v.something = thingICareAbout;
SELECT descID, description
FROM descriptions d;
程序化加入:
for (value : values){
value.setDescription(descriptions.get(value.getDescID))
}
其他信息: 较大的表中总共有800,000,000条记录,对应于较小的表中的3,000个值。大多数搜索返回5,000到20,000个结果。这是一个oracle DB。
答案 0 :(得分:8)
甚至不要这么想。数据库可以在本地执行至少尽可能快的事情,而无需通过网络发送所有数据。
答案 1 :(得分:7)
通常,像这样连接表是SQL数据库优化的那种操作,因此很有可能它们在这种操作上很难被击败。
如果您尝试“手动”进行连接,则两个表的相对大小可能会有所不同,因为您必须考虑额外的内存消耗,以便在进行处理时将更大的表数据保存在内存中。
虽然这个例子很容易做到,但通过自己进行连接,你也会失去一个内置的数据完整性检查,如果你让它进行连接,数据库会给你。
答案 2 :(得分:2)
可能SQL会更快地完成工作。根据我的理解,如果你在你的程序中执行它,那么它必须将数据库中的800,000,000条记录加载到你的应用程序的内存中,然后是小表的3,000条,然后匹配每条记录,丢弃几乎所有它们(你'只需要几千个结果)并显示给用户。
如果你将索引放在oracle中的右列(两个表中的descID)中,那么它就能够非常快速地找到加入记录,并加载你期望的5,000-20,000。
尽管如此,最简单的方法是测试两者并取数字!
答案 3 :(得分:1)
如果您在内存中加入,则需要下载800,000,000 + 3,000条记录。如果您在数据库中进行加入,则每次需要下载5,000 - 20,000个结果。哪个听起来更快?提示:如果您进行100,000次搜索,则第一个选项可能更快。