Postgresql

如何檢查 TimescaleDB 視圖是否定義為“WITH DATA”或“WITH NO DATA”?

  • May 5, 2022

TimescaleDB 物化視圖可以使用或不使用DATA.

檢查視圖定義的普通 Postgres 方法沒有尾隨編譯指示,包括DATA.

# \sv wmd

# select pg_get_viewdef('wmd', true)

# select definition from pg_views where viewname = 'wmd2';

TimescaleDb 元表也沒有闡明:

select materialized_only,  hypertable_schema , hypertable_name, view_schema, view_name  from timescaledb_information.continuous_aggregates;
select materialized_only,  hypertable_schema , hypertable_name, view_schema, view_name  from timescaledb_information.continuous_aggregates;
materialized_only | hypertable_schema | hypertable_name | view_schema | view_name 
-------------------+-------------------+-----------------+-------------+-----------
f                 | public            | wm              | public      | wmd
f                 | public            | wm              | public      | wmd2

即 2 個視圖看起來沒有區別,但查詢性能差異是 20 倍。

不確定這是否是最好的方法,但您可以計算每個表的分區數並推斷如果一個有更多數據,那麼它可能是使用 WITH DATA 啟用的。

select count(*) from timescaledb_information.chunks where hypertable_name = 'wmd';

選項WITH DATAWITHOUT DATA表示物化視圖是否將在創建期間刷新/填充(請參閱文件)。創建後,該選項沒有多大意義。

數據是否在視圖中刷新/具體化或不影響針對視圖的查詢性能。如果未刷新數據,則將查詢原始超表(並將結果與視圖中的數據連接),這應該在查詢計劃中使用EXPLAIN. 這種情況的一個原因,即視圖中沒有數據在問題中描述:WITHOUT DATA在創建期間使用,而超表已經包含數據。導致這種情況的還有其他原因:沒有添加連續聚合策略或從未呼叫過刷新。

我不確定是否有一種簡單的方法可以查看未填充的數據。幾種方法:

  1. 調查由於未填充數據導致的性能問題的最簡單方法是EXPLAIN查詢並調查查詢計劃。
  2. 還可以更改視圖並允許僅查詢視圖的物化數據而不從原始查詢中檢索數據。
  3. 可以了解物化視圖背後的內部結構,即它是如何儲存在內部超表和塊中的,並嘗試找到覆蓋範圍。由於內部結構會隨著時間而改變,我想我現在不知道該怎麼做。
  4. 也可能有一些內部元數據,它儲存有關物化間隔的數據,但是我在文件中找不到有關它們的資訊。

我建議閱讀

$$ this doc $$([https://docs.timescale.com/timescaledb/latest/overview/core-concepts/continuous-aggregates/#real-time-aggregates](https://docs.timescale.com/timescaledb/latest/overview/core-concepts/continuous-aggregates/#real-time-aggregates%5C))關於連續聚合概念,因為我認為它很好地解釋了它。 結論

據我所知,無法查看視圖是否是使用 DATA 創建的,而且總的來說,恕我直言,這沒有多大意義,因為它是將數據刷新到視圖中的幾種方法之一。由於從原始超表中查詢數據,視圖中失去的數據可能會導致性能下降。我對如何調查它提出了一些建議,但據我所知,沒有簡單的官方方法。

引用自:https://dba.stackexchange.com/questions/311665