天天看點

Hypertable Basics 超表基礎

文章:https://docs.timescale.com/v0.9/using-timescaledb/hypertables

TimescaleDB中的Hypertable(超表)被設計為易于管理,并且可以向熟悉标準PostgreSQL表的使用者預測行為。 沿着這些路線,在TimescaleDB中建立,更改或删除(超)表的SQL指令與PostgreSQL中的相同。 即使可改變的是由許多互相關聯的“塊”表組成,對于可改變的自動傳播的指令改變為屬于該可改變的所有塊。

建立一個超表

建立超表有兩個步驟:

1、建立一個标準表(PostgreSQL文檔)

Hypertable Basics 超表基礎

2、然後,在這個新建立的表(API文檔)上執行TimescaleDB create_hypertable指令。

提示:如果您需要将現有表中的資料遷移到可更改的表,請務必在調用函數時将migrate_data參數設定為true。 如果您希望更好地控制index的形成和hypertable的其他方面,請按照這些遷移說明進行操作。

警告:使用migrate_data參數轉換非空表可以将表鎖定很長時間,具體取決于表中的資料量。

提示:create_hypertable函數中使用的'time'列支援時間戳,日期或整數類型,是以您可以使用一個不明确基于時間的參數,隻要它可以遞增即可。 例如,一個單調遞增的id會起作用。

============================================================================

改變hypertable(超表)

可以針對hypertable(PostgreSQL文檔)執行标準的ALTER TABLE指令。

Hypertable Basics 超表基礎

然後,TimescaleDB将自動将這些模式更改傳播到構成這個可改寫的塊的塊。

警告:如果任何其他列的預設值設定為NULL,則更改表格架構非常有效。 如果預設值設定為非空值,則TimescaleDB将需要為屬于該可改寫值的所有行(屬于所有塊)填寫此值。

============================================================================

删除hypertable(超表)

這隻是标準的DROP TABLE指令,其中TimescaleDB将相應地删除屬于hypertable的所有塊。

Hypertable Basics 超表基礎

============================================================================

最佳實踐

TimescaleDB的使用者通常有兩個常見問題:

1、應該配置多少時間分區間隔?

2、應該使用空間分區嗎?應該使用多少個空間分區?

時間間隔:TimescaleDB的目前版本不執行自适應時間間隔(盡管這在工作中)。 是以,使用者必須通過設定chunk_time_interval(或使用預設值1個月)來建立超級可配置時對其進行配置。 用于新塊的間隔可通過調用set_chunk_time_interval來更改。

選擇時間間隔的關鍵屬性是,屬于最近時間間隔(或使用空間分區時的塊)的塊(包括索引)适合記憶體。 是以,我們通常建議設定間隔,以使這些塊不超過主存儲器的25%。

提示:確定您計劃将所有活動的可調整内容放入主記憶體的25%,而不是每個可調整内容的25%。

要确定這一點,您需要對資料速率有一個大緻的了解。 如果您每天大概寫入2GB資料并擁有64GB記憶體,則将時間間隔設定為一周将會很好。 如果您每天在同一台機器上寫入10GB,則将時間間隔設定為一天将是适當的。 如果批量加載資料,例如,您每周大容量加載70GB資料,并且資料與整個星期的記錄相對應,則此間隔也可以保持。

雖然将塊分成小塊而非大塊通常更安全,但設定間隔太小可能會導緻很多塊,這對應于某些類型查詢的計劃延遲增加。

提示:需要注意的是,總塊大小實際上取決于基礎資料大小和任何索引,是以如果大量使用昂貴的索引類型(例如某些PostGIS地理空間索引),可能需要小心。 在測試期間,您可能會通過塊關系大小函數檢查您的總塊大小。

空間分區:使用額外的分區是一個非常特殊的用例。 大多數使用者不需要使用它。

空間分區使用散列:每個不同的項目散列到N個存儲桶之一。 請記住,我們已經使用(靈活)時間間隔來管理塊大小; 空間分區的主要目的是使并行I / O達到相同的時間間隔。

并行I / O可以在兩種情況下受益:(a)兩個或更多并發查詢應該能夠并行讀取不同的磁盤,或者(b)單個查詢應該能夠使用查詢并行來并行讀取多個磁盤。

注意,PostgreSQL 9.6(和10)中的查詢并行化不支援并行查詢不同的超表塊;查詢并行化僅适用于單個實體表(是以是單個塊)。我們可能會為此添加自己的支援,但目前不支援。

是以,尋找并行I/O的使用者有兩種選擇:

1、在多個實體磁盤上使用RAID設定,并将單個邏輯磁盤暴露到超表(即,通過單個表空間)。

2、對于每個實體磁盤,向資料庫中添加一個單獨的表空間。TimescaleDB允許您實際上将多個表空間添加到單個超表中(盡管在覆寫之下,每個基礎塊将由TimescaleDB映射到單個表空間/實體磁盤)。

我們建議在可能的情況下設定RAID,因為它支援上述兩種形式的并行化(即,單獨的磁盤查詢、并行的多個磁盤的單個查詢)。多表空間方法隻支援前者。在RAID設定中,不需要空間分區。

也就是說,當使用空間分區時,我們建議每個磁盤使用1個空間分區。

TimescaleDB不會從大量的空間分區中受益(例如分區字段中期望的唯一項的數量)。 大量這樣的分區導緻較差的每分區負載均衡(使用散列将項目映射到分區),以及某些類型查詢的計劃延遲大大增加。