返回文章列表

資料函式庫檢視建立管理與應用

本文探討資料函式庫檢視的建立、管理與應用,包含一般檢視、安全檢視及物化檢視,並提供 SQL 語法範例與說明。從簡化複雜查詢、提升資料安全到隱藏底層資料表複雜性,闡述檢視的優勢與應用場景,並以圖表輔助說明,讓開發者有效運用檢視提升資料函式倉管理效率。

資料函式庫 SQL

資料函式庫檢視是根據 SQL 查詢結果建立的虛擬表格,簡化複雜查詢的同時,也能提升資料安全性。透過檢視,開發者可以控制資料的存取許可權,隱藏底層資料表的複雜結構,並根據不同使用者角色提供客製化資料檢視。安全檢視則更進一步,根據使用者身份或角色限制資料存取,有效保護敏感資訊。此外,物化檢視能將查詢結果儲存至實體表格,並自動更新,大幅提升查詢效能,適合用於頻繁存取的彙總資料。

檢視(View)的基本概念與應用

檢視(View)在資料函式倉管理系統中是一種虛擬的表格,它是根據 SQL 查詢結果所建立的。檢視可以簡化複雜的查詢,提供資料的安全性,並且使得資料函式庫設計更加模組化。

建立檢視

在 Snowflake 中,檢視的建立使用 CREATE VIEW 陳述式。檢視可以根據簡單的查詢,也可以包含複雜的查詢邏輯,如聯接(JOIN)、分組(GROUP BY)和篩選條件(WHERE、HAVING)等。

簡單檢視範例

CREATE VIEW person_vw (fname, lname, dob, eyes)
AS
SELECT p_first_name, p_last_name, p_date_of_birth, p_eyes
FROM person;

執行 DESCRIBE 命令可以檢視檢視的結構:

PUBLIC> DESCRIBE person_vw;
+
---
-
---
+
---
-
---
-
---
--+
---
-
---
-+
---
-
---
+
---
-
---
--+...
| name  | type        | kind   | null? | default |...
|
---
-
---
+
---
-
---
-
---
--+
---
-
---
-+
---
-
---
+
---
-
---
--+...
| FNAME | VARCHAR(50) | COLUMN | Y     | NULL    |...
| LNAME | VARCHAR(50) | COLUMN | Y     | NULL    |...
| DOB   | DATE        | COLUMN | Y     | NULL    |...
| EYES  | VARCHAR(10) | COLUMN | Y     | NULL    |...
+
---
-
---
+
---
-
---
-
---
--+
---
-
---
-+
---
-
---
+
---
-
---
--+...

複雜檢視範例

以下是一個結合多個表格、包含篩選條件和分組的檢視範例:

CREATE VIEW big_spenders_1998_vw
(custkey, cust_name, total_order_dollars)
AS
SELECT o_custkey, c.c_name, SUM(o_totalprice)
FROM orders AS o
INNER JOIN customer AS c
ON o.o_custkey = c.c_custkey
WHERE 1998 = DATE_PART(year, o.o_orderdate)
GROUP BY o.o_custkey, c.c_name
HAVING SUM(o.o_totalprice) >= 500000;

內容解密:

  1. CREATE VIEW 陳述式用於建立一個名為 big_spenders_1998_vw 的檢視。
  2. 該檢視包含三個欄位:custkeycust_nametotal_order_dollars
  3. 查詢根據 orderscustomer 兩個表格,透過 o_custkeyc_custkey 進行內聯接。
  4. WHERE 子句篩選出訂單日期為 1998 年的記錄。
  5. GROUP BY 子句按客戶鍵和客戶名稱進行分組。
  6. HAVING 子句進一步篩選出總訂單金額大於或等於 500,000 的客戶。

使用檢視

檢視可以像普通表格一樣在查詢中使用,包括聯接、子查詢和公用表表達式(CTE)等。

聯接檢視範例

SELECT p.fname, p.lname, e.empid
FROM person_vw AS p
INNER JOIN employee_vw AS e
ON e.emp_name = CONCAT(p.fname, ' ', p.lname);

內容解密:

  1. 該查詢聯接了 person_vwemployee_vw 兩個檢視。
  2. 聯接條件是員工名稱與人員姓名的拼接結果相匹配。
  3. 查詢結果包含人員的名字、姓氏和員工ID。

為什麼使用檢視?

檢視提供了多種好處,包括簡化複雜查詢、提高資料安全性和增強資料函式庫設計的模組化。

資料安全

透過檢視,可以限制使用者對敏感資料的存取。例如,可以建立一個檢視,該檢視只包含員工的薪資範圍,而不包含實際的薪資數字,從而對非授權使用者隱藏敏感資訊。

範例:建立員工薪資範圍檢視
  1. 首先,為 Employee 表新增一個 salary 欄位。
  2. 然後,更新員工的薪資資料。
  3. 建立一個新的檢視 employee_manager_vw,該檢視根據需要提供員工的薪資範圍。
ALTER TABLE employee ADD salary NUMBER(7,0);

