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 會以世界標準時間儲存 TIME 資料類型,並允許您使用 WITH TIME
ZONE 語法傳遞與世界標準時間的時差。BigQuery 中的 TIME 資料類型代表時間,與任何日期或時區無關。 | 
TIMESTAMP
 | 
DATETIME
 | 
Netezza TIMESTAMP 類型不含時區,與 BigQuery DATETIME 類型相同。 | 
ARRAY
 | 
Netezza 中沒有陣列資料型別。陣列類型會改為儲存在 varchar 欄位中。 | 
時間戳記和日期類型格式設定
將日期類型格式化元素從 Netezza 轉換為 GoogleSQL 時,請特別注意 TIMESTAMP 和 DATETIME 之間的時區差異,如下表所示:
| Netezza | BigQuery | 
|---|---|
CURRENT_TIMESTAMPCURRENT_TIMENetezza 中的 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 <> exp2exp != exp2 | 
exp <> exp2exp != 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 | 
|---|---|
ANY_VALUE | 
|
APPROX_COUNT_DISTINCT | 
|
APPROX_QUANTILES | 
|
APPROX_TOP_COUNT | 
|
APPROX_TOP_SUM | 
|
AVG | 
AVG | 
intNand | 
BIT_AND | 
intNnot | 
位元 NOT 運算子:~ | 
intNor | 
BIT_OR | 
intNxor | 
BIT_XOR | 
intNshl | 
|
intNshr | 
|
CORR | 
CORR | 
COUNT | 
COUNT | 
COUNTIF | 
|
COVAR_POP | 
COVAR_POP | 
COVAR_SAMP | 
COVAR_SAMP | 
GROUPING | 
|
LOGICAL_AND | 
|
LOGICAL_OR | 
|
MAX | 
MAX | 
MIN | 
MIN | 
MEDIAN | 
PERCENTILE_CONT(x, 0.5) | 
STDDEV_POP | 
STDDEV_POP | 
STDDEV_SAMP
 | 
STDDEV_SAMPSTDDEV | 
STRING_AGG | 
|
SUM | 
SUM | 
VAR_POP | 
VAR_POP | 
VAR_SAMP
 | 
VAR_SAMPVARIANCE | 
分析函式
| Netezza | BigQuery | 
|---|---|
ANY_VALUE | 
|
ARRAY_AGG | 
|
ARRAY_CONCAT | 
ARRAY_CONCAT_AGG | 
ARRAY_COMBINE | 
|
ARRAY_COUNT | 
|
ARRAY_SPLIT | 
|
ARRAY_TYPE | 
|
AVG | 
AVG | 
intNand | 
BIT_AND | 
intNnot | 
位元 NOT 運算子:~ | 
intNor | 
BIT_OR | 
intNxor | 
BIT_XOR | 
intNshl | 
|
intNshr | 
|
CORR | 
CORR | 
COUNT | 
COUNT | 
COUNTIF | 
|
COVAR_POP | 
COVAR_POP | 
COVAR_SAMP | 
COVAR_SAMP | 
CUME_DIST | 
CUME_DIST | 
DENSE_RANK | 
DENSE_RANK | 
FIRST_VALUE | 
FIRST_VALUE | 
LAG | 
LAG | 
LAST_VALUE | 
LAST_VALUE | 
LEAD | 
LEAD | 
AND | 
LOGICAL_AND | 
OR | 
LOGICAL_OR | 
MAX | 
MAX | 
MIN | 
MIN | 
NTH_VALUE | 
|
NTILE | 
NTILE | 
PERCENT_RANK | 
PERCENT_RANK | 
PERCENTILE_CONT | 
PERCENTILE_CONT | 
PERCENTILE_DISC | 
PERCENTILE_DISC | 
RANK | 
RANK | 
ROW_NUMBER | 
ROW_NUMBER | 
STDDEV | 
STDDEV | 
STDDEV_POP | 
STDDEV_POP | 
STDDEV_SAMP | 
STDDEV_SAMP | 
STRING_AGG | 
|
SUM | 
SUM | 
VARIANCE | 
VARIANCE | 
VAR_POP | 
VAR_POP | 
VAR_SAMP
 | 
