我有一個包含大量包含歷史資料的表的系統。每個表都有一個 ts_from 和 ts_to 列,它們的型別為 timestamptz。這些表示特定行的資料有效的時間段。
這些列已編入索引。
如果我想查詢在特定時間戳有效的所有行,撰寫 ts_from <= @at_timestamp AND ts_to >= @at_timestamp WHERE 子句來利用索引是很簡單的。
但是,我想創建一個名為“Temporal.at”的函式,該函式將采用 @at_timestamp 列和 ts_from / ts_to 列,并通過從使用它的查詢中隱藏比較的復雜性來做到這一點。您可能認為這是微不足道的,但我還想擴展該概念以創建一個名為“Temporal.between”的函式,該函式將采用 @from_timestamp 和 @to_timestamp 并選擇這兩個時期之間有效的所有行。該功能不會是微不足道的,因為必須檢查行部分重疊的位置,而不是總是被它完全包圍。
問題是這樣的:我已經撰寫了這些函式,但它們不會導致使用索引。歷史表的查詢性能非常緩慢,其中一些有數億行。
因此,問題是: a) 有沒有辦法撰寫這些函式,以便我們可以確定索引將被使用?
b)我是否以完全錯誤的方式進行此操作,是否有更好的方法進行?
uj5u.com熱心網友回復:
如果您將ts_from和建模ts_to為兩個不同的時間戳列,這會很復雜。相反,您應該使用范圍型別:tstzrange. 那么一切都會變得簡單:
對于間隔內的遏制,請使用
@at_timestamp <@ from_to對于區間重疊,使用
tstzinterval(@from_timestamp, @to_timestamp) && from_to
范圍列上的 GiST 索引可以支持這兩個查詢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513596.html
上一篇:如何使pythonfor回圈更快
