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 物件會根據 RFC 3339 使用 T 分隔符進行格式設定。不過,在 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 中的等效陳述式,在一致性上略有不同。另請注意,除了 NOT
NULL
之外,BigQuery 不提供任何限制。
如要瞭解快照隔離和工作階段與交易處理的概略說明,請參閱「一致性保證和交易隔離」。
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
陳述式相同,但在處理大型資料表時,其速度比 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 或 copy (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 語言為基礎。本節說明如何將儲存程序、函式和觸發事件中使用的程序 SQL 陳述式,從 Netezza 轉換為 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, 等統計函式、使用 UI,或使用 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的逐步操作說明。