UPDATE employee
SET salary = UNIFORM(50000, 200000, RANDOM());

CREATE VIEW employee_manager_vw
AS
SELECT empid, emp_name,
       CASE
           WHEN salary < 80000 THEN 'Low'
           WHEN salary BETWEEN 80000 AND 150000 THEN 'Medium'
           ELSE 'High'
       END AS salary_range
FROM employee;

內容解密:

  1. ALTER TABLE 陳述式為 employee 表增加了一個新的 salary 欄位。
  2. UPDATE 陳述式使用 UNIFORM 函式為每位員工生成一個隨機薪資。
  3. 新的檢視 employee_manager_vw 根據員工的薪資範圍提供了一個分類別欄位 salary_range

為什麼使用檢視(Views)?

在資料函式倉管理中,檢視是一種虛擬的表格,根據 SQL 查詢的結果集。檢視可以簡化複雜的查詢,提供資料的安全性,並且能夠根據不同的使用者角色提供不同的資料存取許可權。

建立和管理檢視

在前面的章節中,我們已經瞭解瞭如何建立檢視。例如,建立一個名為 employee_manager_vw 的檢視,用於顯示員工的基本資訊和薪水範圍:

CREATE VIEW employee_manager_vw
(empid, emp_name, mgr_empid, salary_range)
AS
SELECT empid, emp_name, mgr_empid,
CASE
    WHEN salary <= 75000 THEN 'Low'
    WHEN salary <= 125000 THEN 'Medium'
    ELSE 'High'
END AS salary_range
FROM employee;

內容解密:

  • CREATE VIEW 陳述式用於建立一個新的檢視。
  • employee_manager_vw 是檢視的名稱,後面括號內的欄位名稱對應於檢視將要顯示的欄位。
  • AS SELECT 子句定義了檢視的查詢邏輯,從 employee 表格中選取所需的欄位,並使用 CASE 陳述式計算 salary_range
  • salary_range 根據 salary 的值被分為 ‘Low’、‘Medium’ 和 ‘High’ 三個等級。

查詢 employee_manager_vw 檢視的結果如下:

+
---
-
---
+
---
-
---
-
---
-
---
-+
---
-
---
-
---
+
---
-
---
-
---
---
+
| EMPID | EMP_NAME       | MGR_EMPID | SALARY_RANGE |
|
---
-
---
+
---
-
---
-
---
-
---
-+
---
-
---
-
---
|
---
-
---
-
---
---
|
| 1001  | Bob Smith      | NULL      | Low          |
| 1002  | Susan Jackson  | 1001      | Medium       |
| 1003  | Greg Carpenter | 1001      | Medium       |
| 1004  | Robert Butler  | 1002      | Low          |
| 1005  | Kim Josephs    | 1003      | High         |
| 1006  | John Tyler     | 1004      | High         |
| 9999  | Tim Traveler   | 1006      | Low          |
| 1007  | John Sanford   | 1002      | Low          |
+
---
-
---
+
---
-
---
-
---
-
---
-+
---
-
---
-
---
+
---
-
---
-
---
---
+

安全檢視(Secure Views)

Snowflake 提供了一種特殊型別的檢視,稱為安全檢視,用於根據當前使用者或角色限制資料的存取。例如,我們可以建立一個名為 my_employees 的安全檢視,用於顯示當前使用者有權存取的員薪水訊:

CREATE SECURE VIEW my_employees AS
SELECT e.empid, e.emp_name, d.dept_name
FROM employee e
INNER JOIN empl_dept ed ON e.empid = ed.empid
INNER JOIN department d ON ed.dept_id = d.dept_id
WHERE d.auth_username = CURRENT_USER();

內容解密:

  • CREATE SECURE VIEW 陳述式用於建立一個安全檢視。
  • my_employees 是安全檢視的名稱。
  • 安全檢視的查詢邏輯與普通檢視類別似,但它根據 CURRENT_USER() 函式傳回的當前使用者名稱過濾資料。
  • 這確保了只有授權的使用者才能看到與其相關的資料。

查詢 my_employees 安全檢視的結果如下:

+
---
-
---
+
---
-
---
-
---
-
---
+
---
-
---
-
---
+
| EMPID | EMP_NAME      | DEPT_NAME |
|
---
-
---
+
---
-
---
-
---
-
---
+
---
-
---
-
---
|
| 1002  | Susan Jackson | FINANCE   |
| 1005  | Kim Josephs   | FINANCE   |
+
---
-
---
+
---
-
---
-
---
-
---
+
---
-
---
-
---
+

此範例展示瞭如何使用檢視和安全檢視來控制資料的存取許可權,從而提高資料的安全性。

圖表翻譯:

以下 Plantuml 圖表展示了員工、部門和安全檢視之間的關係:

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 圖表翻譯:

rectangle "empid" as node1
rectangle "dept_id" as node2
rectangle "auth_username" as node3
rectangle "access" as node4

node1 --> node2
node2 --> node3
node3 --> node4

