本頁面說明如何偵測查詢執行速度的變化、檢查查詢執行計畫,以及視需要為日後的查詢指定其他索引。
使用 REST API 取得 JSON 格式的查詢詳細設定檔
根據預設,執行查詢時,API 只會傳回陳述式結果。這是因為 queryMode 設為 NORMAL。如要在查詢結果中加入詳細的執行統計資料,請將 queryMode 設為 PROFILE。
建立工作階段
更新查詢模式前,請先建立工作階段,代表與 Spanner 資料庫服務的通訊管道。
- 前往「
projects.instances.databases.sessions.create」頁面。 請以下列格式提供專案 ID、執行個體 ID 和資料庫 ID:
projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID按一下 [Execute] (執行)。回應會以下列格式顯示您建立的工作階段:
projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID/sessions/SESSION_ID在下一個步驟中,您將使用這個工作階段剖析查詢。在連續使用之間,工作階段最多可保持有效一小時,之後 Spanner 就會刪除工作階段。
如要進一步瞭解如何使用工作階段,請參閱「工作階段」。
剖析查詢
為查詢啟用 PROFILE 模式。
- 前往
projects.instances.databases.sessions.executeSql頁面。 在「session」部分,輸入您在「建立工作階段」中建立的工作階段 ID:
projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID/sessions/SESSION_ID在「Request body」部分,使用下列內容:
{ "sql": "SQL_QUERY", "queryMode": "PROFILE" }按一下 [Execute] (執行)。回應內容包括查詢結果、查詢計畫和查詢的執行統計資料。
排解索引使用問題
使用 SQL 查詢查詢資料時,Spanner 會自動使用任何可能更有效率擷取資料的次要索引。不過,在少數情況下,Spanner 可能會選擇導致查詢速度變慢的索引。因此,您可能會發現某些查詢的執行速度比預期慢。
偵測查詢執行速度的變化
進行下列任一變更後,查詢執行速度最有可能發生變化:
- 大幅變更大量具有次要索引的現有資料。
- 新增、變更或捨棄次要索引。
您可以使用幾種不同的工具,找出 Spanner 執行速度比平常慢的特定查詢:
- 查詢洞察和查詢統計資料。
您使用 Cloud Monitoring 擷取及分析的應用程式專屬指標。舉例來說,您可以監控「Count of queries」(查詢次數) 指標,判斷執行個體在一段時間內的查詢次數,並找出執行查詢時使用的查詢最佳化工具版本。
評估應用程式效能的用戶端監控工具。
新建立資料庫的最佳化工具統計資料
如果查詢的是新建立的資料庫,且資料是剛插入或匯入,Spanner 可能不會選取最合適的索引,因為查詢最佳化工具最多需要三天,才能自動收集統計資料。如要盡快最佳化新 Spanner 資料庫的索引使用情形,可以手動建構新的統計資料套件。
查看結構定義
找到速度變慢的查詢後,請查看該查詢的 SQL 陳述式,並找出陳述式使用的資料表,以及從這些資料表擷取的資料欄。
接著,找出這些資料表的次要索引。判斷是否有任何索引包含您查詢的資料欄,這表示 Spanner 可能會使用其中一個索引來處理查詢。
- 如果有適用的索引,下一步是找出 Spanner 用於查詢的索引。
如果沒有適用的索引,請使用
gcloud spanner operations list指令,檢查最近是否捨棄了適用的索引:gcloud spanner operations list \ --instance=INSTANCE \ --database=DATABASE \ --filter="@TYPE:UpdateDatabaseDdlMetadata"如果捨棄適用的索引,這項變更可能會影響查詢效能。將次要索引重新加入資料表。Spanner 新增索引後,請再次執行查詢並查看效能。如果效能未改善,下一步是找出 Spanner 用於查詢的索引。
如果您未捨棄適用的索引,則索引選取不會導致查詢效能降低。請查看資料或使用模式是否有其他異動,可能影響成效。
找出查詢使用的索引
。如要瞭解 Spanner 使用哪個索引處理查詢,請在 Google Cloud 控制台中查看查詢執行計畫:
前往Google Cloud 控制台的 Spanner「Instances」(執行個體) 頁面。
按一下要查詢的執行個體名稱。
在導覽選單中,選取要查詢的資料庫,然後按一下「 Spanner Studio」。
輸入要測試的查詢。
在「Run query」(執行查詢) 選單中,選取「Explanation only」(僅限說明)。Spanner 會顯示查詢計畫。
在查詢計畫中,尋找至少一個下列運算子:
- 資料表掃描
- 索引掃描
- Cross apply 或分散式 cross apply
以下各節將說明每個運算子的意義。
資料表掃描運算子
資料表掃描運算子表示 Spanner 未使用次要索引:
舉例來說,假設 Albums 資料表沒有任何次要索引,而您執行下列查詢:
SELECT AlbumTitle FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");
由於沒有可用的索引,查詢計畫會包含資料表掃描運算子。
索引掃描運算子
索引掃描運算子表示 Spanner 在處理查詢時使用了次要索引:
舉例來說,假設您在 Albums 資料表中新增索引:
CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);
接著執行下列查詢:
SELECT AlbumTitle FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");
AlbumsByAlbumTitle 索引包含 AlbumTitle,這是查詢選取的唯一資料欄。因此,查詢計畫會包含索引掃描運算子。
交叉套用運算子
在某些情況下,Spanner 使用的索引只包含查詢選取的部分資料欄。因此,Spanner 必須將索引與基礎資料表彙整。
發生這類彙整時,查詢計畫會包含 cross apply 或分散式 cross apply 運算子,並具有下列輸入內容:
- 資料表索引的索引掃描運算子
- 資料表掃描運算子,用於擁有索引的資料表
舉例來說,假設您在 Albums 資料表中新增索引:
CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);
接著執行下列查詢:
SELECT * FROM Albums WHERE STARTS_WITH(AlbumTitle, "Now");
AlbumsByAlbumTitle 索引包含 AlbumTitle,但查詢會選取資料表中的所有資料欄,而不只是 AlbumTitle。因此,查詢計畫包含分散式 cross apply 運算子,並以 AlbumsByAlbumTitle 的索引掃描和 Albums 的資料表掃描做為輸入內容。
選擇其他索引
找到 Spanner 用於查詢的索引後,請嘗試使用其他索引執行查詢,或掃描基礎資料表,而非使用索引。如要指定索引,請在查詢中加入 FORCE_INDEX 指令。
如果找到更快的查詢版本,請更新應用程式,改用更快的版本。
選擇索引的指南
請按照下列指南,決定要測試查詢的索引:
如果查詢符合上述任一條件,請嘗試使用基礎資料表,而非次要索引:
- 查詢會檢查基礎資料表主鍵的前置字串是否相等 (例如
SELECT * FROM Albums WHERE SingerId = 1)。 - 大量資料列符合查詢述詞 (例如
SELECT * FROM Albums WHERE AlbumTitle != "There Is No Album With This Title")。 - 查詢使用的基礎資料表只有幾百列。
- 查詢會檢查基礎資料表主鍵的前置字串是否相等 (例如
如果查詢包含非常具選擇性的述詞 (例如
REGEXP_CONTAINS、STARTS_WITH、<、<=、>、>=或!=),請嘗試使用包含述詞中所用資料欄的索引。
測試更新後的查詢
使用 Google Cloud 控制台測試更新後的查詢,並瞭解處理查詢所需的時間。
如果查詢包含查詢參數,且查詢參數繫結至某些值的頻率遠高於其他值,請在測試中將查詢參數繫結至其中一個值。舉例來說,如果查詢包含 WHERE country = @countryId 等述詞,且幾乎所有查詢都將 @countryId 繫結至 US 值,則請將 @countryId 繫結至 US,以便進行效能測試。這種做法有助於最佳化最常執行的查詢。
如要在 Google Cloud 控制台測試更新後的查詢,請按照下列步驟操作:
前往Google Cloud 控制台的 Spanner「Instances」(執行個體) 頁面。
按一下要查詢的執行個體名稱。
在導覽選單中,按一下要查詢的資料庫,然後點選 「Spanner Studio」。
輸入要測試的查詢 (包括
FORCE_INDEX指令),然後按一下「Run query」(執行查詢)。Google Cloud 控制台會開啟「Results table」(結果資料表) 分頁,然後顯示查詢結果,包括 Spanner 服務處理查詢所需的時間。
這項指標不包含其他延遲來源,例如 Google Cloud 控制台解讀及顯示查詢結果所需的時間。
查詢調節
執行查詢時,Spanner 可能會在多個位置限制查詢。
用戶端等待時間和伺服器佇列延遲是兩項主要的節流指標。
用戶端等待時間
用戶端等待時間是指 Spanner 用戶端等待應用程式取用結果的時間。這表示用戶端處理結果的速度,比不上 Spanner 產生結果的速度。如要解決這個問題,請提高取用應用程式的效能,或在用戶端應用程式中緩衝所有結果,並在查詢完成後處理這些結果。
伺服器佇列延遲
如果處理伺服器延遲排定查詢執行作業,就會發生伺服器佇列延遲。在「Query summary」(查詢摘要) 窗格中,查看「Server queue delay」(伺服器佇列延遲) 指標。如果沒有這項指標,表示未發生伺服器延遲。
這項延遲可能表示執行查詢的伺服器超載。如要確認是否有熱點,請參閱「找出資料庫中的熱點」。如要排解熱點問題,請參閱「使用熱點分割統計資料排解熱點問題」。
最近變更的資料
變更資料表資料可能會影響查詢效能。
統計資料套件過時
如果最佳化工具使用過時的統計資料套件,可能會選擇次佳的方案。在「Query summary」(查詢摘要) 部分,您可以查看統計資料套件。如果套件過時或遺失,請執行 ANALYZE,確保最佳化工具統計資料為最新狀態。

詳情請參閱「統計資料套件」。
表格內容異動
查詢效能取決於查詢處理的資料。解決查詢效能問題的最佳方式,取決於資料變更的方式:
- 值分布偏斜:統計資料套件會擷取這項偏斜,但查詢最佳化工具只有在查詢中使用常值時,才能使用這項資訊。
- 資料列數量大幅變更:評估資料表大小增加時,述詞是否能充分篩選資料列。
- 值大小偏斜:值大小偏斜與昂貴的純量述詞搭配使用時會產生問題 (例如對包含大型字串的
STRING值執行LIKE述詞)。
如要進一步瞭解查詢執行情形,請使用 REST API。