本頁說明如何在唯讀與讀寫交易內容之外,在 Spanner 中進行讀取作業。如果您符合下列任一種情況,請前往交易頁面:
若您需要根據一或多次讀取的值進行寫入,您必須將讀取當做讀寫交易的一部分執行。詳情請參閱讀寫交易。
若您要發出多個讀取呼叫,並需要一致的資料結果,您必須將讀取當做唯讀交易的一部分來執行。詳情請參閱唯讀交易。
讀取類型
Spanner 提供兩種讀取方式,讓您決定資料的即時性:
- 「強式讀取」以目前的時間戳記讀取,並且保證會看到在此讀取開始之前修訂的所有資料。Spanner 預設使用強式讀取來執行讀取請求。
- 「過時讀取」以過去的時間戳記讀取。若應用程式易受到延遲影響但允許過時資料,採用過時讀取可提供效能優勢。
如要選擇想要的讀取類型,請在讀取請求上設定時間戳記範圍。選擇時間戳記範圍時,請使用以下最佳做法:
盡可能選擇強式讀取。這是 Spanner 讀取作業預設的時間戳記範圍。強式讀取保證可看到在交易開始前修訂的所有交易效果,與哪個備用資源接收讀取作業無關。因為這點,強式讀取讓應用程式碼變得更簡單、應用程式變得更可靠。如要進一步瞭解 Spanner 的一致性屬性,請參閱「TrueTime 與外部一致性」。
在某些情況下,若因延遲導致強式讀取無法執行,則採用過時讀取 (限定過時或精準過時),即可在不需要讀取最近資料時改善效能。如「複製作業」頁面所述,如要獲得良好效能,合理的過時程度值是 15 秒。
使用資料庫角色讀取資料
如果您是精細存取控管使用者,必須選取資料庫角色,才能執行 SQL 陳述式和查詢,以及對資料庫執行資料列作業。在您變更角色前,系統會在整個工作階段中保留您選取的角色。
如要瞭解如何使用資料庫角色執行讀取作業,請參閱「使用精細的存取權控管機制存取資料庫」。
單一讀取方法
Spanner 針對以下內容,支援資料庫的單一讀取方法 (也就是交易內容以外的讀取作業):
- 將讀取作業當做 SQL 查詢陳述式執行,或使用 Spanner 的讀取 API。
- 從資料表中的單一資料列或多個資料列執行強式讀取。
- 從資料表中的單一資料列或多個資料列執行過時讀取。
- 從次要索引中的單一資料列或多個資料列讀取。
如要將單一讀取作業導向多區域執行個體設定或自訂區域設定(含選用的唯讀區域) 中的特定副本或區域,請參閱「導向讀取作業」。
以下章節說明如何運用 Spanner 用戶端程式庫,來使用讀取方法。
執行查詢
以下說明如何對資料庫執行 SQL 查詢陳述式。
GoogleSQL
C++
使用 ExecuteQuery()
對資料庫執行 SQL 查詢陳述式。
C#
使用 ExecuteReaderAsync()
查詢資料庫。
Go
使用 Client.Single().Query
查詢資料庫。
Java
使用 ReadContext.executeQuery
查詢資料庫。
Node.js
使用 Database.run
查詢資料庫。
PHP
使用 Database::execute
查詢資料庫。
Python
使用 Database.execute_sql
查詢資料庫。
Ruby
使用 Client#execute
查詢資料庫。
撰寫 SQL 陳述式時,請參閱 SQL 查詢語法與函式和運算子參考資料。
執行強式讀取
以下說明如何對資料庫中零或多筆資料列執行強式讀取。
GoogleSQL
C++
讀取資料的程式碼與之前透過執行 SQL 查詢來查詢 Spanner 的範例相同。
C#
讀取資料的程式碼與之前透過執行 SQL 查詢來查詢 Spanner 的範例相同。
Go
使用 Client.Single().Read
讀取資料庫中的資料列。
這個範例會使用 AllKeys
定義一組索引鍵或索引鍵範圍以供讀取。
Java
使用 ReadContext.read
讀取資料庫中的資料列。
這個範例會使用 KeySet
定義一組索引鍵或索引鍵範圍以供讀取。
Node.js
使用 Table.read
讀取資料庫中的資料列。
這個範例會使用 keySet
定義一組索引鍵或索引鍵範圍以供讀取。
PHP
使用 Database::read
讀取資料庫中的資料列。
這個範例會使用 keySet
定義一組索引鍵或索引鍵範圍以供讀取。
Python
使用 Database.read
讀取資料庫中的資料列。
這個範例會使用 KeySet
定義一組索引鍵或索引鍵範圍以供讀取。
Ruby
使用 Client#read
讀取資料庫中的資料列。
執行過時讀取
以下範例程式碼顯示如何使用精準的過時程度時間戳記範圍,執行資料庫中零或多筆資料列的過時讀取。如要瞭解如何使用「受限過時程度」時間戳記界限執行過時讀取,請參閱範例程式碼後面的備註。如要進一步瞭解不同的可用時間戳記界限類型,請參閱時間戳記界限。
GoogleSQL
C++
搭配使用 ExecuteQuery()
與 MakeReadOnlyTransaction()
和 Transaction::ReadOnlyOptions()
,執行過時讀取。
C#
在具有指定 TimestampBound.OfExactStaleness()
值的 connection
上使用 BeginReadOnlyTransactionAsync
方法,即可查詢資料庫。
Go
使用 Client.ReadOnlyTransaction().WithTimestampBound()
並指定 ExactStaleness
值,使用精準過時程度時間戳記範圍,從資料庫執行資料列讀取作業。
這個範例會使用 AllKeys
定義一組索引鍵或索引鍵範圍以供讀取。
Java
使用指定了 TimestampBound.ofExactStaleness()
的 ReadContext
之 read
方法,使用精準過時程度時間戳記範圍,從資料庫執行資料列讀取作業。
這個範例會使用 KeySet
定義一組索引鍵或索引鍵範圍以供讀取。
Node.js
使用 Table.read
搭配 exactStaleness
選項,使用精準過時程度時間戳記範圍,從資料庫執行資料列讀取作業。
這個範例會使用 keySet
定義一組索引鍵或索引鍵範圍以供讀取。
PHP
使用 Database::read
搭配 exactStaleness
值,使用精準過時程度時間戳記範圍,從資料庫執行資料列讀取作業。
這個範例會使用 keySet
定義一組索引鍵或索引鍵範圍以供讀取。
Python
使用指定了 exact_staleness
值的 Database
snapshot
之 read
方法,用精準過時程度時間戳記範圍,從資料庫執行資料列讀取作業。
這個範例會使用 KeySet
定義一組索引鍵或索引鍵範圍以供讀取。
Ruby
使用指定了 staleness
值 (以秒計算) 的快照 Client
之 read
方法,使用精準過時程度時間戳記範圍,從資料庫執行資料列讀取作業。
使用索引執行讀取作業
以下說明如何使用索引,從資料庫讀取零個或多個資料列:
GoogleSQL
C++
使用 Read()
函式,透過索引執行讀取作業。
C#
您可以執行明確指定索引的查詢,使用索引讀取資料:
Go
使用 Client.Single().ReadUsingIndex
,透過索引從資料庫讀取資料列。
Java
使用 ReadContext.readUsingIndex
,透過索引從資料庫讀取資料列。
Node.js
利用 Table.read
並在查詢中指定索引,以使用索引從資料庫讀取資料列。
PHP
利用 Database::read
並指定索引,以使用索引從資料庫讀取資料列。
Python
利用 Database.read
並指定索引,以使用索引從資料庫讀取資料列。
Ruby
利用 Client#read
並指定索引,以使用索引從資料庫讀取資料列。
並行讀取資料
從 Spanner 執行大量讀取或查詢作業時,如果涉及大量資料,可以使用 PartitionQuery
API 加快取得結果。API 會將查詢分成批次或分區,並使用多部機器平行擷取分區。請注意,使用 PartitionQuery
API 會導致延遲時間較長,因為這項 API 僅適用於大量作業,例如匯出或掃描整個資料庫。
您可以使用 Spanner 用戶端程式庫,平行執行任何讀取 API 作業。不過,只有在查詢可進行根分區時,才能將 SQL 查詢分區。如要讓查詢成為可進行根分區的查詢,查詢計畫必須符合下列其中一項條件:
PartitionQuery
API 會以批次模式執行查詢。以批次模式執行查詢時,Spanner 可能會選擇可進行查詢根分割的查詢執行計畫。因此,PartitionQuery
API 和 Spanner Studio 可能會對相同查詢使用不同的查詢執行計畫。您可能無法在 Spanner Studio 取得 PartitionQuery
API 使用的查詢執行計畫。
對於這類已分割的查詢,您可以選擇啟用 Spanner Data Boost。 Data Boost 可讓您執行大型分析查詢,幾乎不會對已佈建 Spanner 執行個體上的現有工作負載造成影響。本頁面的 C++、Go、Java、Node.js 和 Python 程式碼範例,說明如何啟用資料加速功能。
如要進一步瞭解 Data Boost,請參閱「Data Boost 總覽」。
GoogleSQL
C++
此範例擷取 Singers
資料表的 SQL 查詢分區,並且透過以下步驟在每個分區執行查詢:
- 建立 Spanner 批次交易。
- 為查詢產生分區,讓分區分散到多個工作站。
- 擷取每個分區的查詢結果。
C#
此範例擷取 Singers
資料表的 SQL 查詢分區,並且透過以下步驟在每個分區執行查詢:
- 建立 Spanner 批次交易。
- 為查詢產生分區,讓分區分散到多個工作站。
- 擷取每個分區的查詢結果。
Go
此範例擷取 Singers
資料表的 SQL 查詢分區,並且透過以下步驟在每個分區執行查詢:
- 建立 Spanner 用戶端和交易。
- 為查詢產生分區,讓分區分散到多個工作站。
- 擷取每個分區的查詢結果。
Java
此範例擷取 Singers
資料表的 SQL 查詢分區,並且透過以下步驟在每個分區執行查詢:
- 建立 Spanner 批次用戶端和交易。
- 產生查詢的分區,將分區分散到多個工作站。
- 擷取每個分區的查詢結果。
Node.js
此範例擷取 Singers
資料表的 SQL 查詢分區,並且透過以下步驟在每個分區執行查詢:
- 建立 Spanner 用戶端和批次。
- 為查詢產生分區,讓分區分散到多個工作站。
- 擷取每個分區的查詢結果。
PHP
此範例擷取 Singers
資料表的 SQL 查詢分區,並且透過以下步驟在每個分區執行查詢:
- 建立 Spanner 用戶端和批次。
- 為查詢產生分區,讓分區分散到多個工作站。
- 擷取每個分區的查詢結果。
Python
此範例擷取 Singers
資料表的 SQL 查詢分區,並且透過以下步驟在每個分區執行查詢:
- 建立 Spanner 用戶端和批次交易。
- 為查詢產生分區,讓分區分散到多個工作站。
- 擷取每個分區的查詢結果。
Ruby
此範例擷取 Singers
資料表的 SQL 查詢分區,並且透過以下步驟在每個分區執行查詢:
- 建立 Spanner 批次用戶端。
- 建立查詢的分區,將分區分散到多個工作站。
- 擷取每個分區的查詢結果。