PGAdapter 工作階段管理指令

Spanner PGAdapter 支援工作階段管理陳述式,可讓您修改連線的狀態和行為、執行交易,以及有效率地執行批次陳述式。本文所述的所有陳述式,都可以與連線至 PGAdapter 的任何用戶端或驅動程式搭配使用。

如需更多資訊,請參閱支援的 PostgreSQL 驅動程式和 ORM 完整清單。下列指令適用於 PostgreSQL 方言資料庫。

如要進一步瞭解如何使用 PGAdapter,請參閱「啟動 PGAdapter」。

連線陳述式

以下陳述式會變更或顯示目前連線的屬性。

SPANNER.READONLY

布林值,指出連線是否處於唯讀模式。預設值為 false

SHOW [VARIABLE] SPANNER.READONLY
SET SPANNER.READONLY {TO|=} { true | false }

只有在沒有有效交易時,您才能變更這個屬性的值。

▶ 範例:唯讀交易 (按一下即可展開)
以下範例說明如何使用此屬性,在 Spanner 中執行唯讀交易。

SET SPANNER.READONLY = TRUE;
-- This transaction is a read-only transaction.
BEGIN TRANSACTION;

-- The following two queries both use the read-only transaction.
SELECT first_name, last_name
FROM singers
ORDER BY last_name;

SELECT first_name, last_name
FROM albums
ORDER BY title;

-- This shows the read timestamp that was used for the two queries.
SHOW SPANNER.READ_TIMESTAMP;

-- This marks the end of the read-only transaction. The next statement will
-- start a new read-only transaction.
COMMIT;

AUTOCOMMIT

布林值,指出連線是否處於自動提交模式。預設值為 true

注意:在使用 PGAdapter 搭配 PostgreSQL 驅動程式時,通常不需要修改這個變數的值。這些驅動程式會在必要時執行 BEGINCOMMIT,自動管理交易。使用 psql 等指令列工具時,您可以關閉 autocommit,避免系統自動提交不小心修改的資料。

SHOW [VARIABLE] AUTOCOMMIT
SET AUTOCOMMIT {TO|=} { true | false }

只有在沒有有效交易時,您才能變更這項資源的值。

AUTOCOMMIT 設為 false 後,系統會在您執行 COMMITROLLBACK 後自動啟動新的交易。您執行的第一個陳述式會啟動交易。

▶ 範例:自動提交 (按一下即可展開)
以下範例說明如何使用 autocommit 屬性。

-- The default value for AUTOCOMMIT is true.
SHOW AUTOCOMMIT;

-- This insert statement is automatically committed after it is executed, as
-- the connection is in autocommit mode.
INSERT INTO T (id, col_a, col_b) VALUES (1, 100, 1);

-- Turning off autocommit means that a new transaction is automatically started
-- when the next statement is executed.
SET AUTOCOMMIT = FALSE;
-- The following statement starts a new transaction.
INSERT INTO T (id, col_a, col_b) VALUES (2, 200, 2);

-- This statement uses the same transaction as the previous statement.
INSERT INTO T (id, col_a, col_b) VALUES (3, 300, 3);

-- Commit the current transaction with the two INSERT statements.
COMMIT;

-- Transactions can also be executed in autocommit mode by executing the BEGIN
-- statement.
SET AUTOCOMMIT = TRUE;

-- Execute a transaction while in autocommit mode.
BEGIN;
INSERT INTO T (id, col_a, col_b) VALUES (4, 400, 4);
INSERT INTO T (id, col_a, col_b) VALUES (5, 500, 5);
COMMIT;

SPANNER.RETRY_ABORTS_INTERNALLY

布林值,指出連線是否會自動重試已中止的交易。預設為 true

SHOW [VARIABLE] SPANNER.RETRY_ABORTS_INTERNALLY
SET SPANNER.RETRY_ABORTS_INTERNALLY {TO|=} { true | false }

您只能在交易開始 (請參閱 BEGIN [TRANSACTION | WORK]) 後,且在交易內執行任何陳述式之前執行此指令。

啟用 SPANNER.RETRY_ABORTS_INTERNALLY 後,連線會保留連線傳回至用戶端應用程式的所有資料的總和檢查碼。如果交易遭到 Spanner 中止,就會使用這個值重試交易。

這項設定預設為啟用。如果應用程式已重試已中止的交易,建議您關閉這項設定。

SPANNER.AUTOCOMMIT_DML_MODE

STRING 屬性,指出 資料操縱語言 (DML) 陳述式的自動提交模式。

SHOW [VARIABLE] SPANNER.AUTOCOMMIT_DML_MODE
SET SPANNER.AUTOCOMMIT_DML_MODE {TO|=} { 'TRANSACTIONAL' | 'PARTITIONED_NON_ATOMIC' }

可能的值如下:

  • TRANSACTIONAL 模式中,驅動程式會以個別的原子交易執行 DML 陳述式。驅動程式會建立新的交易、執行 DML 陳述式,並在執行成功時提交交易,或在發生錯誤時回復交易。
  • PARTITIONED_NON_ATOMIC 模式中,驅動程式會將 DML 陳述式做為分區更新陳述式執行。分區更新陳述式可做為一系列交易執行,每個交易涵蓋受影響的資料列子集。分割陳述式會提供較弱的語意,以換取更佳的可擴充性和效能。

