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 CHARACTERVARCHAR 類型不同。CHAR(n)n 的預設值為 1。字串大小上限為 64,000 個字元。
VARCHAR STRING BigQuery 中的 STRING 類型為變數長度,不需要手動設定字元長度上限,這與 Netezza CHARACTERVARCHAR 類型不同。字串大小上限為 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/1yes/notrue/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 時,請特別注意 TIMESTAMPDATETIME 之間的時區差異,如下表所示:

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 1 UNION ALL SELECT 2;

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
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_SAMP
STDDEV
STRING_AGG
SUM SUM
VAR_POP VAR_POP
VAR_SAMP VAR_SAMP
VARIANCE

分析函式

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_SAMP
VARIANCE
WIDTH_BUCKET

日期和時間函式

Netezza BigQuery
ADD_MONTHS DATE_ADD
TIMESTAMP_ADD
AGE
CURRENT_DATE CURRENT_DATE
CURRENT_DATETIME
CURRENT_TIME CURRENT_TIME
CURRENT_TIME(p)
CURRENT_TIMESTAMP CURRENT_TIMESTAMP
CURRENT_TIMESTAMP(p)
DATE
DATE_ADD
DATE_DIFF
DATE_FROM_UNIX_DATE
DATE_SUB
DATE_TRUNC DATE_TRUNC
DATE_PART
DATETIME
DATETIME_ADD
DATETIME_DIFF
DATETIME_SUB
DATETIME_TRUNC
DURATION_ADD
DURATION_SUBTRACT
EXTRACT EXTRACT (DATE)
EXTRACT (TIMESTAMP)
FORMAT_DATE
FORMAT_DATETIME
FORMAT_TIME
FORMAT_TIMESTAMP
LAST_DAY DATE_SUB( DATE_TRUNC( DATE_ADD( date_expression, INTERVAL 1 MONTH ), MONTH ), INTERVAL 1 DAY )
MONTHS_BETWEEN DATE_DIFF(date_expression, date_expression, MONTH)
NEXT_DAY
NOW
OVERLAPS
PARSE_DATE
PARSE_DATETIME
PARSE_TIME
PARSE_TIMESTAMP
STRING
TIME
TIME_ADD
TIME_DIFF
TIME_SUB
TIME_TRUNC
TIMEOFDAY
TIMESTAMP DATETIME
TIMESTAMP_ADD
TIMESTAMP_DIFF
TIMESTAMP_MICROS
TIMESTAMP_MILLIS
TIMESTAMP_SECONDS
TIMESTAMP_SUB
TIMESTAMP_TRUNC
TIMEZONE
TO_DATE PARSE_DATE
TO_TIMESTAMP PARSE_TIMESTAMP
UNIX_DATE
UNIX_MICROS
UNIX_MILLIS
UNIX_SECONDS

字串函式

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
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 陳述式數量。如要充分運用配額,請考慮下列方法:

  • 在單一 INSERT 陳述式中合併多個資料列,而不是每個陳述式一個資料列。INSERT
  • 使用 MERGE 陳述式合併多個 DML 陳述式 (包括 INSERT 陳述式)。
  • 使用 CREATE TABLE ... AS SELECT 陳述式建立及填入新資料表。

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 陳述式,不要使用多個單一 UPDATEINSERT 陳述式。BigQuery 中的 DML 指令碼與 Netezza 中對應的陳述式相比,一致性語意略有不同。如要瞭解快照隔離、工作階段和交易處理的相關資訊,請參閱一致性保證和交易隔離

DELETETRUNCATE 陳述式

DELETETRUNCATE 陳述式都能從資料表移除資料列,且不會影響資料表結構定義或索引。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 \
--replace \
--destination_table \
tableA \
'SELECT * \
FROM tableB \
WHERE ...'

bq cp \
-f tableA tableB

以查詢結果取代表格內容。

DELETE FROM database.table

DELETE FROM table WHERE TRUE;

在 Netezza 中,執行刪除陳述式時,系統不會實際刪除資料列,只會標示為刪除。稍後執行 GROOM TABLEnzreclaim 指令,即可移除標示為待刪除的資料列,並回收對應的磁碟空間。
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 中建立臨時資料表,請按照下列步驟操作:

  1. 建立存留時間較短的資料集 (例如 12 小時)。
  2. 在資料集中建立臨時資料表,資料表名稱前置字元為 temp。舉例來說,如要建立一小時後過期的資料表,請執行下列操作:

    CREATE TABLE temp.name (col1, col2, ...)
    OPTIONS(expiration_timestamp = TIMESTAMP_ADD(CURRENT_TIMESTAMP(),
    INTERVAL 1 HOUR));
  3. 從臨時表開始讀取及寫入資料。

您也可以個別移除重複項目,以便找出下游系統中的錯誤。

請注意,BigQuery 不支援 DEFAULTIDENTITY (序列) 資料欄。

程序化 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 condition
THEN ...
ELSE ...
END IF;
IF condition
THEN ...
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 condition
DO ...
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 要求。

後續步驟