SQL 高階・任務佇列監控
這一頁是題幹試閱;登入/註冊後每題可以在瀏覽器裡執行、對答案,第一次交對 +10 XP。
- 01
各佇列成功率與平均耗時
中等以
task_log統計每個佇列的:任務數、成功率 %(ROUND 1 位)、平均耗時秒(ROUND 1 位)。只納入finished_at不是 NULL 的任務。欄位依序 queue、任務數、成功率、平均秒數,依 queue 排序。sqlite 算秒差:
strftime('%s', finished_at) - strftime('%s', started_at)(轉成 Unix 秒再相減,避免 julianday 浮點誤差)。MySQL 寫法差異:TIMESTAMPDIFF(SECOND, started_at, finished_at)。資料表
task_log(Flower 匯出的任務紀錄):task_id(文字,主鍵)、task_name、queue佇列、worker、state(SUCCESS/FAILURE/STARTED)、started_at、finished_at(文字,'YYYY-MM-DD HH:MM:SS';尚未結束為 NULL)、retries重試次數(整數)。作答登入後可作答 - 02
每個 worker 最慢的成功任務
中等找出每個 worker 耗時最長的成功任務,欄位依序 worker、task_id、耗時秒(整數),依 worker 排序。請用
RANK()(若同 worker 有兩個任務耗時相同要都列出)。秒差:
strftime('%s', finished_at) - strftime('%s', started_at)(Unix 秒相減,結果為整數)。資料表
task_log(Flower 匯出的任務紀錄):task_id(文字,主鍵)、task_name、queue佇列、worker、state(SUCCESS/FAILURE/STARTED)、started_at、finished_at(文字,'YYYY-MM-DD HH:MM:SS';尚未結束為 NULL)、retries重試次數(整數)。平台以 sqlite 執行,支援 window function 與 CTE;MySQL 8.0 以上語法相同。
作答登入後可作答 - 03
併發峰值
困難算出
task_log中「同時執行中的任務數」的最大值,以及最早達到這個峰值的時間點。只納入finished_at不是 NULL 的任務。輸出一列:峰值、時間。做法:把每個任務拆成兩個事件(started_at 記 +1、finished_at 記 −1),依時間排序後做累計和,累計和的最大值就是峰值。同一時間點若同時有 −1 與 +1,先算 −1(結束不佔用)。
資料表
task_log(Flower 匯出的任務紀錄):task_id(文字,主鍵)、task_name、queue佇列、worker、state(SUCCESS/FAILURE/STARTED)、started_at、finished_at(文字,'YYYY-MM-DD HH:MM:SS';尚未結束為 NULL)、retries重試次數(整數)。平台以 sqlite 執行,支援 window function 與 CTE;MySQL 8.0 以上語法相同。
作答登入後可作答

送件鴿飛出去了