預設為 TRANSACTIONAL

▶ 範例:分區 DML (點選即可展開)
以下範例說明如何使用 PGAdapter 執行分區 DML

-- Change autocommit DML mode to use Partitioned DML.
SET SPANNER.AUTOCOMMIT_DML_MODE = 'PARTITIONED_NON_ATOMIC';

-- Delete all singers that have been marked as inactive.
-- This statement is executed using Partitioned DML.
DELETE
FROM singers
WHERE active=false;

-- Change DML mode back to standard `TRANSACTIONAL`.
SET SPANNER.AUTOCOMMIT_DML_MODE = 'TRANSACTIONAL';

STATEMENT_TIMEOUT

類型為 STRING 的屬性,表示陳述式的目前逾時值。

SHOW [VARIABLE] STATEMENT_TIMEOUT
SET STATEMENT_TIMEOUT {TO|=} { '<int8>{ s | ms | us | ns }' | <int8> | DEFAULT }

int8 值是整數,後面接著表示時間單位的後置字串。如果值為 DEFAULT,表示沒有設定逾時值。如果已設定陳述式逾時值,陳述式如果耗時超過指定的逾時值,就會導致逾時錯誤,並使交易失效。

支援的時間單位如下:

  • s:秒
  • ms:毫秒
  • us:微秒
  • ns:奈秒

DEFAULT 為 0 秒,表示沒有逾時。沒有單位的 int8 數字表示 int8 ms。舉例來說,下列指令都會將陳述式逾時時間設為 2 秒。

SET STATEMENT_TIMEOUT TO 2000;
SET STATEMENT_TIMEOUT TO '2s';

如果在交易期間發生陳述式逾時,交易就會失效,且在失效交易中,所有後續陳述式 (ROLLBACK 除外) 都會失敗。

READ_ONLY_STALENESS

類型為 STRING 的屬性,表示 Spanner 在 AUTOCOMMIT 模式中,用於唯讀交易和查詢的目前唯讀過時設定

SHOW [VARIABLE] SPANNER.READ_ONLY_STALENESS
SET SPANNER.READ_ONLY_STALENESS {TO|=} staleness_type

staleness_type:

{ 'STRONG' 
  | 'MIN_READ_TIMESTAMP timestamp'
  | 'READ_TIMESTAMP timestamp'
  | 'MAX_STALENESS <int8>{ s | ms | us | ns }'
  | 'EXACT_STALENESS <int8>{ s | ms | us | ns }' }

唯讀過時程度值會套用至所有後續的唯讀交易,以及 AUTOCOMMIT 模式中的所有查詢。

預設為 STRONG

時間戳記界限選項如下:

  • STRONG 會指示 Spanner 執行強式讀取
  • MAX_STALENESS 會定義 Spanner 用來執行受限過時程度讀取的時間間隔 (相對於 now())。
  • MIN_READ_TIMESTAMP 定義 Spanner 用來執行受限過時讀取的絕對時間。
  • EXACT_STALENESS 會定義 Spanner 用來執行精準過時程度讀取的時間間隔,相對於 now()
  • READ_TIMESTAMP 定義 Spanner 用來執行精確過時程度讀取作業的絕對時間。

時間戳記必須使用以下格式:

YYYY-[M]M-[D]D [[H]H:[M]M:[S]S[.DDDDDD]][timezone]

設定 MAX_STALENESSEXACT_STALENESS 值時支援的時間單位如下:

  • s:秒
  • ms:毫秒
  • us:微秒
  • ns:奈秒

只有在沒有有效交易時,您才能修改這個屬性的值。

▶ 範例:唯讀過時性 (按一下可展開)
以下範例說明如何使用 PGAdapter 執行使用自訂過時值的查詢。

-- Set the read-only staleness to MAX_STALENESS 10 seconds.
SET SPANNER.READ_ONLY_STALENESS = 'MAX_STALENESS 10s';

-- Execute a query in auto-commit mode. This will return results that are up to
-- 10 seconds stale.
SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Read-only staleness can also be applied to read-only transactions.
-- MAX_STALENESS is however only allowed for queries in autocommit mode.
-- Change the staleness to EXACT_STALENESS and start a read-only transaction.
SET SPANNER.READ_ONLY_STALENESS = 'EXACT_STALENESS 10s';
BEGIN;
SET TRANSACTION READ ONLY;

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

SELECT title, singer_id
FROM albums
ORDER BY title;

COMMIT;

-- Read staleness can also be an exact timestamp.
SET SPANNER.READ_ONLY_STALENESS = 'READ_TIMESTAMP 2024-01-26T10:36:00Z';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

SPANNER.OPTIMIZER_VERSION

類型為 STRING 的屬性,用於指出最佳化器版本。版本為數字或「LATEST」。

SHOW [VARIABLE] SPANNER.OPTIMIZER_VERSION
SET SPANNER.OPTIMIZER_VERSION {TO|=} { 'version'|'LATEST'|'' }

設定要用於連線中所有後續陳述式的最佳化器版本。將最佳化器版本設為 '' (空白字串) 表示要使用最新版本。如果未設定最佳化器版本,Spanner 會使用在資料庫層級設定的最佳化器版本。

