本頁說明如何使用查詢洞察資訊主頁,偵測及分析 Spanner 效能問題。
查詢洞察總覽
查詢洞察可協助您偵測及診斷 Spanner 資料庫的查詢和 DML (INSERT
、UPDATE
和 DELETE
) 陳述式效能問題。這項功能支援直覺化的監控工具,並提供診斷資訊,協助您在偵測到效能問題後,進一步找出根本原因。
查詢洞察會引導您完成下列步驟,協助您提升 Spanner 查詢效能:
查詢洞察功能適用於單一區域和多區域設定。
定價
查詢洞察功能不會產生額外費用。
資料保留
查詢洞察最多會保留 30 天的資料。
在「CPU 總使用率 (按『查詢』或『要求』標記顯示)」圖表中,Spanner 會從 SPANNER_SYS.QUERY_STATS_TOP_*
資料表擷取資料。這些資料表最多可保留 30 天。詳情請參閱「資料保留」一文。
必要的角色
視您是 IAM 使用者還是精細存取權控管使用者,您需要不同的 IAM 角色和權限。
身分與存取權管理 (IAM) 使用者
如要取得查看「查詢洞察」頁面所需的權限,請要求管理員在執行個體上授予下列 IAM 角色:
-
Cloud Spanner 檢視者 (
roles/spanner.viewer
) -
Cloud Spanner 資料庫讀取者 (
roles/spanner.databaseReader
)
如要查看「查詢洞察」頁面,必須具備 Cloud Spanner 資料庫讀取者(
roles/spanner.databaseReader
) 角色的下列權限:
spanner.databases.beginReadOnlyTransaction
spanner.databases.select
spanner.sessions.create
精細的存取權控管機制使用者
如果您是精細存取權控管機制使用者,請確認您:
- 具備 Cloud Spanner 檢視者(
roles/spanner.viewer
) 角色 - 擁有精細的存取權控管權限,並獲派
spanner_sys_reader
系統角色或其中一個成員角色。 - 在資料庫總覽頁面中,選取
spanner_sys_reader
或成員角色做為目前的系統角色。
詳情請參閱「關於精細的存取權控管機制」和「精細的存取權控管系統角色」。
查詢洞察資訊主頁
查詢洞察資訊主頁會根據您選取的資料庫和時間範圍,顯示查詢負載。查詢負載可測量所選時間範圍內,執行個體中所有查詢的總 CPU 使用率。資訊主頁提供一系列篩選器,協助您查看查詢負載。
如要查看資料庫的「查詢洞察」資訊主頁,請按照下列步驟操作:
- 在左側導覽面板中選取「查詢洞察」,查詢洞察資訊主頁隨即開啟。
- 從「資料庫」清單中選取資料庫。資訊主頁會顯示資料庫的查詢負載資訊。
資訊主頁的區域包括:
- 資料庫清單:篩選特定資料庫或所有資料庫的查詢負載。
- 時間範圍篩選器:依時間範圍 (例如小時、天或自訂範圍) 篩選查詢負載。
- CPU 總使用率 (所有查詢) 圖表:顯示所有查詢的匯總負載。
- CPU 總使用率 (按「查詢」或「要求」標記顯示) 圖表:顯示每個查詢或要求標記的 CPU 使用率。
- TopN 查詢和標記表格:顯示依 CPU 使用率排序的熱門查詢和要求標記清單。請參閱「找出可能導致問題的查詢或代碼」。
資訊主頁效能
使用查詢參數或為查詢加上標記,以最佳化查詢深入分析的成效。如果您未將查詢參數化或加上標記,系統可能會傳回過多結果,導致 TopN 查詢和標記表格無法正常載入。
確認效率不彰的查詢是否導致 CPU 使用率偏高
CPU 總使用率是衡量所選資料庫中執行的查詢作業,過去在一段時間內完成的工作量 (以 CPU 使用秒數為單位)。
查看圖表,瞭解下列問題的答案:
哪個資料庫的負載過高?從「資料庫」清單中選取不同資料庫,找出負載最高的資料庫。如要找出負載最高的資料庫,您也可以在Google Cloud 控制台中查看資料庫的「CPU 使用率 - 總計」圖表。
CPU 使用率是否偏高?圖表是否顯示尖峰或長期偏高的趨勢?如果沒有看到 CPU 使用率偏高,問題就不是出在查詢。
CPU 使用率偏高的情況持續多久了?是最近才開始飆升,還是已經持續一段時間?使用範圍選取器選取不同時間範圍,瞭解問題持續時間。放大即可查看查詢負載尖峰時段。縮小時間軸,最多可查看一週的資料。
如果圖表顯示整體執行個體 CPU 使用率突然或持續升高,很可能是因為一或多個耗用資源的查詢。接著,您可以找出可能導致問題的查詢或要求代碼,進一步進行偵錯。
找出可能導致問題的查詢或要求標記
如要找出可能發生問題的查詢或要求標記,請觀察 TopN 查詢部分:
從這裡可以看出,指紋為 3216067328234137024
的查詢 CPU 使用率偏高,可能會有問題。
「TopN 查詢」表格會顯示所選時間範圍內,CPU 使用率最高的查詢總覽,並從高到低排序。TopN 查詢的數量上限為 100。
對於圖表,我們會從 TopN 查詢統計資料表擷取資料,該資料表有三種不同的精細程度:1 分鐘、10 分鐘和 1 小時。圖表中每個資料點的值,代表一分鐘間隔內的平均值。
建議您在 SQL 查詢中加入標記。查詢標記有助於找出高階建構中的問題,例如業務邏輯或微服務。
表格會顯示下列屬性:
- 指紋:要求標記的雜湊 (如有),否則為查詢的雜湊。
查詢或要求標記:如果查詢有相關聯的標記,系統會顯示要求標記。如果多個查詢具有相同的標記字串,系統會將這些查詢的統計資料歸入單一資料列,且
REQUEST_TAG
值會與標記字串相符。如要進一步瞭解如何使用要求標記,請參閱「解決要求標記和交易標記問題」。如果查詢沒有相關聯的標記,系統會顯示 SQL 查詢,只顯示約 64KB 的內容。如果是批次 DML,系統會將 SQL 陳述式扁平化為單一資料列,並使用半形分號分隔符號串連。系統會先移除連續相同的 SQL 文字,再進行截斷。
查詢類型:指出查詢是
PARTITIONED_QUERY
或QUERY
。PARTITIONED_QUERY
是指使用從 PartitionQuery API 取得的partitionToken
進行的查詢。所有其他查詢和 DML 陳述式都以QUERY
查詢類型表示。「CPU Utilization」(CPU 使用率):查詢所耗用的 CPU 資源,以百分比表示。計算方式為查詢耗用的 CPU 資源除以該時間間隔內,資料庫上所有查詢耗用的 CPU 資源總數。這個值會顯示在水平長條上,範圍為 0 到 100。
建議:Spanner 會分析查詢,判斷是否可透過改善索引來提升查詢效能。如果查詢效能不佳,系統會建議新的或經過修改的索引,以提升查詢效能。詳情請參閱「使用 Spanner 索引建議工具」。
CPU (%):查詢作業耗用的 CPU 資源,以百分比表示。計算方式為查詢作業耗用的 CPU 資源,除以該時間間隔內資料庫上所有查詢作業耗用的 CPU 資源總量。
執行次數:Spanner 在間隔期間看到查詢的次數。
平均延遲時間 (毫秒):資料庫內每個查詢執行的平均時間長度,以微秒為單位。這個平均值會排除結果集和額外負荷的編碼與傳輸時間。
平均掃描列數:查詢掃描的平均列數,不包含已刪除的值。
平均傳回列數:查詢傳回的平均列數。
傳回的位元組數:查詢傳回的資料位元組數,不包含傳輸編碼額外負荷。
圖表之間可能存在差異
您可能會發現「CPU 總使用率 (所有查詢)」圖表與「CPU 總使用率 (按『查詢』或『要求』標記顯示)」圖表之間存在差異。有兩種情況可能導致這種情況:
資料來源不同:Cloud Monitoring 資料會提供「CPU 總使用率 (所有查詢)」圖表,這類資料通常較準確,因為每分鐘都會推送,且保留期限為 45 天。另一方面,系統資料表資料 (用於提供「CPU 總使用率 (按『查詢』或『要求』標記顯示)」圖表) 可能會以 10 分鐘 (或 1 小時) 為間隔計算平均值,因此我們可能會遺失「CPU 總使用率 (所有查詢)」圖表中的高精細度資料。
不同的匯總時間範圍:兩張圖表的匯總時間範圍不同。舉例來說,如果檢查的事件發生時間超過 6 小時,我們會查詢
SPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE
資料表。在這種情況下,10:01 發生事件會經過 10 分鐘的彙整,並出現在對應 10:10 時間戳記的系統表格中。
下方的螢幕截圖顯示這類差異的範例。
分析特定查詢或要求標記
如要判斷查詢或要求標記是否為問題的根本原因,請點選看起來負載最高或耗時最長的查詢或要求標記。您可以一次選取多個查詢和要求標記。
將滑鼠指標懸停在時間軸的查詢圖表上,即可瞭解查詢的 CPU 使用率 (以秒為單位)。
請查看下列項目,嘗試縮小問題範圍:
- 高負荷狀態持續多久了?現在才變高嗎?還是長期偏高?變更時間範圍,找出查詢開始表現不佳的日期和時間。
- CPU 使用率是否突然飆升?您可以變更時間範圍,研究查詢的 CPU 使用率記錄。
- 資源用量是多少?這項查詢與其他查詢有何關聯? 查看表格,比較其他查詢與所選查詢的資料。 兩者有重大差異嗎?
如要確認所選查詢是否導致 CPU 使用率偏高,可以深入瞭解特定查詢形狀 (或要求標記) 的詳細資料,並在「查詢詳細資料」頁面進一步分析。
查看「查詢詳細資料」頁面
如要以圖形形式查看特定查詢形狀或要求標記的詳細資料,請按一下與查詢或要求標記相關聯的指紋。「查詢詳細資料」頁面隨即開啟。
「查詢詳細資料」頁面會顯示下列資訊:
- 查詢詳細資料文字:SQL 查詢文字,只顯示約 64KB 的內容。如果多個查詢項目具有相同的標記字串,系統會將這些查詢項目的統計資料分組,並在單一資料列中顯示,且 REQUEST_TAG 會與該標記字串相符。這個欄位只會顯示其中一個查詢的文字。如果是批次 DML,系統會將 SQL 陳述式集攤平為單一資料列,並使用半形分號分隔符號串連。系統會先移除連續相同的 SQL 文字,再進行截斷。
- 下列欄位的值:
- 執行次數:Spanner 在間隔期間看到查詢的次數。
- 平均 CPU 用量 (毫秒):在時間間隔內,執行個體 CPU 資源的查詢平均耗用的 CPU 資源 (以毫秒為單位)。
- 平均延遲時間 (毫秒):資料庫內每個查詢執行的平均時間長度,以毫秒為單位。這個平均值會排除結果集和額外負荷的編碼與傳輸時間。
- 平均傳回列數:查詢傳回的平均列數。
- 平均掃描列數:查詢掃描的平均列數,不包含已刪除的值。
- 平均位元組數:查詢傳回的資料位元組數,不包含傳輸編碼額外負荷。
- 查詢計畫範例圖表:圖表上的每個點代表特定時間的查詢計畫樣本,以及該計畫的特定查詢延遲時間。按一下圖表中的任一點,即可查看查詢計畫,並以視覺化的方式瞭解查詢執行期間採取的步驟。注意:如果查詢使用從 PartitionQuery API 取得的 partitionTokens,以及分區 DML 查詢,則不支援查詢計畫。
- 查詢計畫視覺化工具:顯示所選的取樣查詢計畫。圖表上的每個節點 (或資訊卡) 都代表一個疊代器,會從輸入內容取用資料列,並將資料列產生至父項。您可以點選每個疊代器,查看擴展資訊。
- 查詢延遲時間圖表:顯示所選查詢在一段時間內的查詢延遲時間值。還會顯示平均延遲時間。
- CPU 使用率圖表:顯示查詢在一段時間內的 CPU 使用率百分比。還會顯示平均 CPU 使用率。
- 執行次數/失敗圖表:顯示一段時間內的查詢執行次數,以及查詢執行失敗的次數。
- 掃描的資料列數圖表:顯示查詢在一段時間內掃描的資料列數。
- 傳回的資料列數圖表:顯示查詢在一段時間內傳回的資料列數。
- 時間範圍篩選器:依時間範圍 (例如小時、天或自訂範圍) 篩選查詢詳細資料。
對於圖表,我們會從 TopN 查詢統計資料表擷取資料,該資料表有三種不同的精細程度:1 分鐘、10 分鐘和 1 小時。圖表中每個資料點的值,代表一分鐘間隔內的平均值。
在稽核記錄中搜尋查詢的所有執行作業
如要在 Cloud 稽核記錄中搜尋特定查詢指紋的所有執行作業,請查詢稽核記錄,並搜尋與 TopN 查詢統計資料表中的 Fingerprint
欄位相符的任何 query_fingerprint
。詳情請參閱「查詢和查看記錄檔總覽」一文。使用這個方法找出啟動查詢的使用者。