「分散式技術專題」常用的 SQL 運算元介紹

Hubble資料庫發表於2023-02-13

SQL 查詢的執行過程,就像工廠的加工流水線,層層遞進,最終得到想要的結果,而SQL運算元就好比其中的一道道工序。

本篇簡要介紹一下 SQL 執行計劃中,一些常見運算元的含義和邏輯。

1. indexscan 索引掃描

當資料表中建立了索引,並使用索引欄位進行查詢時,會進行索引掃描。

2. tablescan 順序表掃描

tablescan 負責從磁碟中以連續塊的形式從磁碟中讀取資料頁。
一般在 SQL 查詢中,有幾張表就要有幾個 tablescan 操作。在分散式資料庫中,同一張表的掃描,還會被分配到多個結點使用分散式的方式執行。

3. project 投影

投影操作,是從表中根據查詢欄位選擇相關的列。

SELECT
	cc_name,
	cc_class 
FROM
	call_center 
WHERE
	cc_class = 'large' 
LIMIT 10;

在這個查詢中,tablescan 操作會將 call_center 表的資料做全欄位讀取,project 操作負責篩選出 cc_name, cc_class 這兩個列。

4. filter 過濾

filter 會根據 where 條件中的篩選條件,篩選出符合的記錄。其中過濾條件也叫謂詞邏輯。
在兩表連線時,謂詞邏輯可以在 join 前執行,也可以在 join 後執行。因為 join 操作是做笛卡爾積,如果在 join 後執行謂詞邏輯,將大大增加計算的基數,所以一般的資料庫最佳化執行器都會將謂詞下推,讓謂詞邏輯在 join 操作前完成。
上述的 project 和 filter 運算元可以在資料表的列和行兩個維度對資料進行限定,大大縮小處理的資料量,降低資源消耗,是 SQL 最佳化時常用的方法。

5. exchange

在分散式資料庫中,tablescan 等操作是分散式進行的,而各個分支結點將結果彙總的過程就是 exchange 操作。
exchange 操作還可以細分為 LocalExchange 和 RemoteExchange。LocalExchange 即本地資料結果彙總,沒有網路 IO;而 RemoteExchange 是資料從不同的資料結點彙總到某一結點,需要網路傳輸。

6. join 連線

連線的本質是兩個表做笛卡爾積操作。

SELECT
        ctr_total_return 
FROM
        customer_total_return_t1 ctr1 
WHERE
        ctr1.ctr_total_return > (
        SELECT
                avg( ctr_total_return ) 
FROM
        customer_total_return_t2 ctr2
WHERE
        ctr1.ctr_store_sk = ctr2.ctr_store_sk );

在這個SQl中,先會對錶 customer_total_return_t2 進行讀取,並以 ctr_store_sk 為 key ,統計 avg(ctr_total_return) 然後 customer_total_return_t1 和 customer_total_return_t2 會做笛卡爾積,再進行條件過濾。

7. aggregation 聚合

對資料做分組聚合,統計分析。
一般會先在每個結點先做一次分組統計,exchange 資料匯合之後再做一次合併統計。

SELECT
      avg( ctr_total_return )
FROM
      customer_total_return_test
WHERE
      ctr_store_sk = 10;

上面這個查詢中只有一張表,由於是分散式執行,表雖然只掃描一次,但是會在多個資料結點進行掃描,所以 avg 函式會在每個結點先執行一次,exchange 彙總完後,會再進行一次 avg 操作。

8. values

SELECT
    1 + 1,  
DATE '2001-08-22',  
ARRAY [1, 2, 3];

有時 SQL 中資料不是從表中查詢出來的,而是給定的一個數字、字元或陣列,這時 values 操作會將這些識別符號轉化成具體的數值。

9. scalar 標量

根據策略,給定一個結果值。

SELECT CASE
                WHEN(
                        SELECT count(*)
                        FROM store_sales
                        WHERE ss_quantity BETWEEN 81 AND 100
                      ) > 18213
                THEN 1
                ELSE 2
        END AS bucket5
FROM reason
WHERE r_reason_sk = 1;

如 case when 中根據判斷條件計算結果時會使用。

10. markDistinct

SELECT
        avg( ss_sales_price ) AS B1_LP,
        count( DISTINCT ss_list_price ) AS B1_CNTD 
FROM
        store_sales;

distinct操作時,對資料的類別進行標識。

11. window 視窗

視窗函式是應用於視窗和分割槽的函式,可分為三類:排名函式,分析函式和聚合函式。

SELECT
        cs_call_center_sk, 
        sum(cs_ext_sales_price) OVER(
        PARTITION BY cs_sold_date_sk ) 
        AS revenueratio
FROM catalog_sales
LIMIT 100;

視窗函式計算時,會根據 partition by 後的欄位進行分割槽,然後進行統計分析或排名。

12. sort 排序

SELECT
        ss.ca_county,
        ss.d_year
FROM
        ss, sc
WHERE
        ss.ca_county = sc.ca_county
ORDER BY
        ss.d_year;

排序操作。

13. topN

即 limit 操作,獲取限定的記錄條數。

14. output

向客戶端輸出結果。


以上為常用的SQL運算元介紹, 「分散式技術專題」是國產資料庫   Hubble  團隊精心整編,專題會持續更新,歡迎大家保持關注。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026685/viewspace-2934940/,如需轉載,請註明出處,否則將追究法律責任。

相關文章