預設為 ''

▶ 範例:最佳化器版本 (按一下可展開)
以下範例說明如何使用 PGAdapter 搭配特定最佳化器版本執行查詢。

-- Set the optimizer version to 5 and execute a query.
SET SPANNER.OPTIMIZER_VERSION = '5';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Execute the same query with the latest optimizer version.
SET SPANNER.OPTIMIZER_VERSION = 'LATEST';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Revert back to using the default optimizer version that has been set for the
-- database.
SET SPANNER.OPTIMIZER_VERSION = '';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

SPANNER.OPTIMIZER_STATISTICS_PACKAGE

屬性類型為 STRING,表示此連線使用的目前最佳化器統計資料套件

SHOW [VARIABLE] SPANNER.OPTIMIZER_STATISTICS_PACKAGE
SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE {TO|=} { 'package'|'' }

設定最佳化器統計資料套件,以便在連線上使用後續所有陳述式。<package> 必須是有效的套件名稱。如果未設定最佳化器統計資料套件,Spanner 會使用在資料庫層級設定的最佳化器統計資料套件。

預設為 ''

▶ 範例:最佳化工具統計資料套件 (按一下即可展開)
以下範例說明如何使用 PGAdapter 搭配特定最佳化器統計資料套件執行查詢。

-- Show the available optimizer statistics packages in this database.
SELECT * FROM INFORMATION_SCHEMA.SPANNER_STATISTICS;

-- Set the optimizer statistics package and execute a query.
SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE = 'auto_20240124_06_47_29UTC';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Execute the same query with the default optimizer statistics package.
SET SPANNER.OPTIMIZER_VERSION = '';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

SPANNER.RETURN_COMMIT_STATS

類型為 BOOL 的屬性,用於指出是否應針對此連線的交易傳回統計資料。您可以執行 SHOW [VARIABLE] COMMIT_RESPONSE 指令,查看傳回的統計資料。

SHOW [VARIABLE] SPANNER.RETURN_COMMIT_STATS
SET SPANNER.RETURN_COMMIT_STATS {TO|=} { true | false }

預設為 false

▶ 範例:提交統計資料 (按一下可展開)
以下範例說明如何使用 PGAdapter 查看交易的提交統計資料。

-- Enable the returning of commit stats.
SET SPANNER.RETURN_COMMIT_STATS = true;

-- Execute a transaction.
BEGIN;
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1), (2, 200, 2), (3, 300, 3);
COMMIT;

-- View the commit response with the transaction statistics for the last
-- transaction that was committed.
SHOW SPANNER.COMMIT_RESPONSE;

SPANNER.RPC_PRIORITY

屬性類型為 STRING,表示 Spanner 要求的相對優先順序。優先順序會做為 Spanner 排程器的提示,無法保證執行順序。

SHOW [VARIABLE] SPANNER.RPC_PRIORITY
SET SPANNER.RPC_PRIORITY {TO|=} {'HIGH'|'MEDIUM'|'LOW'|'NULL'}

'NULL' 表示請求中不應包含任何提示。

預設為 'NULL'

您也可以使用陳述式提示來指定 RPC 優先順序:

/*@RPC_PRIORITY=PRIORITY_LOW*/ SELECT * FROM Albums

詳情請參閱 Priority

交易明細

以下陳述式可管理及提交 Spanner 交易。

交易隔離等級

SHOW [ VARIABLE ] TRANSACTION ISOLATION LEVEL

傳回結果集,其中包含一列和一欄,類型為 STRING。傳回的值一律為 serializable,因為這是 Spanner PostgreSQL 方言資料庫唯一支援的隔離層級。

SPANNER.READ_TIMESTAMP

SHOW [VARIABLE] SPANNER.READ_TIMESTAMP

傳回結果集,其中包含一列和一個 TIMESTAMP 類型的資料欄,其中包含最近的唯讀交易的讀取時間戳記。只有在唯讀交易仍處於活動狀態且已執行至少一個查詢,或是在唯讀交易完成後立即,且在新的交易開始前,這項陳述式才會傳回時間戳記。否則,結果為 NULL

▶ 範例:讀取時間戳記 (按一下即可展開)
以下範例說明如何使用 PGAdapter 查看唯讀作業的最後讀取時間戳記。

-- Execute a query in autocommit mode using the default read-only staleness
-- (strong).
SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Shows the read timestamp that was used for the previous query.
SHOW SPANNER.READ_TIMESTAMP;

-- Set a non-deterministic read-only staleness and execute the same query.
SET SPANNER.READ_ONLY_STALENESS = 'MAX_STALENESS 20s';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Shows the read timestamp that was used for the previous query. The timestamp
-- is determined by Spanner, and is guaranteed to be no less than 20
-- seconds stale.
SHOW SPANNER.READ_TIMESTAMP;

-- The read timestamp of a read-only transaction can also be retrieved.
SET SPANNER.READ_ONLY_STALENESS = 'STRONG';
BEGIN;
SET TRANSACTION READ ONLY;

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Shows the read timestamp of the current read-only transaction. All queries in
-- this transaction will use this read timestamp.
SHOW SPANNER.READ_TIMESTAMP;

SELECT title
FROM albums
ORDER BY title;

