IBM Netezza SQL 翻譯指南
IBM Netezza 資料倉儲技術專為與 Netezza 專屬的 SQL 語法搭配使用而設計。Netezza SQL 以 Postgres 7.2 為基礎,針對 Netezza 撰寫的 SQL 指令碼無法直接在 BigQuery 資料倉儲中使用,因為 SQL 方言不同。
本文詳述 Netezza 和 BigQuery 在下列領域的 SQL 語法相似與相異之處:
- 資料類型
- SQL 語言元素
- 查詢語法
- 資料操縱語言 (DML)
- 資料定義語言 (DDL)
- 預存程序
- 函式
您也可以使用批次 SQL 翻譯大量遷移 SQL 指令碼,或使用互動式 SQL 翻譯翻譯臨時查詢。這兩項工具的預先發布版都支援 IBM Netezza SQL/NZPLSQL。
資料類型
Netezza | BigQuery | 附註 |
---|---|---|
INTEGER/INT/INT4 |
INT64 |
|
SMALLINT/INT2 |
INT64 |
|
BYTEINT/INT1 |
INT64 |
|
BIGINT/INT8 |
INT64 |
|
DECIMAL
|
NUMERIC
|
Netezza 中的 DECIMAL 資料類型是 NUMERIC 資料類型的別名。 |
NUMERIC
|
NUMERIC
INT64 |
|
NUMERIC(p,s)
|
NUMERIC
|
BigQuery 中的 NUMERIC 類型不會強制執行自訂位數或比例界限 (限制),這與 Netezza 不同。BigQuery 的小數點後位數固定為 9 位,而 Netezza 則允許自訂設定。在 Netezza 中,精確度 p 可介於 1 至 38 之間,而比例 s 則介於 0 至精確度之間。 |
FLOAT(p) |
FLOAT64 |
|
REAL/FLOAT(6) |
FLOAT64 |
|
DOUBLE PRECISION/FLOAT(14) |
FLOAT64 |
|
CHAR/CHARACTER
|
STRING
|
BigQuery 中的 STRING 類型為變數長度,不需要手動設定字元長度上限,這與 Netezza CHARACTER 和 VARCHAR 類型不同。CHAR(n) 中 n 的預設值為 1。字串大小上限為 64,000 個字元。 |
VARCHAR
|
STRING
|
BigQuery 中的 STRING 類型為變數長度,不需要手動設定字元長度上限,這與 Netezza CHARACTER 和 VARCHAR 類型不同。字串大小上限為 64,000 個字元。 |
NCHAR
|
STRING
|
BigQuery 中的 STRING 型別會儲存為變數長度 UTF-8 編碼的 Unicode。長度上限為 16,000 個字元。 |
NVARCHAR
|
STRING
|
BigQuery 中的 STRING 類型會儲存為變數長度的 UTF-8 編碼 Unicode。長度上限為 16,000 個字元。 |
VARBINARY |
BYTES |
|
ST_GEOMETRY |
GEOGRAPHY |
|
BOOLEAN/BOOL
|
BOOL
|
BigQuery 中的 BOOL 類型只能接受 TRUE/FALSE ,不像 Netezza 中的 BOOL 類型可以接受各種值,例如 0/1 、yes/no 、true/false,
on/off 。 |
DATE |
DATE |
|
TIME |
TIME |
|
TIMETZ/TIME WITH TIME ZONE
|
TIME
|
Netezza 會以 UTC 格式儲存 TIME 資料類型,並允許您使用 WITH TIME
ZONE 語法傳遞與 UTC 的時差。BigQuery 中的 TIME 資料類型代表時間,與任何日期或時區無關。 |
TIMESTAMP
|
DATETIME
|
Netezza TIMESTAMP 類型不含時區,與 BigQuery DATETIME 類型相同。 |
ARRAY
|
Netezza 中沒有陣列資料型別。陣列型別會改為儲存在 varchar 欄位中。 |
時間戳記和日期類型格式設定
如要進一步瞭解 Netezza SQL 使用的日期類型格式,請參閱 Netezza 日期時間範本模式文件。如要進一步瞭解日期時間函式,請參閱 Netezza 日期/時間函式說明文件。
將日期類型格式化元素從 Netezza 轉換為 GoogleSQL 時,請特別注意 TIMESTAMP
和 DATETIME
之間的時區差異,如下表所示:
Netezza | BigQuery |
---|---|
CURRENT_TIMESTAMP CURRENT_TIME Netezza 中的 TIME 可能有不同的時區資訊,這些資訊是使用 WITH TIME ZONE 語法定義。
|
如有可能,請使用格式正確的 CURRENT_TIMESTAMP 函式。不過,輸出格式不一定會顯示 UTC 時區 (在內部,BigQuery 沒有時區)。bq 指令列工具和Google Cloud 控制台中的 DATETIME 物件會使用 T 分隔符號,根據 RFC 3339 格式化。不過,在 Python 和 Java JDBC 中,空格會做為分隔符。使用明確的 FORMAT_DATETIME 函式,正確定義日期格式。否則,系統會明確轉換為字串,例如:CAST(CURRENT_DATETIME() AS STRING) 這也會傳回空格分隔符。 |
CURRENT_DATE |
CURRENT_DATE |
CURRENT_DATE-3
|
BigQuery 不支援算術資料運算。請改用 DATE_ADD 函式。 |
SELECT
陳述式
一般來說,Netezza SELECT
陳述式與 BigQuery 相容。下表列出例外狀況:
Netezza | BigQuery |
---|---|
不含 FROM 子句的 SELECT 陳述式 |
支援下列特殊情況:
|
SELECT (subquery) AS flag, CASE WHEN flag = 1 THEN ... |
在 BigQuery 中,資料欄無法參照在同一查詢中定義的其他資料欄輸出內容。您必須複製邏輯,或將邏輯移至巢狀查詢。 選項 1 SELECT (subquery) AS flag, CASE WHEN (subquery) = 1 THEN ... 選項 2 SELECT q.*, CASE WHEN flag = 1 THEN ... FROM ( SELECT (subquery) AS flag, ... ) AS q |
比較運算子
Netezza | BigQuery | 說明 |
---|---|---|
exp = exp2 |
exp = exp2 |
等於 |
exp <= exp2 |
exp <= exp2 |
小於或等於 |
exp < exp2 |
exp < exp2 |
小於 |
exp <> exp2 exp != exp2 |
exp <> exp2 exp != exp2 |
不等於 |
exp >= exp2
|
exp >= exp2
|
大於或等於 |
exp > exp2 |
exp > exp2 |
大於 |
內建 SQL 函式
Netezza | BigQuery | 說明 |
---|---|---|
CURRENT_DATE
|
CURRENT_DATE
|
取得目前日期 (年、月和日)。 |
CURRENT_TIME
|
CURRENT_TIME
|
取得目前時間 (含分數)。 |
CURRENT_TIMESTAMP
|
CURRENT_TIMESTAMP
|
取得目前系統日期和時間,精確度為整秒。 |
NOW
|
CURRENT_TIMESTAMP
|
取得目前的系統日期和時間,精確到最接近的整秒。 |
COALESCE(exp, 0)
|
COALESCE(exp, 0)
|
將 NULL 替換為零。 |
NVL(exp, 0)
|
IFNULL(exp, 0)
|
將 NULL 替換為零。 |
EXTRACT(DOY FROM
timestamp_expression)
|
EXTRACT(DAYOFYEAR FROM
timestamp_expression)
|
傳回自年初算起的天數。 |
ADD_MONTHS(date_expr,
num_expr) |
DATE_ADD(date,
INTERVAL k MONTH) |
在日期中新增月份。 |
DURATION_ADD(date,
k) |
DATE_ADD(date,
INTERVAL k DAY) |
對日期執行加法運算。 |
DURATION_SUBTRACT(date,
k) |
DATE_SUB(date,
INTERVAL k DAY) |
對日期執行減法運算。 |
str1 || str2 |
CONCAT(str1,
str2) |
串連字串。 |
函式
本節將比較 Netezza 和 BigQuery 函式。
匯總函式
分析函式
日期和時間函式
字串函式
數學函式
Netezza | BigQuery |
---|---|
ABS |
ABS |
ACOS |
ACOS |
ACOSH |
|
ASIN |
ASIN |
ASINH |
|
ATAN |
ATAN |
ATAN2 |
ATAN2 |
ATANH |
|
CEIL DCEIL |
CEIL
|
CEILING |
|
COS |
COS |
COSH |
|
COT |
COT |
DEGREES |
|
DIV |
|
EXP |
EXP |
FLOOR DFLOOR |
FLOOR
|
GREATEST |
GREATEST |
IEEE_DIVIDE |
|
IS_INF |
|
IS_NAN |
|
LEAST |
LEAST |
LN |
LN |
LOG |
LOG |
LOG10 |
|
MOD |
MOD |
NULLIF (expr, 0) |
|
PI |
ACOS (-1) |
POW FPOW |
POWER POW |
RADIANS |
|
RANDOM |
RAND |
ROUND |
ROUND |
SAFE_DIVIDE |
|
SETSEED |
|
SIGN |
SIGN |
SIN |
SIN |
SINH |
|
SQRT NUMERIC_SQRT |
SQRT
|
TAN |
TAN |
TANH |
|
TRUNC |
TRUNC |
IFNULL (expr, 0) |
DML 語法
本節將比較 Netezza 和 BigQuery 的 DML 語法。
INSERT
陳述式
Netezza | BigQuery |
---|---|
INSERT INTO table VALUES (...); |
INSERT INTO table (...) VALUES (...); Netezza 提供 DEFAULT 關鍵字和其他欄限制,在 BigQuery 中,只有在提供所有資料欄時,才能在 INSERT 陳述式中省略資料欄名稱。 |
INSERT INTO table (...) VALUES (...); INSERT INTO table (...) VALUES (...); |
INSERT INTO table VALUES (), (); BigQuery 會強制執行 DML 配額,限制您每天可執行的 DML 陳述式數量。如要充分運用配額,請考慮下列方法:
|
BigQuery 中的 DML 指令碼與 Netezza 中的對等陳述式相比,一致性語意略有不同。另請注意,BigQuery 除了 NOT
NULL
以外,不提供其他限制。
如要瞭解快照隔離、工作階段和交易處理的相關資訊,請參閱一致性保證和交易隔離。
UPDATE
陳述式
在 Netezza 中,WHERE
子句為選用,但在 BigQuery 中則為必要。
Netezza | BigQuery |
---|---|
UPDATE tbl SET tbl.col1=val1; |
如未使用 WHERE 子句,則不支援此語法。
使用 WHERE true 子句更新所有資料列。 |
UPDATE A SET y = B.y, z = B.z + 1 FROM B WHERE A.x = B.x AND A.y IS NULL; |
UPDATE A SET y = B.y, z = B.z + 1 FROM B WHERE A.x = B.x AND A.y IS NULL; |
UPDATE A alias SET x = x + 1 WHERE f(x) IN (0, 1) |
UPDATE A SET x = x + 1 WHERE f(x) IN (0, 1); |
UPDATE A SET z = B.z FROM B WHERE A.x = B.x AND A.y = B.y |
UPDATE A SET z = B.z FROM B WHERE A.x = B.x AND A.y = B.y; |
如需範例,請參閱 UPDATE
範例。
由於有 DML 配額,建議您使用較大的 MERGE
陳述式,不要使用多個單一 UPDATE
和 INSERT
陳述式。BigQuery 中的 DML 指令碼與 Netezza 中對應的陳述式相比,一致性語意略有不同。如要瞭解快照隔離、工作階段和交易處理的相關資訊,請參閱一致性保證和交易隔離。
DELETE
和 TRUNCATE
陳述式
DELETE
和 TRUNCATE
陳述式都能從資料表移除資料列,且不會影響資料表結構定義或索引。TRUNCATE
陳述式的效果與 DELETE
陳述式相同,但對於大型資料表,TRUNCATE
陳述式的速度遠快於 DELETE
陳述式。Netezza 支援 TRUNCATE
陳述式,但 BigQuery 不支援。不過,您可以在 Netezza 和 BigQuery 中使用 DELETE
陳述式。
在 BigQuery 中,DELETE
陳述式必須有 WHERE
子句。
在 Netezza 中,WHERE
子句為選用項目。如果未指定 WHERE
子句,系統會刪除 Netezza 資料表中的所有資料列。
Netezza | BigQuery | 說明 |
---|---|---|
BEGIN; LOCK TABLE A IN EXCLUSIVE MODE; DELETE FROM A; INSERT INTO A SELECT * FROM B; COMMIT; |
以查詢輸出內容取代資料表內容,等同於一筆交易。您可以透過query
或複製 (cp )
作業執行這項操作。bq query \ bq cp \ |
以查詢結果取代表格內容。 |
DELETE FROM database.table |
DELETE FROM table WHERE TRUE; |
在 Netezza 中,執行刪除陳述式時,系統不會實際刪除資料列,只會標示為刪除。稍後執行 GROOM TABLE 或 nzreclaim 指令,即可移除標示為待刪除的資料列,並回收對應的磁碟空間。 |
GROOM
TABLE |
Netezza 會使用 GROOM TABLE 指令,移除標示為要刪除的資料列,藉此回收磁碟空間。 |
MERGE
陳述式
每個目標列的 MERGE
陳述式最多只能比對一個來源列。BigQuery 中的 DML 指令碼與 Netezza 中的對等陳述式相比,一致性語意略有不同。如要瞭解快照隔離、工作階段和交易處理的相關資訊,請參閱一致性保證和交易隔離。如需範例,請參閱 BigQuery MERGE
範例和 Netezza MERGE
範例。
DDL 語法
本節將比較 Netezza 和 BigQuery 的 DDL 語法。
CREATE TABLE
陳述式
Netezza | BigQuery | 說明 |
---|---|---|
TEMP TEMPORARY
|
有了 BigQuery 的 DDL 支援,您就能從查詢結果建立資料表,並在建立時指定到期時間。舉例來說,如要設定三天的時間範圍,請輸入:CREATE TABLE
'my-project.public_dump.vtemp' OPTIONS (expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 3 DAY)) |
建立資料表, 暫時用於工作階段。 |
ZONE MAPS
|
不支援。 | 快速搜尋WHERE 條件。 |
DISTRIBUTE ON
|
PARTITION BY
|
分區。
這不是直接翻譯,DISTRIBUTE ON 會在節點之間共用資料 (通常使用專屬金鑰,確保資料平均分配),而 PARTITION BY 則會將資料修剪為區隔。 |
ORGANIZE ON
|
CLUSTER BY
|
Netezza 和 BigQuery 最多都支援四個叢集索引鍵。Netezza 叢集基本資料表 (CBT) 會為每個叢集資料欄提供相同的優先順序。BigQuery 會優先處理資料表叢集的第一個資料欄,接著是第二個資料欄,依此類推。 |
ROW SECURITY |
Authorized View |
資料列層級安全性。 |
CONSTRAINT |
不支援 | 檢查限制。 |
DROP
陳述式
Netezza | BigQuery | 說明 |
---|---|---|
DROP TABLE |
DROP TABLE |
|
DROP DATABASE |
DROP DATABASE |
|
DROP VIEW |
DROP VIEW |
資料欄選項和屬性
Netezza | BigQuery | 說明 |
---|---|---|
NULL NOT NULL
|
NULLABLE REQUIRED
|
指定資料欄是否可包含 NULL 值。 |
REFERENCES
|
不支援 | 指定資料欄限制。 |
UNIQUE
|
不支援 | 資料欄中的每個值都必須不重複。 |
DEFAULT
|
不支援 | 資料欄中所有值的預設值。 |
臨時資料表
Netezza 支援在工作階段期間存在的TEMPORARY
資料表。
如要在 BigQuery 中建立臨時資料表,請按照下列步驟操作:
- 建立存留時間較短的資料集 (例如 12 小時)。
在資料集中建立臨時資料表,資料表名稱前置字元為
temp
。舉例來說,如要建立一小時後過期的資料表,請執行下列操作:CREATE TABLE temp.name (col1, col2, ...) OPTIONS(expiration_timestamp = TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR));
從臨時表開始讀取及寫入資料。
您也可以個別移除重複項目,以便找出下游系統中的錯誤。
請注意,BigQuery 不支援 DEFAULT
和 IDENTITY
(序列) 資料欄。
程序化 SQL 陳述式
Netezza 使用 NZPLSQL 指令碼語言處理預存程序。NZPLSQL 是以 Postgres 的 PL/pgSQL 語言為基礎。本節說明如何將 Netezza 儲存程序、函式和觸發程序中使用的程序式 SQL 陳述式,轉換為 BigQuery 適用的陳述式。
CREATE PROCEDURE
陳述式
Netezza 和 BigQuery 都支援使用 CREATE PROCEDURE
陳述式建立預存程序。詳情請參閱「使用 SQL 預存程序」。
變數宣告和指派
Netezza | BigQuery | 說明 |
---|---|---|
DECLARE var
datatype(len) [DEFAULT
value]; |
DECLARE
|
宣告變數。 |
SET var = value; |
SET |
為變數指派值。 |
例外狀況處理常式
Netezza 支援例外狀況處理常式,可針對特定錯誤狀況觸發。BigQuery 不支援條件處理常式。
Netezza | BigQuery | 說明 |
---|---|---|
EXCEPTION
|
不支援 | 宣告一般錯誤的 SQL 例外狀況處理常式。 |
動態 SQL 陳述式
Netezza 支援預存程序內的動態 SQL 查詢。 BigQuery 不支援動態 SQL 陳述式。
Netezza | BigQuery | 說明 |
---|---|---|
EXECUTE IMMEDIATE sql_str; |
EXECUTE IMMEDIATE sql_str; |
執行動態 SQL。 |
控制流程陳述式
Netezza | BigQuery | 說明 |
---|---|---|
IF THEN ELSE STATEMENT IF conditionTHEN ... ELSE ... END IF; |
IF conditionTHEN ... ELSE ... END IF;
|
有條件地執行。 |
疊代控制FOR var AS SELECT ... DO stmts END FOR; FOR var AS cur CURSOR FOR SELECT ... DO stmts END FOR; |
不支援 | 逐一查看資料列集合。 |
疊代控制LOOP stmts END LOOP; |
LOOP sql_statement_list END LOOP; |
迴圈陳述式區塊。 |
EXIT WHEN |
BREAK |
結束程序。 |
WHILE *condition* LOOP
|
WHILE conditionDO ... END WHILE |
執行陳述式迴圈,直到 while 條件失敗為止。 |
其他陳述式和程序語言元素
Netezza | BigQuery | 說明 |
---|---|---|
CALL proc(param,...) |
不支援 | 執行程序。 |
EXEC proc(param,...) |
不支援 | 執行程序。 |
EXECUTE proc(param,...) |
不支援 | 執行程序。 |
多陳述式和多行 SQL 陳述式
Netezza 和 BigQuery 都支援交易 (工作階段),因此支援以半形分號分隔的陳述式,這些陳述式會一併執行。詳情請參閱「多重陳述式交易」。
其他 SQL 陳述式
Netezza | BigQuery | 說明 |
---|---|---|
GENERATE
STATISTICS
|
為目前資料庫中的所有資料表產生統計資料。 | |
GENERATE
STATISTICS ON
table_name |
為特定資料表產生統計資料。 | |
GENERATE
STATISTICS ON
table_name(col1,col4)
|
您可以選擇使用統計函式 (例如 MIN, MAX, AVG, 等)、使用使用者介面,或是使用 Cloud Data Loss Prevention API。 |
為資料表中的特定資料欄產生統計資料。 |
GENERATE
STATISTICS ON
table_name |
APPROX_COUNT_DISTINCT(col) |
顯示資料欄的不重複值數量。 |
INSERT INTO
table_name |
INSERT INTO
table_name |
插入資料列。 |
LOCK TABLE
table_name FOR
EXCLUSIVE; |
不支援 | 鎖定資料列。 |
SET SESSION
CHARACTERISTICS AS
TRANSACTION ISOLATION
LEVEL ...
|
BigQuery 一律使用快照隔離。詳情請參閱「一致性保證和交易隔離」。 | 定義交易隔離等級。 |
BEGIN TRANSACTION END TRANSACTION COMMIT |
BigQuery 一律使用快照隔離。詳情請參閱「一致性保證和交易隔離」。 | 定義多重陳述式要求的交易界線。 |
EXPLAIN ...
|
不支援。查詢計畫和時間軸中的類似功能 | 顯示 SELECT 陳述式的查詢計畫。 |
使用者檢視畫面
中繼資料 系統檢視畫面中繼資料 |
SELECT * EXCEPT(is_typed) FROM mydataset.INFORMATION_SCHEMA.TABLES; BigQuery 資訊架構 |
查詢資料庫中的物件 |
一致性保證和交易隔離
Netezza 和 BigQuery 都是不可分割的,也就是說,在許多資料列中,每個變動層級都符合 ACID 標準。舉例來說,即使插入多個值,MERGE
運算也完全是不可分割的。
交易
Netezza 在語法上接受 ANSI SQL 交易隔離的所有四種模式。不過,無論指定哪種模式,系統一律只會使用 SERIALIZABLE
模式,確保最高程度的一致性。這個模式也能避免並行交易之間出現髒讀、不可重複讀取和虛讀。Netezza 不會使用傳統的鎖定來強制執行一致性。而是使用序列化依附元件檢查,這是一種開放式並行控制,可自動回溯最新交易,避免兩筆交易嘗試修改相同資料。
BigQuery 也支援交易。BigQuery 採用快照隔離機制,可確保樂觀並行控制 (優先提交者優先);查詢會讀取查詢開始前最後提交的資料。這種做法可確保每個資料列、每個變動和相同 DML 陳述式中的資料列都具有相同的一致性,同時避免死結。如果對同一個資料表進行多項 DML 更新,BigQuery 會改用悲觀並行控制。 載入工作可以完全獨立執行,並附加至資料表。
復原
Netezza 支援 ROLLBACK
陳述式,可中止目前交易並復原交易中的所有變更。
在 BigQuery 中,您可以使用 ROLLBACK TRANSACTION
陳述式。
資料庫限制
限制 | Netezza | BigQuery |
---|---|---|
每個資料庫的資料表數 | 32,000 | 未限制 |
每個資料表的欄數 | 1600 | 10000 |
資料列大小上限 | 64 KB | 100 MB |
資料欄和資料表名稱長度 | 128 個位元組 | 16,384 個 Unicode 字元 |
每個資料表的列數 | 無限制 | 無限制 |
SQL 請求長度上限 | 1 MB (未解析的標準 SQL 查詢長度上限)。 12 MB (已解析的舊版和標準 SQL 查詢長度上限)。 串流: 10 MB (HTTP 要求大小上限) 10,000 (每個要求的資料列數上限) |
|
要求和回應大小上限 | 10 MB (要求) 和 10 GB (回應),或使用分頁或 Cloud Storage API 時幾乎沒有限制。 | |
並行工作階段數量上限 | 63 個並行讀寫交易。2000 個並行連線 至伺服器。 | 100 項並行查詢 (可透過預留時段提高上限)、每位使用者 300 項並行 API 要求。 |
後續步驟
- 取得從 IBM Netezza 遷移至 BigQuery 的逐步操作說明。