分析查詢效能

本頁面說明如何使用「查詢洞察」資訊主頁,偵測及分析 Spanner 效能問題。

查詢洞察總覽

「查詢洞察」可協助您偵測及診斷 Spanner 資料庫的查詢和資料操縱語言 (DML) (INSERT、UPDATE 和 DELETE) 陳述式效能問題。這項功能支援直覺化的監控工具,並提供診斷資訊,協助您在偵測到效能問題後,進一步找出根本原因。

查詢洞察會引導您完成下列步驟,協助您提高 Spanner 查詢效能:

  1. 判斷 CPU 使用率偏高是否為查詢效率不佳所致。
  2. 找出可能有問題的查詢或標記。
  3. 分析查詢或請求代碼,找出問題。

查詢洞察功能適用於單一區域和多區域設定。

定價

查詢洞察不會產生額外費用。

資料保留

查詢洞察最多會保留 30 天的資料。Spanner 會從 SPANNER_SYS.QUERY_STATS_TOP_* 資料表擷取資料,用於「CPU 總使用率 (按『查詢』或『要求』標記顯示)」圖表。這些資料表最多可保留 30 天。詳情請參閱「資料保留」一文。

必要的角色

視您是 IAM 使用者或 FGAC 使用者而定,您需要不同的 IAM 角色和權限。

Identity and Access Management (IAM) 使用者

如要取得查看「查詢洞察」頁面所需的權限,請要求管理員授予您下列執行個體 IAM 角色:

如要查看「查詢洞察」頁面,您必須具備 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 使用率。資訊主頁提供一系列篩選器,可協助您查看查詢負載。

如要查看資料庫的查詢洞察資訊主頁,請按照下列步驟操作:

  1. 在左側導覽面板中,選取「查詢洞察」。「Query insights」(查詢洞察) 資訊主頁隨即開啟。
  2. 從「Databases」(資料庫) 清單中選取資料庫。資訊主頁會顯示資料庫的查詢負載資訊。

資訊主頁包含以下區域:

  1. 「Databases list」(資料庫清單):篩選特定資料庫或所有資料庫的查詢負載。
  2. 日期範圍篩選器:依日期範圍 (例如小時、天或自訂範圍) 篩選查詢負載。
  3. 「Total CPU Utilization (All queries)」(CPU 總使用率 (所有查詢)) 圖表:顯示所有查詢的 CPU 使用率匯總平均速率 (以每分鐘 CPU 秒數為單位)。
  4. 「Total CPU Utilization (per Query or Request tag)」(CPU 總使用率 (按「查詢」或「要求」標記顯示)) 圖表:顯示每個查詢或要求標記的平均 CPU 使用率 (以每分鐘 CPU 秒數為單位)。
  5. TopN 查詢和標記表格:顯示熱門查詢和要求標記清單,並依 CPU 使用率排序。請參閱「找出可能有問題的查詢或標記」。

「查詢洞察」資訊主頁

資訊主頁效能

使用查詢參數或標記查詢,可最佳化查詢洞察效能。如果未將查詢參數化或加上標記,系統可能會傳回過多結果,導致 TopN 查詢和標記資料表無法正常載入。

確認 CPU 使用率偏高是否為查詢效率不佳所致

CPU 總使用率是指所選資料庫中執行的查詢,在一段時間內的平均 CPU 使用率 (以每分鐘 CPU 使用秒數為單位)。

所有查詢的 CPU 總使用率

請查看圖表,思考下列問題:

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

    資料庫負載

  • CPU 使用率是否偏高?圖表是否隨著時間出現高峰或上升趨勢?如果 CPU 使用率不高,問題就不在於查詢。

  • CPU 使用率偏高的情況持續多久了?是最近才突然飆高,還是已經持續一段時間?使用範圍選取器選取不同的時間範圍,找出問題持續的時間。放大檢視查詢負載高峰的時間範圍。縮小檢視畫面,最多可查看一週的時間軸。

如果圖表中的尖峰或上升趨勢與整體執行個體 CPU 使用率相符,則很可能是因為一或多項查詢耗用大量資源。接著,您可以找出可能有問題的查詢或請求代碼,進一步偵錯。

找出可能有問題的查詢或要求標記

如要找出可能有問題的查詢或要求標記,請查看「TopN 查詢」部分:

TopN 查詢

這裡可以看到指紋 3216067328234137024 的查詢 CPU 使用率偏高,可能會有問題。

「TopN queries」(前 N 項查詢) 表格會列出在所選時間範圍內,CPU 用量最高的前幾項查詢,並依用量由高到低排序。TopN 查詢數量上限為 100。

圖表資料擷取自前 N 個熱門查詢統計資料表,該表有三種精細程度:1 分鐘、10 分鐘和 1 小時。圖表中每個資料點的值代表一分鐘間隔內的平均值。