-- The read timestamp is the same as for the previous query, as all queries in
-- the same transaction use the same read timestamp.
SHOW SPANNER.READ_TIMESTAMP;

COMMIT;

SPANNER.COMMIT_TIMESTAMP

SHOW [VARIABLE] SPANNER.COMMIT_TIMESTAMP

傳回結果集,其中包含一列和一個 TIMESTAMP 型別的資料欄,其中包含 Spanner 上次讀取/寫入交易的修訂時間戳記。只有在您在提交讀寫交易後,執行此陳述式之前,執行任何後續 SELECTDML 或結構定義變更陳述式時,才會傳回時間戳記。否則,結果為 NULL

▶ 範例:修訂時間戳記 (按一下可展開)
以下範例說明如何使用 PGAdapter 查看寫入作業的最後一次認可時間戳記。

-- Execute a DML statement.
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1), (2, 200, 2), (3, 300, 3);

-- Show the timestamp that the statement was committed.
SHOW SPANNER.COMMIT_TIMESTAMP;

SPANNER.COMMIT_RESPONSE

SHOW [VARIABLE] SPANNER.COMMIT_RESPONSE

傳回包含一列和兩欄的結果集:

  • COMMIT_TIMESTAMP (type=TIMESTAMP) 指出最近一次交易的提交時間。
  • MUTATION_COUNT (type=int8):指出在已確認的交易中套用了多少變異。在模擬器上執行時,這個值一律為空白。

只有在交易提交前將 SET RETURN_COMMIT_STATS 設為 true 時,才能使用變異數計數。

▶ 範例:提交回應 (按一下即可展開)
以下範例說明如何使用 PGAdapter 查看寫入作業的最後一個提交回應。

-- Enable returning commit stats in addition to the commit timestamp.
SET SPANNER.RETURN_COMMIT_STATS = true;

-- Execute a DML statement.
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1), (2, 200, 2), (3, 300, 3);

-- Show the timestamp that the statement was committed.
SHOW SPANNER.COMMIT_RESPONSE;

{ START | BEGIN } [ TRANSACTION | WORK ]

{ START | BEGIN } [ TRANSACTION | WORK ] [{ READ ONLY | READ WRITE }]

啟動新的交易。TRANSACTIONWORK 是選用關鍵字,兩者等同且無效。

  • 使用 COMMITROLLBACK 終止交易。
  • 如果您已啟用 AUTOCOMMIT 模式,這項陳述式會暫時將連線從 AUTOCOMMIT 模式移除。交易結束後,連線會返回 AUTOCOMMIT 模式。
  • 如果未指定 READ ONLYREAD WRITE,系統會根據工作階段的預設交易模式決定交易模式。您可以使用 SET SESSION CHARACTERISTICS AS TRANSACTION 指令設定這個預設值。

您只能在沒有有效交易時執行這項陳述式。

▶ 範例:BEGIN TRANSACTION (按一下可展開)
以下範例說明如何使用 PGAdapter 啟動不同類型的交易。

-- This starts a transaction using the current defaults of this connection.
-- The value of SPANNER.READONLY determines whether the transaction is a
-- read/write or a read-only transaction.

BEGIN;
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);
COMMIT;

-- Set SPANNER.READONLY to TRUE to use read-only transactions by default.
SET SPANNER.READONLY=TRUE;

-- This starts a read-only transaction.
BEGIN;
SELECT first_name, last_name
FROM singers
ORDER BY last_name;
COMMIT;

-- Use the 'READ WRITE' or 'READ ONLY' qualifier in the BEGIN statement to
-- override the current default of the connection.
SET SPANNER.READONLY=FALSE;
BEGIN READ ONLY;
SELECT first_name, last_name
FROM singers
ORDER BY last_name;
COMMIT;

COMMIT [TRANSACTION | WORK]

COMMIT [TRANSACTION | WORK]

提交目前的交易。TRANSACTIONWORK 是可選用且等同的關鍵字,且不會產生任何效果。

  • 提交讀寫交易後,其他交易就能看到這項交易的所有更新,並且釋出 Spanner 上的所有交易鎖定。
  • 提交唯讀交易會結束目前的唯讀交易。後續的任何陳述式都會啟動新的交易。對於唯讀交易,COMMITROLLBACK 之間沒有語意差異。

您只能在有有效交易時執行這項陳述式。

▶ 範例:COMMIT TRANSACTION (按一下可展開)
以下範例說明如何使用 PGAdapter 提交交易。

-- Execute a regular read/write transaction.
BEGIN;
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);
COMMIT;

-- Execute a read-only transaction. Read-only transactions also need to be
-- either committed or rolled back in PGAdapter in order to mark the
-- end of the transaction.
BEGIN READ ONLY;
SELECT first_name, last_name
FROM singers
ORDER BY last_name;
COMMIT;

ROLLBACK [TRANSACTION | WORK]

ROLLBACK [TRANSACTION | WORK]

執行目前交易的 ROLLBACKTRANSACTIONWORK 是可選用且等同的關鍵字,且不會產生任何效果。

  • 執行讀寫交易的 ROLLBACK 會清除所有緩衝變異,並在 Spanner 上復原交易,以及釋放交易所持有的任何鎖定。
  • 執行唯讀交易的 ROLLBACK 會結束目前的唯讀交易。後續的任何陳述式都會啟動新的交易。在連線上,COMMITROLLBACK 的唯讀交易沒有語意差異。

