RAM查询与加入

时间:2017-06-11 17:07:41

标签: sql join

假设我们有3个表,CustomerSubscriptionNewspaper,其中Subscription是其他两个表之间的关系。如果我们想要某个人订阅的报纸名称,我们可以进行查询以获取所有Subscriptions的列表,生成一个名为allSubscription的数组,然后在RAM中搜索元组它包含客户的ID并检索报纸的ID列表。

有了这个,我们就可以得到所有报纸的清单。命名查询整个Newspaper表,获取allNewspaper数组,并在RAM中搜索包含我们知道该人已订阅的ID的元组。此方法是连接的模拟,但没有连接。

我们很早就知道数据库是针对此类查询进行优化的,我们不应该使用此方法。但是,我们需要为每个客户提供这样的名称呢?

在这种情况下,传统查询将连接3个表。但是,如果我们使用我刚才描述的RAM搜索,我们将有3个数组,allCustomersallSubscriptionsallNewspaper,其中总体上看起来比查询要便宜这三个表的连接。最后,我们得到了一些结果,例如:

ramSubs = {}
for c in allCustomers:
    ramSubs[c.id] = []
for s in allSubscriptions:
    ramSubs[s.customer_id].append(s.newspaper_id)
ramNews = {}    
for n in allNewspaper:
    ramNews[n.id] = n.name
for c in allCustomers:
    print c.name
    for c_id,n_id in ramSubs:
        print ramNews[n_id],

有了这样说,哪种方法更有建议和效率?

1 个答案:

答案 0 :(得分:0)

您所描述的是嵌套循环连接。所有数据库都必须实现嵌套循环连接以及各种其他方法。

如果您有三个"表",那么可能这些表存储在SQL引擎中。最好的方法是让SQL引擎处理数据,为它确定最佳算法。

如果你在内存中有三个数组的数据,那么你不是在谈论SQL引擎。您只是在谈论实现一种有效的算法 - 数据库设计人员一直关注这一点。 (也就是说,已知数据结构的定制算法优化了运行它的系统可能比数据库中运行的等效数据更快。)