1. 程式人生 > >跨庫資料表的運算

跨庫資料表的運算

  1. 簡單合併(FROM)

    所謂跨庫資料表,是指邏輯上同一張資料表被分別儲存在不同資料庫中。其原因有可能是因為資料量太大,放在一個數據庫難以處理,也可能在業務上就需要將生產庫和歷史庫分開。而不同的資料庫,可能只是部署在不同的機器上的同種資料庫,也可能是連型別都不同的資料庫系統。

    在面對跨庫資料表,特別是資料庫型別都不相同的情況時,資料庫自帶的工具往往就力所不及了,一般都需要尋找能夠很好地支援多資料來源型別的第三方工具,而集算器,可以說是其中的佼佼者了。下面,我們就針對幾種常見的跨庫混合運算情況詳細討論一下:

    跨庫運算,簡單粗暴的思路就是把散佈在各個庫裡的邏輯上相同的資料表合併成一個表,然後在這一個表上進行運算。

    例如,在兩個資料庫 HSQL 和 MYSQL 中,分別儲存了一張學生成績表,兩者各自儲存了一部分學生資訊,如下圖所示: 在這裡插入圖片描述

在這裡插入圖片描述

利用集算器,我們可以很容易地將這兩個結構相同的表合併為一個表,集算器的 SPL 指令碼如下:

A B
=connect(“org.hsqldb.jdbcDriver”,“jdbc:hsqldb:hsql://127.0.0.1/demo?user=sa”) =connect(“com.mysql.jdbc.Driver”,“jdbc:mysql://127.0.0.1:3306/demo?user=root&password=password”)
=A1.query(“select * from 學生成績表”) =B1.query(“select * from 學生成績表”)

=A2|B2

A1、A2 和 B1、B2 分別讀取了兩個庫裡的學生成績表,而 A3 用一種簡單直觀的方式就把兩個表合併了。

這種方式實際上是把兩個表都讀入了記憶體,分別生成了集算器的序表物件,然後利用序表的運算“|”完成了合併。可能有的同學會問:如果我的資料量比較大,無法全部讀入記憶體怎麼辦?沒關係,專為處理大資料而生的集算器,決不會被這麼簡單的小問題難住。我們可以使用遊標,同樣可以實現表的快速拼接:

A B
=A1.cursor(“select * from 學生成績表”) =B1.cursor(“select * from 學生成績表”)
=[A2, B2] .conjx()

A2、B2 分別用遊標開啟兩個庫裡的學生成績表,A3 則使用 conjx() 函式將這兩個遊標合併,形成了一個新的可以同時訪問兩個表的遊標。

對應於 SQL,這種簡單合併好比只是完成了 from 工作,讓結構相同的跨庫表的資料“縱向”拼接成了一個可以訪問的序表或者遊標,而實際運算中,還會涉及過濾 (where/having)、分組聚合 (group+sum/count/avg/max/min)、連線 (join+on)、去重 (distinct)、排序 (order)、取部分資料 (limit+offset),等等操作,下面我們就將對這些運算一一展開討論。

當然,我們在處理這些運算的需求時,不能只是簡單的實現功能,我們還需要考慮實現的效率和效能,因此原則上,我們會盡量利用資料庫的計算能力,而集算器主要負責混合運算。不過,有時也需要由集算器負責幾乎所有的運算,資料庫僅僅負責儲存資料。

由於表格不易複製,詳情請閱讀原文