您只能在有有效交易時執行這項陳述式。

▶ 範例:ROLLBACK TRANSACTION (按一下可展開)
以下範例說明如何使用 PGAdapter 回退交易。

-- Use ROLLBACK to undo the effects of a transaction.
BEGIN;
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);
-- This will ensure that the insert statement is not persisted in the database.
ROLLBACK;

-- Read-only transactions also need to be either committed or rolled back in
-- PGAdapter in order to mark the end of the transaction. There is no
-- semantic difference between rolling back or committing a read-only
-- transaction.
BEGIN READ ONLY;
SELECT first_name, last_name
FROM singers
ORDER BY last_name;
ROLLBACK;

SET TRANSACTION

SET TRANSACTION { READ ONLY | READ WRITE }

為目前交易設定交易模式。

您只能在 AUTOCOMMITfalse 時,或在您已透過執行 BEGIN [TRANSACTION | WORK] 啟動交易,且尚未在交易中執行任何陳述式時,執行這個陳述式。

這個陳述式只會為目前的交易設定交易模式。當交易提交或回溯時,下一個交易會使用連線的預設模式。(請參閱 SET SESSION CHARACTERISTICS)。

▶ 範例:SET TRANSACTION (按一下可展開)
以下範例說明如何使用 PGAdapter 設定交易特性。

-- Start a transaction and set the transaction mode to read-only.
BEGIN;
SET TRANSACTION READ ONLY;

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Commit the read-only transaction to mark the end of the transaction.
COMMIT;

-- Start a transaction and set the transaction mode to read/write.
BEGIN;
SET TRANSACTION READ WRITE;

INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);

COMMIT;

SET SESSION CHARACTERISTICS

SET SESSION CHARACTERISTICS AS TRANSACTION { READ ONLY | READ WRITE }

將工作階段中交易的預設交易模式設為 READ ONLYREAD WRITE。只有在沒有任何有效交易時,才能使用這項陳述式。

SET TRANSACTION 指令可覆寫這項設定。

▶ 範例:SET SESSION CHARACTERISTICS (點選即可展開)
以下範例說明如何使用 PGAdapter 設定工作階段特性。

-- Set the default transaction mode to read-only.
SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;

-- This will now start a read-only transaction.
BEGIN;
SELECT first_name, last_name
FROM singers
ORDER BY last_name;
COMMIT;

-- You can override the default transaction mode with the SET TRANSACTION
-- statement.
SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE;
BEGIN;
SET TRANSACTION READ ONLY;
SELECT first_name, last_name
FROM singers
ORDER BY last_name;
COMMIT;

SPANNER.STATEMENT_TAG

屬性類型為 STRING,其中包含下一個陳述式的要求標記。

SHOW [ VARIABLE ] SPANNER.STATEMENT_TAG
SET SPANNER.STATEMENT_TAG {TO|=} 'tag-name'

為下一個要執行的陳述式設定要求標記。每個陳述式只能設定一個標記。這個標記不會跨越多個陳述式,必須針對每個陳述式設定。如要移除要求標記,請將其設為空字串 ('')。

預設為 ''

您可以為同一份對帳單設定交易標記和對帳單標記。

您也可以使用陳述式提示來新增陳述式標記:

/*@STATEMENT_TAG='my-tag'*/ SELECT * FROM albums

詳情請參閱「解決要求標記和交易標記問題」。

▶ 範例:陳述式標記 (按一下即可展開)
以下範例說明如何使用 PGAdapter 設定陳述式標記。

-- Set the statement tag that should be included with the next statement.
SET SPANNER.STATEMENT_TAG = 'tag1';
SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- The statement tag property is cleared after each statement execution.
SHOW SPANNER.STATEMENT_TAG;
-- Set another tag for the next statement.
SET SPANNER.STATEMENT_TAG = 'tag2';
SELECT title
FROM albums
ORDER BY title;

-- Set a statement tag with a query hint.
/*@STATEMENT_TAG='tag3'*/
SELECT track_number, title
FROM tracks
WHERE album_id=1 AND singer_id=1
ORDER BY track_number;

SPANNER.TRANSACTION_TAG

類型為 STRING 的屬性,其中包含下一個交易的交易標記。

SHOW [ VARIABLE ] SPANNER.TRANSACTION_TAG
SET SPANNER.TRANSACTION_TAG {TO|=} 'tag-name'

為要執行的目前交易設定交易標記。每筆交易只能設定一個代碼。這個代碼不會跨越多筆交易,必須針對每筆交易設定。只要將交易標記設為空字串 (''),即可移除交易標記。必須在交易中執行任何陳述式之前,先設定交易標記。

預設為 ''

您可以為同一份對帳單設定交易標記和對帳單標記。

詳情請參閱「解決要求標記和交易標記問題」。

▶ 範例:交易標記 (按一下即可展開)
以下範例說明如何使用 PGAdapter 設定交易標記。

BEGIN;
-- Set the transaction tag for the current transaction.
SET SPANNER.TRANSACTION_TAG = 'transaction-tag-1';