建議您在 SQL 查詢中加入標記。查詢標記可協助您找出較高層級建構中的問題,例如商業邏輯或微服務。

TopN 查詢資料表

表格會顯示下列屬性:

  • 指紋:要求標記的雜湊,如果沒有標記,則為查詢文字的雜湊。
  • 「查詢」或「要求」標記:如果查詢有關聯的標記,就會顯示「要求」標記。如果多個查詢具有相同的標記字串,系統會將這些查詢的統計資料分組到單一資料列,並將 REQUEST_TAG 值設為與標記字串相符。如要進一步瞭解如何使用要求標記,請參閱「使用要求標記和交易標記排解問題」。

    如果查詢沒有相關聯的標記,系統會顯示 SQL 查詢,並截斷至約 64 KB。如果是批次 DML,SQL 陳述式會扁平化為單一資料列,並使用分號分隔符號串連。連續相同的 SQL 文字會在截斷前簡化。

  • 查詢類型:指出查詢是 PARTITIONED_QUERY 還是 QUERY。PARTITIONED_QUERY 是透過 PartitionQuery API 取得 partitionToken 的查詢。所有其他查詢和 DML 陳述式則以 QUERY 查詢類型表示。

  • CPU 使用率:查詢消耗的 CPU 資源,以該時間間隔內資料庫上執行的所有查詢所使用的 CPU 資源總量百分比表示,顯示在範圍為 0 到 100 的水平長條上。

  • 建議:Spanner 會分析查詢,判斷是否能透過改善索引來提升效能。如果是,系統會建議建立新索引或修改現有索引,提高查詢效能。詳情請參閱「使用 Spanner 索引建議工具」。

  • CPU (%):查詢耗用的 CPU 資源,以該時間間隔內資料庫上執行的所有查詢所用 CPU 資源總量的百分比表示。

  • 執行次數:Spanner 在該時間間隔內觀察到的平均查詢執行率,以每分鐘執行次數為單位。

  • 平均延遲時間 (毫秒):資料庫中每項查詢執行的平均時間長度 (以微秒為單位)。這個平均值不包含結果集的編碼和傳輸時間,以及負載。

  • 平均掃描列數:查詢掃描的平均列數,不含已刪除的值。

  • 平均傳回列數:查詢平均傳回的資料列數。

  • 傳回的位元組數:查詢傳回的資料位元組數,不含傳輸編碼負擔。

圖表之間可能存在差異

您可能會發現「CPU 總使用率 (所有查詢)」圖表和「CPU 總使用率 (按『查詢』或『要求』標記顯示)」圖表之間有些差異。有兩種情況可能導致這種情形:

  • 資料來源不同:Cloud Monitoring 資料會每分鐘推送一次,保留期限為 45 天,因此通常較為準確,並會提供給「CPU 總使用率 (所有查詢)」圖表。另一方面,系統資料表資料會提供「CPU 總使用率 (按『查詢』或『要求』標記顯示)」圖表,但可能會以 10 分鐘 (或 1 小時) 為單位計算平均值,因此我們可能會遺失「CPU 總使用率 (所有查詢)」圖表中的高精細程度資料。

  • 不同的匯總時間範圍:兩張圖表的匯總時間範圍不同。舉例來說,檢查超過 6 小時的事件時,我們會查詢 SPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE 資料表。在這種情況下,10:01 發生的事件會在 10 分鐘內匯總,並顯示在與 10:10 時間戳記對應的系統資料表中。

以下螢幕截圖顯示這類差異的範例。

圖表之間的差異

分析特定查詢或要求標記

如要判斷查詢或要求標記是否為問題的根本原因,請按一下看起來負載最高或耗時較長的查詢或要求標記。您可以一次選取多個查詢和要求標記。

將滑鼠游標懸停在圖表上,即可查看時間軸上各查詢的 CPU 使用率 (以秒為單位)。

請查看下列項目,嘗試縮小問題範圍:

  • 負載過高的情況持續多久了?現在只有高嗎?還是長期偏高?變更日期範圍,找出查詢效能開始不佳的日期和時間。
  • CPU 使用率是否曾飆升?您可以變更時間範圍,研究查詢的 CPU 使用率記錄。
  • 資源消耗量為何?與其他查詢有何關聯? 查看表格,並比較其他查詢與所選查詢的資料。兩者有很大的差異嗎?

如要確認所選查詢是否導致 CPU 使用率偏高,您可以深入查看特定查詢形式 (或要求標記) 的詳細資料,並在「Query Details」(查詢詳細資料) 頁面進一步分析。

查看「Query Details」(查詢詳細資料) 頁面

