本頁面說明如何使用「查詢洞察」資訊主頁,偵測及分析 Spanner 效能問題。
查詢洞察總覽
查詢洞察可協助您偵測及診斷 Spanner 資料庫的查詢和 DML (INSERT、UPDATE 和 DELETE) 陳述式效能問題。這項功能支援直覺化的監控工具,並提供診斷資訊,協助您在偵測到效能問題後,進一步找出根本原因。
查詢洞察會引導您完成下列步驟,協助您提升 Spanner 查詢效能:
查詢洞察功能適用於單一區域和多區域設定。
定價
查詢洞察功能不會產生額外費用。
資料保留
查詢洞察最多會保留 30 天的資料。
對於「CPU 總使用率 (按『查詢』或『要求』標記顯示)」圖表,Spanner 會從 SPANNER_SYS.QUERY_STATS_TOP_* 資料表擷取資料。這些資料表最多可保留 30 天。詳情請參閱「資料保留」一文。
必要的角色
視您是 IAM 使用者或精細存取控管使用者而定,您需要不同的 IAM 角色和權限。
Identity and Access Management (IAM) 使用者
如要取得查看「查詢洞察」頁面所需的權限,請要求管理員在執行個體中授予您下列 IAM 角色:
- Cloud Spanner 檢視者 (
roles/spanner.viewer) - Cloud Spanner 資料庫讀取者 (
roles/spanner.databaseReader)
如要查看「查詢洞察」頁面,必須具備「Cloud Spanner 資料庫讀取者」(
roles/spanner.databaseReader) 角色中的下列權限:
spanner.databases.beginReadOnlyTransactionspanner.databases.selectspanner.sessions.create
精細的存取控管使用者
如果您是精細存取權控管機制使用者,請確認您已完成下列事項:
- 擁有 Cloud Spanner 檢視者(
roles/spanner.viewer) 角色 - 具備精細的存取控管權限,並獲派
spanner_sys_reader系統角色或其成員角色之一。 - 在資料庫總覽頁面,選取
spanner_sys_reader或成員角色做為目前的系統角色。
詳情請參閱「關於精細存取控管」和「精細存取控管系統角色」。
查詢洞察資訊主頁
查詢洞察資訊主頁會根據您選取的資料庫和日期範圍,顯示查詢負載。查詢負載是指所選日期範圍內,執行個體中所有查詢的總 CPU 使用率。資訊主頁提供一系列篩選器,可協助您查看查詢負載。
如要查看資料庫的「查詢洞察」資訊主頁,請按照下列步驟操作:
- 在左側導覽面板中選取「查詢洞察」。查詢洞察資訊主頁隨即開啟。
- 從「Databases」(資料庫) 清單中選取資料庫。資訊主頁會顯示資料庫的查詢負載資訊。
資訊主頁包含下列區域:
- 資料庫清單:篩選特定資料庫或所有資料庫的查詢負載。
- 時間範圍篩選器:依時間範圍 (例如小時、天或自訂範圍) 篩選查詢負載。
- CPU 總使用率 (所有查詢) 圖表:顯示所有查詢的 CPU 使用率平均值 (以每分鐘 CPU 秒數為單位)。
- 「Total CPU Utilization (per Query or Request tag)」(CPU 總使用率 (依「查詢」或「要求」標記顯示)) 圖表:顯示每個查詢或要求標記的平均 CPU 使用率 (以每分鐘 CPU 秒數為單位)。
- TopN 查詢和標記表格:顯示熱門查詢和要求標記清單,並依 CPU 使用率排序。請參閱「找出可能有問題的查詢或標記」。

資訊主頁效能
使用查詢參數或為查詢加上標記,提升查詢洞察效能。如果您未將查詢參數化或加上標記,系統可能會傳回過多結果,導致 TopN 查詢和標記表格無法正常載入。
確認效率不彰的查詢是否導致 CPU 使用率偏高
CPU 總使用率是衡量所選資料庫中執行的查詢作業,過去一段時間的平均 CPU 使用率 (以每分鐘 CPU 使用秒數為單位)。

查看圖表,瞭解下列問題的答案:
哪個資料庫正在承受負載?從「資料庫」清單中選取不同資料庫,找出負載最高的資料庫。如要找出負載最高的資料庫,您也可以在Google Cloud 控制台中查看資料庫的「CPU utilization - total」(CPU 使用率 - 總計) 圖表。

CPU 使用率是否偏高?圖表是否會隨時間呈現尖峰或高點?如果 CPU 使用率不高,問題就不在於查詢。
CPU 使用率偏高多久了?是最近突然暴增,還是持續一段時間都居高不下?使用範圍選取器選取不同時間範圍,瞭解問題持續時間。放大即可查看查詢負載尖峰時段。縮小時間軸,最多可查看一週的記錄。
如果圖表顯示整體執行個體 CPU 使用率有尖峰或上升趨勢,則最有可能的原因是有一或多個耗用大量資源的查詢。接下來,您可以找出可能導致問題的查詢或要求代碼,進一步進行偵錯。
找出可能有問題的查詢或要求標記
如要找出可能有問題的查詢或要求標記,請觀察「前 N 個熱門查詢」部分:

從這裡可以看出,指紋為 3216067328234137024 的查詢 CPU 使用率偏高,可能會有問題。
「前幾名查詢」表格會概略顯示在所選時間範圍內,CPU 用量最高的查詢,並從高到低排序。TopN 查詢數量上限為 100。
對於圖表,我們會從「前 N 個熱門查詢」統計資料表擷取資料,該資料表有三種不同的精細程度:1 分鐘、10 分鐘和 1 小時。圖表中的每個資料點值,代表一分鐘間隔的平均值。
建議您為 SQL 查詢新增標記。查詢標記有助於您找出較高層級建構中的問題,例如商業邏輯或微服務。

表格會顯示下列屬性:
- 指紋:要求標記的雜湊,如果沒有標記,則為查詢文字的雜湊。
查詢或要求標記:如果查詢有相關聯的標記,系統會顯示要求標記。如果多個查詢具有相同的標記字串,系統會將這些查詢的統計資料歸入同一列,並以
REQUEST_TAG值比對標記字串。如要進一步瞭解如何使用要求標記,請參閱「使用要求標記和交易標記疑難排解問題」。如果查詢沒有相關聯的標記,系統會顯示 SQL 查詢,並截斷至約 64 KB。如果是批次 DML,SQL 陳述式會扁平化為單一資料列,並以分號分隔符號串連。系統會先移除連續相同的 SQL 文字,再截斷文字。
查詢類型:指出查詢是
PARTITIONED_QUERY或QUERY。PARTITIONED_QUERY是指含有partitionToken的查詢,則來自 PartitionQuery API。所有其他查詢和 DML 陳述式都會以QUERY查詢 類型表示。CPU 使用率:查詢消耗的 CPU 資源,以百分比表示,相對於該時間間隔內資料庫上執行的所有查詢所使用的 CPU 資源總數,並顯示在範圍為 0 到 100 的水平長條上。
建議:Spanner 會分析查詢,判斷是否能透過改良索引提升效能。如果是,系統會建議建立新索引或修改現有索引,提高查詢效能。詳情請參閱「使用 Spanner 索引建議工具」。
CPU (%):查詢消耗的 CPU 資源,以該時間間隔內資料庫上執行的所有查詢所使用的 CPU 資源總量百分比表示。
執行次數:Spanner 在間隔期間觀察到的查詢執行平均速率,以每分鐘執行次數為單位。
平均延遲時間 (毫秒):資料庫中每項查詢執行的平均時間長度 (以微秒為單位)。這項平均值不包含結果集的編碼和傳輸時間,以及額外負荷。
平均掃描列數:查詢掃描的平均列數,不含已刪除的值。
平均傳回列數:查詢傳回的平均列數。
傳回的位元組數:查詢傳回的資料位元組數,不含傳輸編碼額外負荷。
圖表之間可能存在差異
您可能會發現「CPU 總使用率 (所有查詢)」圖表與「CPU 總使用率 (按『查詢』或『要求』標記顯示)」圖表之間有些差異。可能導致這種情況的原因有兩個:
不同的資料來源:提供「CPU 總用量 (所有查詢)」圖表的 Cloud Monitoring 資料通常更準確,因為這類資料每分鐘都會推送,且保留期限為 45 天。另一方面,系統資料表資料會提供「CPU 總使用率」(按「查詢」或「要求」標記顯示) 圖表,但這些資料可能會在 10 分鐘 (或 1 小時) 內取平均值,因此我們可能會遺失「CPU 總使用率」(所有查詢) 圖表中的高精細度資料。
不同的匯總時間範圍:兩張圖表的匯總時間範圍不同。舉例來說,檢查超過 6 小時的事件時,我們會查詢
SPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE資料表。在這種情況下,10:01 發生的事件會在 10 分鐘內匯總,並顯示在與 10:10 時間戳記對應的系統資料表中。
以下螢幕截圖顯示這類差異的範例。

分析特定查詢或要求標記
如要判斷查詢或要求標記是否為問題的根本原因,請點選看起來負載最高或耗時最長的查詢或要求標記。您可以一次選取多個查詢和要求標記。
將滑鼠游標懸停在圖表上,即可查看時間軸上各查詢的 CPU 使用率 (以秒為單位)。
請查看下列項目,嘗試縮小問題範圍:
- 負荷過高多久了?現在只有高嗎?還是長期偏高?變更日期範圍,找出查詢開始表現不佳的日期和時間。
- CPU 使用率是否出現尖峰?您可以變更時間範圍,研究查詢的 CPU 使用率記錄。
- 資源用量為何?這項查詢與其他查詢有何關聯? 查看表格,比較其他查詢與所選查詢的資料。 兩者有重大差異嗎?
如要確認所選查詢是否導致 CPU 使用率偏高,可以深入瞭解特定查詢形狀 (或要求標記) 的詳細資料,並在「查詢詳細資料」頁面進一步分析。
查看「查詢詳細資料」頁面
如要以圖形形式查看特定查詢形狀或要求標記的詳細資料,請按一下與查詢或要求標記相關聯的指紋。「查詢詳細資料」頁面隨即開啟。