-- Set the statement tag that should be included with the next statement.
-- The statement will include both the statement tag and the transaction tag.
SET SPANNER.STATEMENT_TAG = 'select-statement';
SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- The statement tag property is cleared after each statement execution.
SHOW SPANNER.STATEMENT_TAG;

-- Set another tag for the next statement.
SET SPANNER.STATEMENT_TAG = 'insert-statement';
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);

COMMIT;

-- The transaction tag property is cleared when the transaction finishes.
SHOW SPANNER.TRANSACTION_TAG;

批次陳述式

下列陳述式會管理 DDL 陳述式批次,並將這些批次傳送至 Spanner。

START BATCH DDL

START BATCH DDL

在連線上啟動一批 DDL 陳述式。批次中的所有後續陳述式都必須是 DDL 陳述式。執行 RUN BATCH 時,系統會在本機緩衝 DDL 陳述式,並以一批次的形式傳送至 Spanner。以批次方式執行多個 DDL 陳述式通常比個別執行陳述式更快。

您只能在沒有有效交易時執行這項陳述式。

▶ 範例:DDL 批次 (按一下可展開)
以下範例說明如何使用 PGAdapter 執行 DDL 批次。

-- Start a DDL batch. All following statements must be DDL statements.
START BATCH DDL;

-- This statement is buffered locally until RUN BATCH is executed.
CREATE TABLE singers (
  id bigint primary key,
  first_name varchar,
  last_name varchar
);

-- This statement is buffered locally until RUN BATCH is executed.
CREATE TABLE albums (
  id bigint primary key,
  title varchar,
  singer_id bigint,
  constraint fk_albums_singers foreign key (singer_id) references singers (id)
);

-- This runs the DDL statements as one batch.
RUN BATCH;

執行批次

RUN BATCH

將目前 DDL 批次中的所有緩衝 DDL 陳述式傳送至資料庫,等待 Spanner 執行這些陳述式,並結束目前的 DDL 批次。

如果 Spanner 無法執行至少一個 DDL 陳述式,RUN BATCH 會針對 Spanner 無法執行的第一個 DDL 陳述式傳回錯誤。否則,RUN BATCH 會成功傳回。

ABORT BATCH

清除目前 DDL 批次中的所有緩衝 DDL 陳述式,並結束批次。

您只能在 DDL 批次處於活動狀態時執行這項陳述式。無論批次是否有緩衝的 DDL 陳述式,您都可以使用 ABORT BATCH。批次中所有先前的 DDL 陳述式都會中止。

▶ 範例:中斷 DDL 批次 (按一下可展開)
以下範例說明如何使用 PGAdapter 中止 DDL 批次。

-- Start a DDL batch. All following statements must be DDL statements.
START BATCH DDL;

-- The following statements are buffered locally.
CREATE TABLE singers (
  id bigint primary key,
  first_name varchar,
  last_name varchar
);
CREATE TABLE albums (
  id bigint primary key,
  title varchar,
  singer_id bigint,
  constraint fk_albums_singers foreign key (singer_id) references singers (id)
);

-- This aborts the DDL batch and removes the DDL statements from the buffer.
ABORT BATCH;

START BATCH DML

以下陳述式會將兩個 DML 陳述式一起批次處理,並透過單一呼叫傳送至伺服器。DML 批次可在交易中執行,也可以在自動提交模式下執行。

START BATCH DML;
INSERT INTO MYTABLE (ID, NAME) VALUES (1, 'ONE');
INSERT INTO MYTABLE (ID, NAME) VALUES (2, 'TWO');
RUN BATCH;

▶ 範例:批次 DML (按一下即可展開)
以下範例說明如何使用 PGAdapter 執行 DML 批次作業。

-- Start a DML batch. All following statements must be a DML statement.
START BATCH DML;

-- The following statements are buffered locally.
INSERT INTO MYTABLE (ID, NAME) VALUES (1, 'ONE');
INSERT INTO MYTABLE (ID, NAME) VALUES (2, 'TWO');

-- This sends the statements to Spanner.
RUN BATCH;

-- DML batches can also be part of a read/write transaction.
BEGIN;
-- Insert a row using a single statement.
INSERT INTO MYTABLE (ID, NAME) VALUES (3, 'THREE');

-- Insert two rows using a batch.
START BATCH DML;
INSERT INTO MYTABLE (ID, NAME) VALUES (4, 'FOUR');
INSERT INTO MYTABLE (ID, NAME) VALUES (5, 'FIVE');
RUN BATCH;

-- Rollback the current transaction. This rolls back both the single DML
-- statement and the DML batch.
ROLLBACK;

儲存點指令

模擬 PGAdapter 中的 Savepoint。復原至儲存點會復原整個交易,並重試至儲存點設定的點。如果交易使用到儲存點之前的基礎資料已變更,此作業就會失敗,並顯示 AbortedDueToConcurrentModificationException 錯誤。

啟用儲存點支援功能後,建立及釋出儲存點一律會成功。

下列陳述式可在交易中啟用及停用模擬的儲存點。

SPANNER.SAVEPOINT_SUPPORT

