1. Hypertables
1.1. Hypertable?
1.1.1. Hypertables là bảng postgresql được tự động phân vùng dữ liệu theo thời gian.
1.2. Hypertable index
1.2.1. What?
1.2.1.1. Các chỉ mục thời gian sẽ tự động được tạo khi tạo hypertables.
1.2.2. How?
1.2.2.1. Không tạo chỉ mục thời gian theo mặc định thì set create_default_indexes thành false
1.2.2.2. SELECT create_hypertable('solana_history_transaction_timescale', by_range('timestamp', INTERVAL '4 hours')) CREATE_DEFAULT_INDEXES false;
1.2.3. Unique index
1.2.3.1. Để tạo unique index trên hypertables cần xác định được các cột phân vùng. Và tạo index bao gồm tất cả các cột đó.
1.2.3.2. CREATE UNIQUE INDEX idx_id_timestamp ON solana_history_transaction_timescale(id, timestamp);
1.3. Hypertable partitionings
1.3.1. What?
1.3.1.1. Là các phân vùng dữ liệu được timescale tự động phân vùng. Mỗi phân vùng lưu chỉ theo một khoảng thời gian cụ thể được cài đặt trước.
1.3.2. How?
1.3.2.1. SELECT create_hypertable('solana_history_transaction_timescale', by_range('timestamp', INTERVAL '4 hours'));
1.4. Hypertable chunks
1.4.1. What?
1.4.1.1. Mỗi chunk sẽ chứa data trong một khoảng time range. (Mặc định là 7d và có thể thay đổi)
1.4.1.1.1. Chunk_time_interval = 25% tổng số memory
1.4.1.1.2. Tìm chunk size tối ưu -> follow link
1.4.2. How?
1.4.2.1. Setting chunk_time_interval khi tạo hypertables
1.4.2.2. Cập nhật chunk_time_interval đối với hypertables đã tồn tại.
1.4.2.2.1. SELECT set_chunk_time_interval('solana_history_transaction_timescale', INTERVAL '1 days');
2. Continous Aggregates
2.1. Continous Aggregates
2.1.1. What?
2.1.1.1. Continuous Aggregates tự động tính toán và lưu trữ kết quả của các truy vấn tổng hợp trên dữ liệu chuỗi thời gian theo một khoảng thời gian được định nghĩa trước (ví dụ: mỗi giờ, mỗi ngày). Điều này cho phép truy vấn dữ liệu tổng hợp cực kỳ nhanh chóng mà không cần phải tính toán lại từ dữ liệu gốc mỗi lần.
2.1.2. How?
2.1.2.1. Tạo materialized view
2.1.2.1.1. CREATE MATERIALIZED VIEW solana_ohlc_1s WITH (timescaledb.continuous) AS SELECT time_bucket('1 seconds', timestamp) AS time_1s, pair, FIRST(price_usd, timestamp) AS open_usd, FIRST(price_sol, timestamp) AS open_sol, MAX(price_usd) AS high_usd, MAX(price_sol) AS high_sol, MIN(price_usd) AS low_usd, MIN(price_sol) AS low_sol, LAST(price_usd, timestamp) AS close_usd, LAST(price_sol, timestamp) AS close_sol, SUM(base_amount * price_usd) AS volume_usd, SUM(base_amount * price_sol) AS volume_sol FROM solana_history_transaction_timescale GROUP BY time_1s, pair;
2.1.2.2. Tạo continous aggregate policy để tự động cập nhật dữ liệu cho materialized view
2.1.2.2.1. SELECT add_continuous_aggregate_policy('solana_ohlc_1month', start_offset => INTERVAL '4 month', end_offset => INTERVAL '2 month', schedule_interval => INTERVAL '2 month');
2.1.2.3. Refresh dữ liệu views trong một khoảng thời gian.
2.1.2.3.1. CALL refresh_continuous_aggregate('solana_ohlc_1s', '2024-12-13', '2024-12-14');
3. Realtime Aggregates
3.1. What?
3.1.1. Realtime Aggregates được xây dựng dựa trên Continuous Aggregates, nhưng giải quyết vấn đề độ trễ bằng cách kết hợp dữ liệu đã được tính toán trước trong Continuous Aggregate với dữ liệu mới nhất chưa được tổng hợp.
3.2. How?
3.2.1. Bật tổng hợp theo thời gian thực.
3.2.1.1. ALTER MATERIALIZED VIEW table_name set (timescaledb.materialized_only = false);
3.2.2. Tắt tổng hợp theo thời gian thực.
3.2.2.1. ALTER MATERIALIZED VIEW table_name set (timescaledb.materialized_only = true);
4. Compression
4.1. What?
4.1.1. Nén dữ liệu giúp gỉam hơn 90% kích thước chunk. Gỉam chi phí lưu trữ và giu các truy vấn ở tốc độ cao.
4.1.1.1. -> Khi nén dữ liệu thì nhiều dòng dữ liệu sẽ được gộp thành một dòng. Một dòng dữ liệu lưu trữ ít bộ nhớ hơn.
4.1.2. Ordering and segmenting
4.1.2.1. Ordering: Thứ tứ sắp xếp dữ liệu khi compress. Thường được chọn theo cột thời gian để tối ưu truy vấn khi lấy theo time.
4.1.2.2. Segmenting: Phân đoạn dữ liệu khi compress. Thường được chọn theo các cột thường dùng khi truy xuất data.
4.1.2.2.1. Trong bài toán của dex3 thì là pair (địa chỉ pair vì các truy vấn chart chỉ lấy data theo một pair.)
4.1.2.3. Config
4.1.2.3.1. ALTER TABLE solana_history_transaction_timescale SET ( timescaledb.compress, timescaledb.compress_segmentby='pair', timescaledb.compress_orderby='timestamp' );
4.2. How?
4.2.1. Compress chunk
4.2.1.1. Khởi tạo compress policy
4.2.1.1.1. SELECT add_compression_policy('solana_history_transaction_timescale', INTERVAL '7 days');
4.2.1.2. Lấy danh sách compress policy
4.2.1.2.1. SELECT * FROM timescaledb_information.jobs where proc_name = 'policy_compression' AND hypertable_name = 'solana_history_transaction_timescale';
4.2.2. Decompress chunk
4.2.2.1. Stop compress policy
4.2.2.1.1. SELECT alter_job(1002, scheduled => false);
4.2.2.2. Decompress chunk by time
4.2.2.2.1. SELECT decompress_chunk(c, true) FROM show_chunks('solana_history_transaction_timescale', '2024-11-30', '2024-10-25') c;
4.2.2.3. Remove compress policy
4.2.2.3.1. SELECT remove_compression_policy('solana_history_transaction_timescale');
5. Retention
5.1. What?
5.1.1. Tính năng Data Retention dùng để tự động xóa dữ liệu cũ không còn cần thiết, giúp tiết kiệm dung lượng lưu trữ và duy trì hiệu suất truy vấn.
5.2. How?
5.2.1. Thêm retention policy
5.2.1.1. SELECT add_retention_policy('solana_history_transaction_timescale', INTERVAL '90 days');
5.2.2. Lấy danh sách retention policy
5.2.2.1. SELECT * FROM timescaledb_information.retention_policies;
5.2.3. Xóa retention policy
5.2.3.1. SELECT remove_retention_policy('solana_history_transaction_timescale');
6. Tiered Storage
6.1. What?
6.1.1. Tính năng Data Tiered Storage (Lưu trữ Phân tầng Dữ liệu) cho phép bạn di chuyển dữ liệu giữa các loại lưu trữ khác nhau dựa trên tần suất truy cập của dữ liệu đó. Điều này giúp tối ưu chi phí lưu trữ bằng cách sử dụng các loại lưu trữ rẻ hơn cho dữ liệu ít được truy cập hơn, đồng thời vẫn đảm bảo hiệu suất truy vấn tốt cho dữ liệu thường xuyên được sử dụng.
6.2. How?
6.2.1. Thêm tiering policy
6.2.1.1. SELECT add_tiering_policy('solana_history_transaction_timescale', INTERVAL '30 days');
6.2.2. Xóa tiering policy
6.2.2.1. SELECT remove_tiering_policy('solana_history_transaction_timescale');
6.2.3. Lấy danh sách chunks đã tiered
6.2.3.1. SELECT show_chunks('solana_history_transaction_timescale', older_than => INTERVAL '30 days');
6.2.4. Untiered chunk
6.2.4.1. CALL untier_chunk( '_hyper_1_2_chunk');
6.2.5. Disable tiered
6.2.5.1. select disable_tiering('solana_history_transaction_timescale');