3

当一张表小得多时,以编程方式连接表或使用 SQL Join 语句会更快吗?

更具体地说,如何从hashmap<int, string>较小的表中获取字符串并将其值设置为从较大表返回的对象与预先连接数据库中的表相比如何?两张桌子的相对大小有区别吗?

更新:改写我的问题。是否抓取较大表的子集(我关心的 5,000 - 20,000 条记录)然后以编程方式加入较小的表(我将在本地缓存)执行 SQL 连接?SQL 连接适用于整个表还是仅适用于将返回的较大表的子集?

SQL 连接语句:

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 个结果。这是一个甲骨文数据库。

4

4 回答 4

8

想都别想。数据库至少可以尽可能快地在本地执行操作,而无需通过网络传输所有数据。

于 2013-01-02T23:19:50.837 回答
7

一般来说,像这样的连接表是 SQL 数据库优化的那种操作,所以很有可能在这种操作上它们很难被击败。

如果您尝试“手动”进行连接,则两个表的相对大小可能会有所不同,因为您在处理时必须考虑额外的内存消耗以将更大的表数据保存在内存中。

虽然这个例子很容易做对,但如果你自己进行连接,你也会失去一个内置的数据完整性检查,如果你让它进行连接,数据库会给你。

于 2013-01-02T23:14:44.973 回答
2

可能 SQL 会更快地完成这项工作。据我了解,如果您在程序中执行此操作,则必须将数据库中的 800,000,000 条记录加载到应用程序的内存中,然后将 3,000 条用于小表,然后匹配每条记录,丢弃几乎所有记录(您只期望几千个结果)并显示给用户。

如果您在 oracle 中的正确列上放置索引(两个表中的 descID),那么它将能够非常快速地找到连接记录,并且只需加载您期望的 5,000-20,000。

话虽如此,但最简单的找出方法是测试两者并取数字!

于 2013-01-02T23:20:02.777 回答
1

如果在内存中加入,则需要下载 800,000,000 + 3,000 条记录。如果您在数据库中进行连接,则每次需要下载 5,000 - 20,000 个结果。哪个听起来更快?提示:如果您进行 100,000 次搜索,第一个选项可能会更快。

于 2013-01-02T23:30:07.350 回答