2017-06-11 41 views
0

假設我們有3個表,Customer,Subscription, Newspaper,其中Subscription是另外兩個之間的關係。如果我們想要某個人訂閱的報紙名稱,我們可以進行查詢以獲取所有Subscriptions的列表,生成一個名爲allSubscription的數組,然後在RAM中搜索包含客戶ID的元組並檢索報紙列表IDS。有了這些,我們可以得到所有報紙名字的列表,查詢整個Newspaper表,獲得allNewspaper數組,並在RAM中搜索包含我們知道該人訂閱的ID的元組。這種方法是對連接的模擬,但沒有連接。RAM查詢vs加入

我們很早就知道數據庫針對這種查詢進行了優化,我們不應該使用這種方法。但是,對於每個客戶我們需要這種名稱的情況呢?

在這種情況下,傳統查詢將連接3個表。但是,如果我們使用剛描述的RAM搜索,我們將有3個數組,allCustomers,allSubscriptions,allNewspaper,其中似乎總共比查詢三個表的連接更便宜。最後,我們從結果一些維權,比如,說:

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], 

隨着中說,這得諫和高效?

+0

這不是SQL - 那爲什麼是SQL標記? –

+0

我的數據庫比你的RAM大。它也更快,主要是因爲它不需要獲取所有記錄。 – wildplasser

回答

0

你所描述的是一個嵌套循環連接。所有數據庫都必須實現嵌套循環連接以及其他各種方法。

如果你有三個「表」,那麼大概這些都存儲在一個SQL引擎中。最好的方法是讓SQL引擎處理數據,爲其確定最佳算法。

如果你有內存中的三個數組的數據,那麼你不是在談論一個SQL引擎。你只是在談論實現一個高效的算法 - 數據庫設計師一直關注的問題。 (也就是說,針對已知數據結構的定製算法針對運行該系統的系統進行了優化,可能會比在數據庫中運行的系統更快)。

+0

也許我沒有清楚。是的,他們是SQL表,我沒有他們作爲RAM陣列,但我可以得到這樣的數組與三個「小」的查詢,而不是一個嵌套連接。 –