如要以圖表形式查看特定查詢模式或要求標記的詳細資料,請按一下與查詢或要求標記相關聯的指紋。「查詢詳細資料」頁面隨即開啟。

查詢詳細資料頁面

「查詢詳細資料」頁面會顯示下列資訊:

  1. 查詢詳細資料文字:SQL 查詢文字,截斷至約 64 KB。如果多個查詢具有相同的標記字串,系統會將這些查詢的統計資料分組到單一資料列,且 REQUEST_TAG 與該標記字串相符。這個欄位只會顯示其中一項查詢的文字。如果是批次 DML,SQL 陳述式組合會扁平化為單一資料列,並使用分號分隔符號串連。連續相同的 SQL 文字會在截斷前簡化。
  2. 下列欄位的值:
    • 執行次數:Spanner 在該時間間隔內,每分鐘平均執行的查詢次數。
    • 平均 CPU (毫秒):在特定時間間隔內,查詢執行個體 CPU 資源時,平均耗用的 CPU 資源 (以毫秒為單位)。
    • 平均延遲時間 (毫秒):資料庫中每項查詢執行的平均時間長度 (以毫秒為單位)。這個平均值不包含結果集和負載的編碼和傳輸時間。
    • 平均傳回列數:查詢平均傳回的資料列數。
    • 平均掃描列數:查詢掃描的平均列數,不含已刪除的值。
    • 平均位元組數:查詢傳回的資料位元組數,不含傳輸編碼負擔。
  3. 查詢計畫範例圖表:圖表上的每個點代表特定時間的取樣查詢計畫,以及其特定查詢延遲時間。按一下圖表中的任一點,即可查看查詢計畫,並以視覺化的方式瞭解查詢執行期間採取的步驟。注意:如果查詢含有從 PartitionQuery API 取得的 partitionToken,以及分區 DML 查詢,則不支援查詢計畫。
  4. 查詢計畫視覺化工具:顯示所選的查詢計畫樣本。Spanner 提供下列版面配置選項:

    • 樹狀檢視:樹狀檢視會以圖表呈現查詢計畫,其中每個節點或資訊卡都代表一個疊代器,會從輸入內容中取用資料列,並產生資料列至父項。點選各個疊代器,即可查看詳細資訊。
    • 依序檢視:依序檢視畫面會以階層式表格呈現查詢計畫,每個資料列代表一個運算子。點選各列即可展開資訊。

      查詢計畫的依序檢視畫面

      表格會顯示下列資料欄:

      • Name:運算子的名稱。
      • 機器群組:執行這個運算子的機器群組。
      • 延遲時間:執行目前作業時耗費的時間長度。這項時間可能會超過 CPU 作業時間 (例如運算子因遠端呼叫或檔案系統延遲而需要等待時)。
      • 累計延遲時間:以這個運算子為根層級的整個子樹狀結構,執行作業耗費的時間。這不含方案建立時間和其他營運負載,因此可能小於查詢總時長。
      • CPU 作業時間:執行查詢耗費的總 CPU 作業時間。不含網路延遲時間。查詢執行作業的某些部分可以平行處理,因此 CPU 作業時間有可能超過總執行時間。舉例來說,假設查詢在 1 毫秒內執行十項平行作業,執行時間為 1 毫秒,不過 CPU 作業時間會是 10 毫秒。
      • 傳回的資料列數:運算子傳回的資料列數。
  5. 「Query latency」(查詢延遲時間) 圖表:顯示所選查詢在一段時間內的延遲時間值。以及平均延遲時間。

  6. CPU 使用率圖表:顯示查詢在一段時間內的 CPU 使用率 (以百分比表示)。以及平均 CPU 使用率

  7. 執行次數/失敗圖表:顯示一段時間範圍內的平均查詢執行率 (每分鐘執行次數),以及平均查詢執行失敗率 (每分鐘失敗執行次數)。

  8. 「Rows scanned」(掃描的資料列數) 圖表:顯示查詢在一段時間範圍內掃描的資料列數。

  9. 傳回的資料列圖表:顯示查詢在一段時間範圍內傳回的資料列數。

  10. 時間範圍篩選器:依時間範圍 (例如小時、天或自訂範圍) 篩選查詢詳細資料。

圖表資料擷取自前 N 個熱門查詢統計資料表,該表有三種精細程度:1 分鐘、10 分鐘和 1 小時。圖表中每個資料點的值代表一分鐘間隔內的平均值。

在稽核記錄中搜尋查詢的所有執行作業

如要在 Cloud 稽核記錄中搜尋特定查詢指紋的所有執行作業,請查詢稽核記錄,並搜尋與 TopN 查詢統計資料表中的 Fingerprint 欄位相符的任何 query_fingerprint。詳情請參閱「查詢和查看記錄檔總覽」。請使用這個方法找出啟動查詢的使用者。

後續步驟