VAR_SAMPVARIANCE | 
WIDTH_BUCKET | 
日期和時間函式
字串函式
| Netezza | BigQuery | 
|---|---|
ASCII | 
TO_CODE_POINTS(string_expr)[OFFSET(0)] | 
BYTE_LENGTH | 
|
TO_HEX | 
|
CHAR_LENGTH | 
|
CHARACTER_LENGTH | 
|
CODE_POINTS_TO_BYTES | 
|
BTRIM | 
|
CHR | 
CODE_POINTS_TO_STRING([numeric_expr]) | 
CONCAT | 
|
DBL_MP | 
|
DLE_DST | 
|
ENDS_WITH | 
|
FORMAT | 
|
FROM_BASE32 | 
|
FROM_BASE64 | 
|
FROM_HEX | 
|
HEX_TO_BINARY | 
|
HEX_TO_GEOMETRY | 
|
INITCAP | 
|
INSTR | 
|
INT_TO_STRING | 
|
LE_DST | 
|
LENGTH | 
LENGTH | 
LOWER | 
LOWER | 
LPAD | 
LPAD | 
LTRIM | 
LTRIM | 
NORMALIZE | 
|
NORMALIZE_AND_CASEFOLD | 
|
PRI_MP | 
|
REGEXP_CONTAINS | 
|
REGEXP_EXTRACT | 
REGEXP_EXTRACT | 
REGEXP_EXTRACT_ALL | 
REGEXP_EXTRACT_ALL | 
REGEXP_EXTRACT_ALL_SP | 
|
REGEXP_EXTRACT_SP | 
|
REGEXP_INSTR | 
STRPOS(col, REGEXP_EXTRACT()) | 
REGEXP_LIKE | 
|
REGEXP_MATCH_COUNT | 
|
REGEXP_REPLACE | 
REGEXP_REPLACE | 
REGEXP_REPLACE_SP | 
IF(REGEXP_CONTAINS,1,0) | 
REGEXP_EXTRACT | 
|
REPEAT | 
REPEAT | 
REPLACE | 
|
REVERSE | 
|
RPAD | 
RPAD | 
RTRIM | 
RTRIM | 
SAFE_CONVERT_BYTES_TO_STRING | 
|
SCORE_MP | 
|
SEC_MP | 
|
SOUNDEX | 
|
SPLIT | 
|
STARTS_WITH | 
|
STRING_TO_INT | 
|
STRPOS | 
STRPOS | 
SUBSTR | 
SUBSTR | 
TO_BASE32 | 
|
TO_BASE64 | 
|
TO_CHAR | 
|
TO_DATE | 
|
TO_NUMBER | 
|
TO_TIMESTAMP | 
|
TO_CODE_POINTS | 
|
TO_HEX | 
|
TRANSLATE | 
|
TRIM | 
|
UPPER | 
UPPER | 
UNICODE | 
|
UNICODES | 
數學函式
| Netezza | BigQuery | 
|---|---|
ABS | 
ABS | 
ACOS | 
ACOS | 
ACOSH | 
|
ASIN | 
ASIN | 
ASINH | 
|
ATAN | 
ATAN | 
ATAN2 | 
ATAN2 | 
ATANH | 
|
CEILDCEIL | 
CEIL
 | 
CEILING | 
|
COS | 
COS | 
COSH | 
|
COT | 
COT | 
DEGREES | 
|
DIV | 
|
EXP | 
EXP | 
FLOORDFLOOR | 
FLOOR
 | 
GREATEST | 
GREATEST | 
IEEE_DIVIDE | 
|
IS_INF | 
|
IS_NAN | 
|
LEAST | 
LEAST | 
LN | 
LN | 
LOG | 
LOG | 
LOG10 | 
|
MOD | 
MOD | 
NULLIF(expr, 0) | 
|
PI | 
ACOS(-1) | 
POWFPOW | 
POWERPOW | 
RADIANS | 
|
RANDOM | 
RAND | 
ROUND | 
ROUND | 
SAFE_DIVIDE | 
|
SETSEED | 
|
SIGN | 
SIGN | 
SIN | 
SIN | 
SINH | 
|
SQRTNUMERIC_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 | 說明 | 
|---|---|---|
TEMPTEMPORARY
 | 
有了 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 | 說明 | 
|---|---|---|
NULLNOT NULL
 | 
NULLABLEREQUIRED
 | 
指定資料欄是否可包含 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 STATEMENTIF conditionTHEN ...ELSE ...END IF; | 
IF conditionTHEN ...ELSE ...END IF;
 | 
有條件地執行。 | 
疊代控制項FOR var AS SELECT ...DO stmts END FOR;FOR var AS cur CURSORFOR SELECT ...DO stmts END FOR; | 
不支援 | 逐一查看資料列集合。 | 
疊代控制項LOOP stmts END LOOP; | 
LOOPsql_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 TRANSACTIONEND TRANSACTIONCOMMIT | 
BigQuery 一律使用快照隔離。詳情請參閱「一致性保證和交易隔離」。 | 定義多重陳述式要求的交易界線。 | 
EXPLAIN ...
 | 
不支援。查詢計畫和時間軸中的類似功能 | 顯示 SELECT 陳述式的查詢計畫。 | 
| 使用者檢視中繼資料 系統檢視中繼資料  | 
SELECT* EXCEPT(is_typed)FROMmydataset.INFORMATION_SCHEMA.TABLES;BigQuery 資訊架構  | 
查詢資料庫中的物件 | 
一致性保證和交易隔離
Netezza 和 BigQuery 都是不可分割的,也就是說,在許多資料列中,每個變動層級都符合 ACID 標準。舉例來說,即使插入多個值,MERGE 運算也完全是不可分割的。
交易
Netezza 在語法上接受所有四種 ANSI SQL 交易隔離模式。不過,無論指定哪種模式,系統一律只會使用 SERIALIZABLE 模式,確保最高程度的一致性。這個模式也能避免並行交易之間出現髒讀、不可重複讀取和虛讀。Netezza 不會使用傳統鎖定機制來強制執行一致性,而是使用序列化依附元件檢查 (一種開放式並行控制),在兩項交易嘗試修改相同資料時,自動回溯最新交易。
BigQuery 也支援交易。BigQuery 採用快照隔離機制,可確保樂觀並行控制 (優先提交者優先);查詢會讀取查詢開始前最後提交的資料。這種做法可確保每列、每次變動和同一 DML 陳述式中的各列都具有相同的一致性,同時避免死結。如果對同一個資料表進行多項 DML 更新,BigQuery 會改用悲觀並行控制。 載入工作可以完全獨立執行,並附加至資料表。
復原
Netezza 支援 ROLLBACK TRANSACTION 陳述式,可中止目前交易並回溯交易中進行的所有變更。
在 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 的逐步操作說明。