Hologres提供慢Query日志,默認采集大于100ms的DML和所有DDL。基于慢Query日志的數據,Hologres提供SQL診斷的能力,通過對不同維度的趨勢、明細分析,可以輔助您了解實例的使用情況并做相應的優化,以達到更好的效果。本文為您介紹如何使用SQL診斷。
功能介紹與建議
當前SQL診斷支持的診斷內容如下:
診斷項 | 說明 |
Query總數 | 所選時間段的Query總數。 |
成功Query | 所選時間段成功的Query總數。 |
失敗Query | 所選時間段失敗的Query總數。 |
失敗Query明細 | 展示錯誤碼和對應的失敗次數,方便治理錯誤的Query,同時展示出典型的Query和錯誤明細。 |
成功和失敗Query趨勢 | 展示所選時間段的成功和失敗的Query次數比例,方便了解當前實例的Query整體運行情況。 |
Query耗時占比趨勢 | 展示所選時間段的Query耗時占比趨勢。 默認只分析 |
DML趨勢 | 展示DML Query的執行次數趨勢。 默認只分析 |
DDL趨勢 | 展示DDL Query的執行次數趨勢。 僅包含 |
Query應用來源占比情況或趨勢 | 展示 可以從占比中分析占比較多的應用,同時也建議給不同的任務類型設置相關的 |
用戶維度的Query占比情況或趨勢 | 展示 可以更加明顯地分析出用戶Query執行情況,同時也建議不同的任務使用不同的用戶名,而不是使用同一個賬號,以便更好地排查異常。 |
執行引擎的Query趨勢 | 展示所選時間段內,不同執行引擎的Query執行趨勢。 Hologres根據Query的特征,會有不同的執行引擎,包括HQE、PQE、SDK或FixedQE等,詳情請參見產品架構。建議您盡量避免PQE的查詢,而是改寫成HQE的Query,以便獲得更好的性能。 |
注意事項
SQL診斷的數據去除了系統相關的SQL,篩選條件如下:
WHERE usename != 'system' AND client_addr != '127.0.0.1' AND (application_name IS NULL OR application_name NOT IN ('AutoPartition', 'holoweb_system', 'HgGenInQuery'))
hologres.hg_query_log
表默認只能查詢大于1s
的DML和所有DDL,SQL診斷默認分析大于100ms
的所有DML和DDL,如果您發現hologres.hg_query_log
統計的數據少于SQL診斷時,一般是因為hologres.hg_query_log
只統計了大于1s
的Query,您可以通過修改log_min_duration_statement
參數采集大于100ms
的Query,詳情請參見log_min_duration_statement。SQL診斷同慢Query日志,只能查看近一個月的數據。
數據是T+1更新。因此只能查T-1(昨天)及之前一個月的數據,可以根據業務情況進行時間維度的篩選。默認展示前一天的數據。可以根據業務情況進行時間維度的篩選。
SQL診斷的查詢權限同慢Query日志,授予查看權限請參見授予查看權限。
操作步驟
您可以通過HoloWeb可視化查看SQL診斷。
登錄HoloWeb控制臺,詳情請參見連接HoloWeb并執行查詢。
單擊頂部導航欄的診斷與優化。
在左側導航欄,選擇實例診斷>SQL診斷。
在SQL診斷頁面頂部,編輯查詢條件。
查詢條件參數:
參數
是否必選
說明
實例名
是
需要查詢慢Query的實例名稱,默認是當前登錄的實例。
時間范圍
是
慢Query的時間范圍,默認選擇昨天,最多只能選擇過去一個月的數據。
單擊提交,展示查詢結果。
查詢結果示例如下:
SQL錯誤智能診斷
對于失敗的Query,HoloWeb中的SQL編輯器會展示SQL診斷的信息,并且Query洞察支持SQL智能診斷,也會將失敗的原因和解決方案自動返回SQL編輯器并進行展示,從而幫助業務更便捷地處理失敗Query。示例如下圖。
錯誤碼對照表
錯誤碼 | 說明 | 常見的完整報錯 | 解決方法 |
HG_ERRCODE_FDW_ERROR | MaxCompute外部表的元數據導入至Hologres時產生報錯,通常是由于不支持某種類型的表所導致。 |
| 詳情請參見HG_ERRCODE_FDW_ERROR。 |
ERRCODE_FDW_ERROR | 外部表查詢出現報錯。 |
| 根據具體的報錯解決,詳情請參見ERRCODE_FDW_ERROR。 |
| 違反唯一性約束,常出現在寫入時主鍵重復的場景。 |
|
|
| 違反檢查約束,常發生在寫入Hologres分區表時,寫入的分區值與設置的分區值不一致。例如 |
| 需要檢查分區數據和設置的分區值是否一致,并修改為一致。 |
| 違反非空約束。常發生在非空(not null)字段寫入了空(null)數據。 |
| 處理臟數據。 |
ERRCODE_UNDEFINED_TABLE | 表不存在,一般出現在表剛剛創建未更新元數據或者Query執行過程中,表有TRUNCATE或DROP的場景。 |
| 可以使用Query洞察排查是否有同時TRUNCATE或DROP任務,然后重試任務,詳情請參見Query洞察。 |
| 內部非預期錯誤,實例可能出現過宕機或者Query被意外中斷。 |
| 暫無。 |
| 查詢被取消,一般是因為設置了客戶端超時,或者表被TRUNCATE或DROP了。 |
| 解決方法請參見Query管理排查。 |
| 有某個功能不支持。 |
| 解決方法請參見Hologres SQL語句的常見問題。 |
ERRCODE_UNDEFINED_OBJECT | 存在未定義的對象,一般是列不存在、Table Group不存在。 |
|
|
| 當前賬號權限不足,需要授權。 |
| 解決方法請參見Hologres權限相關。 |
| Query因為內存不足,出現了OOM。 |
| 解決方法請參見OOM常見問題排查指南。 |
| 類型不匹配,通常為表達式需要的類型與字段的實際類型不匹配。 |
| 檢查SQL的列是否匹配。 |
| SQL中存在除數為 |
| 處理臟數據,或者使用GUC使除以0不報錯,詳情請參見函數使用。 |
ERRCODE_STRING_DATA_RIGHT_TRUNCATION | 字符串右截斷,多發生于VARCHAR字段的實際值超過了建表時VARCHAR指定的長度。 |
| 重新建表修改VARCHAR字段的長度,或者將字段類型設置為TEXT。 |
| 超過Hologres允許的上限,通常發生在掃描外部表分區表數量、讀的行數、讀的字節等超過上限。 |
| 外部表查詢超過了限制,解決方法請參見對接MaxCompute常見問題與診斷。 |
ERRCODE_SYNTAX_ERROR | SQL語法錯誤。 |
| 請您重新檢查SQL語法。 |
ERRCODE_UNDEFINED_FUNCTION | 一般為不支持的函數功能,可能是因為函數語法使用錯誤,或者未創建Extension等,也可能是不支持某個函數。 |
| 請根據函數的語法進行操作,避免語法錯誤或者Extension未創建等,詳情請參見函數參考。 |
ERRCODE_E_R_E_READING_SQL_DATA_NOT_PERMITTED | 沒有外部表的讀權限。 |
| 解決方法請參見MaxCompute權限相關。 |
| 存在重復的對象,通常發生于創建重復的Extension、Publication、Role等。 |
| 如果對象已經存在,不需要重復創建。 |
| 非法的文本表達式,常發生于字符串轉換為其他類型時,字符串的數據非法,比如空字符串("")轉INT。 |
| 處理臟數據。 |
ERRCODE_BAD_COPY_FILE_FORMAT | 執行copy命令時文件或數據的格式不正確,多發生于數據本身就包含了copy指定的分割符(比如空格),導致列的數量對不上。 |
| 處理臟數據。 |
ERRCODE_UNDEFINED_COLUMN | Query中有不存在的列。 |
| 重新檢查SQL語法。 |
ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE | 數值類型超過范圍:
|
| 檢查是否有臟數據或者類型定義錯誤,重新修改列類型。 |
ERRCODE_DATETIME_FIELD_OVERFLOW | timestamp、timestamptz、date、time、timetz等時間相關的字段存在值溢出,比如 |
| 處理臟數據。 |
ERRCODE_INVALID_PARAMETER_VALUE | 非法參數值,一般是各種情況下的參數不符合要求。根據具體報錯信息改進。例如報錯: |
| 重新檢查SQL語法。 |
ERRCODE_INVALID_DATETIME_FORMAT | 非法的日期格式,日期數據不符合格式要求,比如 |
| 處理臟數據。 |
ERRCODE_CHARACTER_NOT_IN_REPERTOIRE | 字符不在編碼范圍,常見于出現了UTF-8編碼之外的非法字符。 |
| 處理臟數據。 |
ERRCODE_DUPLICATE_TABLE | 重復的表,常見表已經存在時,又重復建同名表。 |
| 如果表已經存在,則不需要重復創建。 |
ERRCODE_UNTRANSLATABLE_CHARACTER | 存在字符無法轉化為目標格式。 |
說明 表示UTF-8編碼的字符在目標GBK格式中無等價項。 | 處理臟數據。 |
ERRCODE_GROUPING_ERROR | 分組錯誤,group by相關的錯誤。 |
| 重新檢查SQL語法,聚合函數的字段需要包含在group by內。 |
| 非法的事務狀態。涉及事務的相關操作非法。 比如CALL SET_TABLE_PROPERTY創建Distribution Key時和建表不在一個事務中。 |
|
|
ERRCODE_AMBIGUOUS_COLUMN | 模棱兩可的列。一般是SQL中同一列名可能是不同列時報錯,例如 |
| 重新檢查SQL語法。 |
ERRCODE_DUPLICATE_COLUMN | 重復列,常發生在建表時同一字段聲明了多次。 |
| 重新檢查SQL語法。 |
ERRCODE_AMBIGUOUS_FUNCTION | 模棱兩可的函數。一般是函數支持多種類型的入參,但傳參的類型沒有指定清楚。 | 如函數to_char有
| 重新檢查SQL語法。 |
ERRCODE_INVALID_COLUMN_DEFINITION | 非法的列定義,在Hologres中多是Numeric或Decimal類型未指明精度。 |
| 處理臟數據。 |
ERRCODE_INVALID_CATALOG_NAME ERRCODE_UNDEFINED_DATABASE | 指定的數據庫不存在。 | 暫無 | 檢查數據庫是否存在。 |
ERRCODE_CANNOT_COERCE | 兩個類型數據之間無法轉化時報錯。 |
| 重新檢查SQL語法。 |
ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST | 依賴的對象仍存在,常見于刪除一個對象時,依賴其的對象仍然存在。比如刪除一個Schema時, 該Schema下的表還未刪除。 | 暫無 | 處理相關依賴,詳情請參見刪除賬號。 |
ERRCODE_UNDEFINED_SCHEMA 或 ERRCODE_INVALID_SCHEMA_NAME | 指定的Schema不存在。 |
| 檢查Schema是否存在,不存在需要先創建。 |
ERRCODE_DUPLICATE_DATABASE | 重復的數據庫,創建一個已存在的數據庫時報錯。 | 暫無 | 如果數據庫已經存在,無需重復創建。 |
AutoAnalyze-Failed | Auto Analyze因為某些原因失敗。 |
| Auto Analyze失敗,一般為后端原因,請提工單排查。 |
Import Foreign Table Not Found | 找不到外部表。 |
| 請檢查訪問的外部表的是否存在。 |
Cannot Acquire Lock In Time | 這個異常通常是由于拿鎖失敗,高并發查詢和刪除(Drop)同一張表時,后端節點出現死鎖,導致有關這張表的操作都卡住,從而報錯。 |
| 解決方法請參見鎖以及排查鎖。 |
| 非預期的報錯。 |
| 非預期的報錯,可以提工單排查。 |