本文介紹定時SQL功能的常見問題。
如何保證SQL分析的數據準確性?
數據延遲寫入或實例的調度配置不恰當時,可能發生數據分析不準確問題。
數據寫入存在延遲。例如數據寫入日志服務延遲了5分鐘,實例執行時間為12:03:00,SQL時間窗口為相對一分鐘,即[12:02:00,12:03:00),則查詢不到最新的數據。
數據寫入日志服務到能夠被查詢到,這期間存在延時(一般少于3秒)。即使延時很低,也存在數據漏查的風險。例如實例執行時間為12:03:30,SQL時間窗口為相對一分鐘,即[12:02:30,12:03:30),對于12:03:29秒寫入的日志,不能保證在12:03:30肯定能夠查詢到。
同一分鐘內包含不同時間的日志時,由于日志索引的構建,時間較遲的日志的索引可能落盤到較早的時間點。例如實例執行時間為12:03:30,SQL時間窗口為相對一分鐘,即[12:02:30,12:03:30)。如果在12:02:50寫入日志,這些日志時間為12:02:20、12:02:50等,那么這些日志的索引可能落盤在12:02:20這個時間點,導致在[12:02:30,12:03:30)期間查詢不到日志。
使用定時SQL時,建議根據業務情況,同時兼顧數據實時性和準確性。
考慮到數據上傳日志服務存在延遲情況,您可以結合數據采集延遲以及業務能夠容忍的最大結果可見延遲,設置執行延遲和SQL時間窗口(結束時間往前一點),避免實例執行時SQL時間窗口內的數據未全部到達。
建議SQL時間窗口按分鐘對齊(例如整分鐘、整小時),以保證上傳局部亂序數據時的數據準確性。
如何防止SQL分析執行失敗?
確保輸入正確的SQL語法。
確保已為待分析的字段創建正確的索引。例如查詢和分析語句為
* | select uid
,則您需要為uid字段開啟統計功能。更多信息,請參見創建索引。確保已配置正確的權限。例如執行SQL分析的權限和讀取日志庫數據的權限。
確保已提供足夠的計算資源。資源限制說明請參見查詢與分析的使用限制。
避免使用邏輯過于復雜的SQL語句以及SQL時間窗口設置過大,否則將導致計算超時(服務端超時時間為10分鐘)。
通過定時SQL任務寫入數據到目標庫時,是否進行索引檢查?
日志服務將定時SQL的計算結果寫入目標庫時,不做索引檢查。如果目標庫未配置索引,則您無法進行SQL分析,但不影響日志消費和查詢操作。
建議您在創建定時SQL任務前,完成目標庫的索引配置。如果未提前配置索引,可通過重建索引功能為歷史數據配置索引。具體操作,請參見重建索引。
某個實例執行超時,是否會影響后續的執行計劃?
某個實例執行超時不會影響后續的執行計劃的生成。新實例的調度時間是延續上一個實例的調度時間,但是后續實例的創建時間和執行時間會延遲,并且需要花費時間來追趕原定的執行計劃,逐步縮減結果數據的延遲。
一般來說,追趕固定的數據量時,調度周期越大,追趕速度越快。例如:
追趕一天的數據量,調度周期為1分鐘時,需要執行1440個實例,每個實例運行20秒。
追趕一天的數據量,調度周期為1小時時,需要執行24個實例,每個實例運行2分鐘。
日志服務提供服務分布式查詢和分析能力,在面對更多數據時將使用更多的計算資源。
寫入到目標庫的數據如何溯源?
通過定時SQL寫入到目標庫的數據,默認被添加如下__tag__字段,用于數據溯源。
__tag__:__instance_id__:2b****06a:實例的ID
__tag__:__job__:from_now:任務名稱
__tag__:__project__:ali-sls-etl-staging:任務所屬于的Project
__tag__:__schedule_time__:1618474200:任務的調度時間,Unix時間戳,單位:秒。
__tag__:__trigger_time__:1618474259:任務的執行時間,Unix時間戳,單位:秒。
如何自定義定時SQL任務寫入日志到目標庫的日志時間?
根據業務情況,如果需要通過日志時間進行查詢分析等操作,且不希望日志時間值是默認指定的,那么您可以通過如下案例來自定義任務將日志寫入目標庫的日志時間值。
__time__為指定的日志時間,您可以在日志庫中查看日志時間。
current_timestamp函數用于返回當前日期、時間和時區。
定時SQL任務寫入日志到目標庫的日志時間值是什么?
創建定時SQL任務時,SQL代碼不包含__time__
字段(* | select *
默認包含__time__
字段),定時SQL任務寫入日志到目標庫的日志時間值默認會指定為數據時間的開始時間。
如圖所示:系統默認會把SQL查詢區間數據時間的開始時間2024-09-14 15:31:00指定為該實例查詢的結果日志寫入目標庫的日志時間值。
案例一:指定源日志庫的日志時間為寫入到目標日志庫的日志時間
在創建定時SQL任務時,SQL中除了需要寫入到目標庫的必要字段,加入__time__
字段,則當日志從源日志庫寫入到目標日志庫時,系統會把該語句執行結果__time__
值作為寫入日志到目標庫的日志時間值。
案例二:指定當前時間為寫入到目標庫的日志時間值
在創建定時SQL任務時,SQL中除了需要寫入到目標庫的必須字段,加入cast(to_unixtime(current_timestamp) as bigint) AS __time__
字段,則指定當前時間為寫入到目標庫的日志時間值。關于to_unixtime函數更多信息,請參見to_unixtime函數。關于cast函數更多信息,請參見cast函數。
案例三:指定源日志其他時間字段值為寫入日志到目標庫日志的日志時間值
如圖所示:將配置在SQL代碼中的start_time
替換為您日志中的真實字段,且字段值應為timestamp類型,系統會把該語句執行結果__time__
值作為寫入日志到目標庫的日志時間值。