選擇分割區列
透過讓 Telemetry 跳過不能包含請求值的部分,分割區列可以使選擇性查詢更快。它們對於在大型資料表中重複調查一個客戶、服務、環境、追蹤或事件型別的代理和自動化工作流程特別有用。
它們與 SQL PARTITION BY 不同,它們不會更改查詢結果。 Telemetry 在寫入資料時對設定的值進行雜湊處理,並記錄每個部分的分割區資訊。在查詢時,相容的過濾器以相同的方式進行雜湊,因此可以在讀取資料之前排除不相關的部分。
何時使用它們
當所有這些都成立時對錶進行分割區:
- 該資料表有足夠的資料或部分,掃描它是一項實質性工作
- 重要查詢在同一欄位上重複過濾
- 這些過濾器通常選擇資料表的一小部分
- 該欄位是字串、布林值或數字標量
好的候選欄位包括 account_id、workspace_id、service、environment、event 以及穩定的巢狀欄位,例如 request.region。
對於逐個調查事件的代理來說,account_id 通常是強有力的第一列:
SELECT timestamp_utc, event, message
FROM app_events
WHERE account_id = 'acct_123'
AND timestamp_utc >= now() - INTERVAL '24 hours'
ORDER BY timestamp_utc DESC
時間謂詞仍然縮小了時間視窗;帳戶謂詞還允許 Telemetry 修剪該視窗內的分割區部分。
將最有用的列放在前面
列順序定義了前導字首層次結構。鑑於:
{
"partitionColumns": ["account_id", "event"]
}
Telemetry 可以對按以下條件過濾的查詢使用分割區修剪:
account_idaccount_id和event
它無法將此佈局用於僅按 event 篩選的查詢,因為缺少第一列。為最廣泛的重要查詢集選擇第一列,然後僅當查詢通常按兩者過濾時才新增另一列。
從一列開始。僅在您可以描述它改進的查詢模式後才新增第二個。長列列表會建立越來越窄的寫入和壓縮組,而後面的列有助於減少查詢。
啟用修剪的過濾器
Telemetry 當前從字面相等、正 IN 以及與 AND 連線的 IS NULL 謂詞派生分割區修剪:
WHERE account_id = 'acct_123'
WHERE account_id IN ('acct_123', 'acct_456')
WHERE account_id = 'acct_123'
AND event IN ('request_failed', 'request_retried')
WHERE account_id IS NULL
範圍謂詞、否定和不明確的 OR 表示式不會產生分割區修剪。例如,在 duration_ms 上分割區對 duration_ms > 1000 沒有幫助。查詢仍然正確;他們只是簡單地掃描而沒有進行最佳化。
巢狀標量路徑也可以工作:
{
"partitionColumns": ["request.region"]
}
SELECT count(*)
FROM app_events
WHERE request.region = 'us-west-2'
不支援列表、物件和時間戳作為分割區列。時間戳過濾已經有自己的修剪路徑,通常更好地表示為查詢時間範圍。
要避免什麼
避免僅僅因為某個領域存在於每個事件中而選擇它。有用的分割區列反映了頻繁的、選擇性的查詢。
謹慎對待:
- 幾乎每個查詢都會忽略的欄位
- 主要使用範圍、
LIKE或否定查詢的欄位 - 當查詢很少重複時快速變化或無界的值
- 前導字首與實際查詢模式不匹配的多個列
低基數字段在刪除資料表的大部分內容時仍然有用,例如 environment = 'production'。高基數識別符號對於點調查非常有用,但它可能會導致寫入和壓縮碎片化。更喜歡在您真正關心的查詢中刪除最多資料的欄位,而不僅僅是具有最多不同值的欄位。
推出工作流程
- 檢查人員、儀表板、警示和代理執行的查詢。識別由最昂貴的選擇性查詢共享的相等過濾器。
- 確認該欄位並輸入
GET /tables/<table>/schema。 - 透過資料表設定UI或表格 API設定一個分割區列。
- 保留重要查詢的時間過濾器;分割區剪枝是對時間剪枝的補充,而不是取代它。
- 在現有資料有時間重寫後重新執行代表性查詢。比較掃描的工作和延遲,而不僅僅是一次熱快取執行。
- 僅當常見查詢同時篩選第一列和第二列時才新增第二列。
新資料立即使用更改後的分割區規範。現有部分在後台重寫,未重寫的部分仍然可查詢,因此結果在遷移過程中保持完整。隨著更多資料表採用新佈局,效能逐漸提高。
透過API設定
curl -X PATCH https://api.telemetry.sh/tables/app_events/partition-columns \
-H "Content-Type: application/json" \
-H "Authorization: $API_KEY" \
-d '{
"partitionColumns": ["account_id", "event"]
}'
要更改順序,請傳送完整的所需列表。要關閉分割區,請傳送 null 或空陣列:
curl -X PATCH https://api.telemetry.sh/tables/app_events/partition-columns \
-H "Content-Type: application/json" \
-H "Authorization: $API_KEY" \
-d '{"partitionColumns": null}'
API 根據資料表的當前架構驗證欄位。有關確切的請求和回應合約,請參閱 資料表 API 參考。