@enduml

圖表翻譯: 此圖表展示了員工表格(Employee)與部門表格(Department)透過員工部門關聯表格(Empl_Dept)進行連線。安全檢視(My_Employees Secure View)根據當前使用者的授權使用者名稱(auth_username)限制對員薪水料的存取。只有當部門表格中的 auth_username 與當前使用者相符時,相關員工的資料才會出現在安全檢視中。

為何使用檢視(Views)?

在資料函式倉管理中,檢視是一種虛擬的表格,它根據查詢結果而建立。檢視可以簡化複雜的查詢,提供資料的安全性,並隱藏底層資料表的複雜性。

安全檢視(Secure Views)

安全檢視是一種特殊的檢視,它限制了對資料的存取,只有具有特定角色或使用者名稱的使用者才能存取檢視中的資料。例如,可以建立一個安全檢視 my_employees,它根據當前使用者的使用者名稱來顯示不同的資料。

create or replace secure view my_employees(
  empid,
  emp_name,
  dept_name
) as
select e.empid, e.emp_name, d.dept_name
from employee e
inner join empl_dept ed on e.empid = ed.empid
inner join department d on ed.dept_id = d.dept_id
where d.auth_username = current_user();

內容解密:

  1. create or replace secure view:建立或替換一個安全檢視。
  2. my_employees:檢視的名稱。
  3. empid, emp_name, dept_name:檢視中的欄位名稱。
  4. select 陳述式:定義了檢視中的資料來源和過濾條件。
  5. where d.auth_username = current_user():根據當前使用者的使用者名稱來過濾資料。

使用安全檢視可以限制對資料的存取,並且只有具有相同角色的使用者才能檢索檢視的定義。

資料聚合(Data Aggregation)

資料分析和報告通常需要聚合資料。與其提供使用者直接存取資料表,不如建立檢視來使資料看起來像是已經預先聚合好了。例如,可以建立一個檢視 yearly_part_sales_vw 來顯示每年的零件銷售資料。

create view yearly_part_sales_vw
as
with part_supply as (
  select p.p_partkey as partkey,
         p.p_name as part_name,
         sum(ps.ps_availqty) as avail_qty
  from part p
  inner join partsupp ps on p.p_partkey = ps.ps_partkey
  group by p.p_partkey, p.p_name
),
part_sales as (
  select date_part(year, o.o_orderdate) as order_year,
         li.l_partkey as partkey,
         count(*) as sales_qty,
         max(li.l_shipdate - o.o_orderdate) max_backlog_days
  from orders o
  inner join lineitem li on o.o_orderkey = li.l_orderkey
  group by date_part(year, o.o_orderdate), li.l_partkey
)
select p_sply.partkey,
       p_sply.part_name,
       p_sply.avail_qty,
       p_sale.order_year,
       p_sale.sales_qty,
       p_sale.max_backlog_days
from part_supply p_sply
inner join part_sales p_sale on p_sply.partkey = p_sale.partkey;

內容解密:

  1. create view:建立一個檢視。
  2. yearly_part_sales_vw:檢視的名稱。
  3. with 子句:定義了兩個臨時表 part_supplypart_sales
  4. part_supply:計算每個零件的可用數量。
  5. part_sales:計算每年的零件銷售數量和最大延遲天數。
  6. 最終的 select 陳述式:將 part_supplypart_sales 的結果合併起來。

使用這個檢視,使用者可以輕鬆地查詢每年的零件銷售資料。

物化檢視(Materialized Views)

物化檢視是一種特殊的檢視,它將查詢結果儲存在物理表中,並且會自動更新。建立物化檢視可以使用 create materialized view 陳述式。

create materialized view yearly_part_sales_vw
as
-- 與上述 yearly_part_sales_vw 檢視相同的查詢陳述式

內容解密:

  1. create materialized view:建立一個物化檢視。
  2. 物化檢視會將查詢結果儲存在物理表中,並且會自動更新。

使用物化檢視可以提高查詢效能,但是會佔用額外的儲存空間和計算資源。

隱藏複雜性(Hiding Complexity)

檢視還可以用來隱藏複雜的計算或資料關係。例如,可以建立一個檢視 order_calculation_vw 來計算訂單的總金額和銷售稅。

create view order_calculation_vw
as
select o.o_orderkey,
       sum((li.l_extendedprice * (1 - li.l_discount)) * li.l_quantity) order_total,
       sum((li.l_extendedprice * (1 - li.l_discount)) * li.l_quantity * li.l_tax) state_sales_tax
from orders o
inner join lineitem li on o.o_orderkey = li.l_orderkey
group by o.o_orderkey;

內容解密:

  1. create view:建立一個檢視。
  2. order_calculation_vw:檢視的名稱。
  3. select 陳述式:計算訂單的總金額和銷售稅。
  4. 使用了多個欄位和計算公式來得出最終結果。

使用這個檢視,業務部門可以輕鬆地查詢訂單的總金額和銷售稅,而無需瞭解底層的計算邏輯。