「查詢詳細資料」頁面會顯示下列資訊:
- 查詢詳細資料文字:SQL 查詢文字,截斷至約 64 KB。如果多個查詢項目具有相同的標記字串,系統會將這些查詢項目的統計資料分組,並在單一資料列中顯示,且 REQUEST_TAG 會與該標記字串相符。這個欄位只會顯示其中一個查詢的文字。如果是批次 DML,系統會將一組 SQL 陳述式攤平為單一資料列,並使用半形分號分隔符號串連。系統會先移除連續相同的 SQL 文字,再截斷文字。
- 下列欄位的值:
- 執行次數:Spanner 在間隔期間看到的查詢執行平均速率,以每分鐘執行次數為單位。
- 平均 CPU (毫秒):在時間間隔內,執行個體 CPU 資源查詢的平均 CPU 資源耗用量 (以毫秒為單位)。
- 平均延遲時間 (毫秒):資料庫中每次查詢執行的平均時間長度 (以毫秒為單位)。這項平均值不包含結果集和額外負荷的編碼和傳輸時間。
- 平均傳回列數:查詢傳回的平均列數。
- 平均掃描列數:查詢掃描的平均列數,不包括已刪除的值。
- 平均位元組數:查詢傳回的資料位元組數,不含傳輸編碼額外負荷。
- 查詢計畫樣本圖表:圖表上的每個點代表特定時間的查詢計畫樣本,以及該查詢的特定延遲時間。按一下圖表中的任一點,即可查看查詢計畫,並以視覺化的方式瞭解查詢執行期間採取的步驟。注意:系統不支援查詢計畫,但可使用從 PartitionQuery API 取得的 partitionTokens,以及分割 DML 查詢。
查詢計畫視覺化工具:顯示所選的查詢計畫樣本。Spanner 提供下列版面配置選項:
- 樹狀檢視畫面:樹狀檢視畫面會以圖表形式呈現查詢計畫,其中每個節點或卡片代表一個疊代器,會從輸入內容取用資料列,並產生資料列給父項。點選各個疊代器即可查看詳細資訊。
序列檢視畫面:序列檢視畫面會以階層式表格呈現查詢計畫,每個資料列代表一個運算子。按一下各個資料列即可展開資訊。

表格會顯示下列資料欄:
- 名稱:營運者的名稱。
- 機器群組:這個運算子執行的機器群組。
- 延遲時間:執行目前作業時經過的時間長度。這可能超過 CPU 作業時間 (例如運算子因遠端呼叫或檔案系統延遲而等待時,就有可能超過)。
- 累計延遲時間:以這個運算子為根層級的整個子樹狀結構,執行作業耗費的時間長度。這不包括方案建立時間和其他營運負載,因此累計延遲時間可能短於查詢總時長。
- CPU 時間:執行查詢耗費的總 CPU 作業時間。 不含網路延遲時間。查詢執行作業的某些部分可能會平行處理,因此 CPU 作業時間有可能超過總執行時間。舉例來說,如果查詢在 1 毫秒內執行 10 項平行作業,執行時間為 1 毫秒,不過 CPU 作業時間會是 10 毫秒。
- 傳回的資料列數:運算子傳回的資料列數。
查詢延遲時間圖表:顯示所選查詢在一段時間內的查詢延遲時間值。以及平均延遲時間。
CPU 使用率圖表:顯示查詢在一段時間內的 CPU 使用率 (百分比)。還會顯示平均 CPU 使用率。
執行次數/失敗圖表:顯示一段時間範圍內的平均查詢執行率 (每分鐘執行次數),以及平均查詢執行失敗率 (每分鐘失敗執行次數)。
掃描的資料列數圖表:顯示查詢在一段時間範圍內掃描的資料列數。
傳回的資料列圖表:顯示查詢在一段時間範圍內傳回的資料列數。
日期範圍篩選器:依日期範圍 (例如小時、天或自訂範圍) 篩選查詢詳細資料。
對於圖表,我們會從「前 N 個熱門查詢」統計資料表擷取資料,該資料表有三種不同的精細程度:1 分鐘、10 分鐘和 1 小時。圖表中的每個資料點值,代表一分鐘間隔的平均值。
在稽核記錄中搜尋查詢的所有執行作業
如要在 Cloud 稽核記錄中搜尋特定查詢指紋的所有執行作業,請查詢稽核記錄,並搜尋與 TopN 查詢統計資料表中的 Fingerprint 欄位相符的任何 query_fingerprint。詳情請參閱「查詢和查看記錄檔總覽」。請使用這個方法找出啟動查詢的使用者。