SHOW [VARIABLE] SPANNER.SAVEPOINT_SUPPORT
SET SPANNER.SAVEPOINT_SUPPORT = { 'DISABLED' | 'FAIL_AFTER_ROLLBACK' | 'ENABLED' }

STRING 類型的屬性,表示目前的 SAVEPOINT_SUPPORT 設定。可能的值包括:

  • DISABLED:所有儲存點指令都會停用,並且會失敗。
  • FAIL_AFTER_ROLLBACK:啟用儲存點指令。復原至儲存點會復原整個交易。如果您在回溯至儲存點後嘗試使用交易,作業就會失敗。
  • ENABLED:所有儲存點指令都已啟用。回溯至儲存點會復原交易,並重試儲存點。如果交易使用基礎資料的儲存點已變更,此作業就會失敗,並顯示 AbortedDueToConcurrentModificationException 錯誤。

預設值為 ENABLED

您只能在沒有有效交易時執行這項陳述式。

SAVEPOINT savepoint_name

SAVEPOINT savepoint-name;

SAVEPOINT 會在目前交易中建立新的儲存點。交易可回溯至儲存點,藉此撤銷自儲存點建立以來執行的所有作業。

▶ 範例:Savepoint (點選即可展開)
以下範例說明如何使用 PGAdapter 儲存點。

-- Start a transaction and execute an insert statement.
BEGIN;
INSERT INTO T (id, col_a, col_b) VALUES (1, 100, 1);

-- Set a savepoint and then execute another insert statement.
SAVEPOINT one_row_inserted;
INSERT INTO T (id, col_a, col_b) VALUES (2, 200, 2);

-- Roll back to the savepoint. This will undo all statements that have been
-- executed after the savepoint.
ROLLBACK TO one_row_inserted;

-- This only commits the first insert statement.
COMMIT;

ROLLBACK TO savepoint_name

ROLLBACK TO savepoint_name

將目前的交易回溯至具有指定名稱的儲存點。

並非所有情況都能成功回溯至儲存點。復原至儲存點會復原整個交易,並重試至儲存點設定的點。如果交易使用基礎資料的儲存點已變更,這項作業就會失敗,並顯示 AbortedDueToConcurrentModificationException

RELEASE [SAVEPOINT] savepoint_name

RELEASE savepoint_name

從目前的交易中移除儲存點。無法再用於執行 ROLLBACK TO savepoint_name 陳述式。

預先編譯陳述式

下列陳述式會建立及執行預備陳述式。

PREPARE

PREPARE statement_name [(data_type, ...)] AS statement

準備此連線的陳述式。Spanner 會剖析及驗證陳述式,並將其儲存在 PGAdapter 的記憶體中。

▶ 範例:預備指令 (按一下即可展開)
以下範例說明如何使用 PGAdapter 建立及執行預處理陳述式。

-- Create a prepared statement that can be used to insert a single row.
PREPARE insert_t AS INSERT INTO T (id, col_a, col_b) VALUES ($1, $2, $3);

-- The prepared statement can be used to insert rows both in autocommit, in a
-- transaction, and in DML batches.

-- Execute in autocommit.
EXECUTE insert_t (1, 100, 1);

-- Execute in transaction.
BEGIN;
EXECUTE insert_t (2, 200, 2);
EXECUTE insert_t (3, 300, 3);
COMMIT;

-- Execute in a DML batch.
START BATCH DML;
EXECUTE insert_t (4, 400, 4);
EXECUTE insert_t (5, 500, 5);
RUN BATCH;

-- Prepared statements can be removed with the DEALLOCATE command.
DEALLOCATE insert_t;

執行

EXECUTE statement_name [(value, ...)]

使用 PREPARE 執行此連線上已建立的陳述式。

▶ 範例:執行 (按一下即可展開)
以下範例說明如何使用 PGAdapter 準備及執行陳述式。

-- Create a prepared statement.
PREPARE my_statement AS insert into my_table (id, value) values ($1, $2);

-- Execute the statement twice with different parameter values.
EXECUTE my_statement (1, 'One');
EXECUTE my_statement (2, 'Two');

DEALLOCATE

DEALLOCATE statement_name

從這個連線移除預備陳述式。

複製

PGAdapter 支援 PostgreSQL COPY 指令的子集。

COPY table_name FROM STDIN

COPY table_name FROM STDIN [BINARY]

將資料從 stdin 複製到 Spanner。使用 COPY 將大量資料集匯入 Spanner 比執行 INSERT 陳述式更有效率。

COPY 可與 SPANNER.AUTOCOMMIT_DML_MODE 結合,執行非原子交易。這樣一來,交易就能執行比標準交易變異限制更多的變異。

▶ 範例:複製 (按一下即可展開)
以下範例說明如何使用 PGAdapter 將資料複製至 Spanner 和從 Spanner 複製資料。

create table numbers (number bigint not null primary key, name varchar);

執行不可分割的 COPY 作業:

cat numbers.txt | psql -h /tmp -d test-db -c "copy numbers from stdin;"

執行非原子 COPY 作業:

cat numbers.txt | psql -h /tmp -d test-db \
  -c "set spanner.autocommit_dml_mode='partitioned_non_atomic'; copy numbers from stdin;"

將資料從 PostgreSQL 複製到 Spanner:

psql -h localhost -p 5432 -d my-local-db \
  -c "copy (select i, to_char(i, 'fm000') from generate_series(1, 1000000) s(i)) to stdout binary" \
  | psql -h localhost -p 5433 -d my-spanner-db \
  -c "set spanner.autocommit_dml_mode='partitioned_non_atomic'; copy numbers from stdin binary;"

本範例假設 PostgreSQL 會在通訊埠 5432 上執行,而 PGAdapter 會在通訊埠 5433 上執行。

如需更多範例,請參閱「PGAdapter - COPY 支援」。

COPY table_name TO STDOUT [BINARY]

COPY table_name TO STDOUT [BINARY]

將資料表或查詢中的資料複製到 stdout

Data Boost 和分區查詢陳述式

Data Boost 可讓您執行分析查詢和資料匯出作業,對已佈建 Spanner 執行個體的現有工作負載幾乎沒有影響。資料提升功能僅支援分區查詢

您可以使用 SET SPANNER.DATA_BOOST_ENABLED 陳述式啟用 Data Boost。

PGAdapter 支援三種執行分區查詢的替代方案:

  • SET SPANNER.AUTO_PARTITION_MODE = true
  • RUN PARTITIONED QUERY sql
  • PARTITION sql 後面接著多個 RUN PARTITION 'partition-token'

以下各節將說明各個方法。

SPANNER.DATA_BOOST_ENABLED

SHOW SPANNER.DATA_BOOST_ENABLED
SET SPANNER.DATA_BOOST_ENABLED {TO|=} { true | false }

設定此連線是否應使用 Data Boost 進行分割查詢。

預設為 false

▶ 範例:使用 Data Boost 執行查詢 (按一下即可展開)
以下範例說明如何使用 PGAdapter 搭配 Data Boost 執行查詢。

-- Enable Data Boost on this connection.
SET SPANNER.DATA_BOOST_ENABLED = true;

-- Execute a partitioned query. Data Boost is only used for partitioned queries.
RUN PARTITIONED QUERY SELECT FirstName, LastName FROM Singers;

SPANNER.AUTO_PARTITION_MODE

SHOW SPANNER.AUTO_PARTITION_MODE
SET SPANNER.AUTO_PARTITION_MODE {TO|=} { true | false}

屬性類型為 BOOL,指出連線是否會自動針對執行的所有查詢使用分割查詢。

  • 如果希望連線針對所有執行的查詢使用區隔查詢,請將這個變數設為 true
  • 如要讓連線在所有查詢中使用 Data Boost,請一併將 SPANNER.DATA_BOOST_ENABLED 設為 true

預設為 false

▶ 範例:執行 (按一下即可展開)
這個範例會使用 Data Boost 執行兩個 PGAdapter 查詢

SET SPANNER.AUTO_PARTITION_MODE = true
SET SPANNER.DATA_BOOST_ENABLED = true
SELECT first_name, last_name FROM singers
SELECT singer_id, title FROM albums

執行分區查詢

RUN PARTITIONED QUERY <sql>

將查詢做為 Spanner 上的分區查詢執行。請確認 SPANNER.DATA_BOOST_ENABLED 已設為 true,以便使用 Data Boost 執行查詢:

SET SPANNER.DATA_BOOST_ENABLED = true
RUN PARTITIONED QUERY SELECT FirstName, LastName FROM Singers

PGAdapter 會在內部分割查詢,並並行執行分區。系統會將結果合併為一個結果集,並傳回至應用程式。您可以使用 SPANNER.MAX_PARTITIONED_PARALLELISM 變數設定執行分區的工作站執行緒數量。

PARTITION <SQL>

PARTITION <sql>

建立分區清單,以便對 Spanner 執行查詢,並傳回分區符記清單。每個區塊權杖都可以使用 RUN PARTITION 'partition-token' 指令,在相同或其他 PGAdapter 例項的個別連線上執行。

▶ 範例:區隔查詢 (按一下即可展開)
以下範例說明如何分割查詢,然後使用 PGAdapter 分別執行每個分區。

-- Partition a query. This returns a list of partition tokens that can be
-- executed either on this connection or on any other connection to the same
-- database.
PARTITION SELECT FirstName, LastName FROM Singers;

-- Run the partitions that were returned from the previous statement.
RUN PARTITION 'partition-token-1';
RUN PARTITION 'partition-token-2';

RUN PARTITION 'partition-token'

RUN PARTITION 'partition-token'

執行先前由 PARTITION 指令傳回的查詢區塊。您可以在與建立區塊符號的資料庫相同的任何資料庫上執行這項指令。

SPANNER.MAX_PARTITIONED_PARALLELISM

類型為 bigint 的屬性,指出 PGAdapter 用來執行區隔作業的 worker 執行緒數量。這個值用於:

  • SPANNER.AUTO_PARTITION_MODE = true
  • RUN PARTITIONED QUERY sql
SHOW SPANNER.MAX_PARTITIONED_PARALLELISM
SET SPANNER.MAX_PARTITIONED_PARALLELISM {TO|=} <bigint>

設定 PGAdapter 可用來執行分割區的工作站執行緒數量上限。將這個值設為 0 可指示 PGAdapter 使用用戶端電腦上的 CPU 核心數做為上限。

預設值為 0

後續步驟