Sayfalar

1 Ekim 2024 Salı

Postgresql TimeScaleDB ve mevcut tabloyu timeseri tabloya dönüştürme

 PostgreSQL'de Zaman Serisi Veritabanı Oluşturmak ve Mevcut tablolarınızı Zaman Seri tablolarda saklayarak performansı artırabilirsiniz. bunun için güçlü bir kullanım ve performans olarak ta ciddi kazanımlar sağlamaktadır.


Postgresql 16 da sürümünde henüz resmi pakteleri desteklememektedir, 15 sürümünde doğrudan kurabilirsiniz.   ben hem 15 hemde 16 versiyon için kurulum paktlerini paylaşacağım.


postgresql 15 versiyon ullanıyorsanız. aşağıdaki komutlar ile timescale extentionu postgresql kurulu makinanıza kolay bi şekilde kurabilirsiniz. tabi bu kurulumlar debian ve türevleri için,



--postgresql 15 versioyon için

sudo apt update

sudo apt install postgresql-15-timescaledb-2-postgresql-15




--postgresql 16 versiyon için;

--timescale db nin ihtiyaç duyduğu araçları yükleyelim.

sudo apt update
sudo apt install build-essential cmake git libssl-dev clang llvm libclang-dev postgresql-server-dev-16


--TimeScaleDb kaynak kodu indiriyoruz githup tan.
cd /usr/local/src/
sudo git clone https://github.com/timescale/timescaledb.git
cd timescaledb

# Uyumlu sürüm için TimescaleDB'nin ana dalına çekelim
sudo git checkout latest


-- TimeScaleDB yi Derliyoruz
# Kuruluma hazırlık
sudo ./bootstrap

# Derleme
cd build && sudo make

# Kurulum
sudo make install


buraya kadar hem 15 hemde 16 versiyon postgresql sürümleri için kurulumu tamamladık. Şimdide extention ı db de oluşturacağız

sudo systemctl restart postgresql


-- TimescaleDB'nin yüklü olduğunu doğrulayın
\dx

-- Eklentiyi yüklemek için bir veritabanına bağlanın ve TimescaleDB'yi ekleyin
biz burada test_timescale_db adında bir db oluşturup işlemlerimizi orada yapacağız.

create database test_timescale_db

\c test_timescale_db

CREATE EXTENSION IF NOT EXISTS timescaledb;

-- Tablomuzun createini pgadmin üzerinden alarak yeni veritabanımızda oluşturalım.

>>> buradaki adımı pgadmin üzerinden yapıyorsunuz..

--TimescaleDB ile Hypertable Dönüşümü
Tabloyu TimescaleDB’nin performans özelliklerinden faydalanmak için hypertable’a dönüştürelim. Bu işlemi sendtime sütununu kullanarak yapacağız (zaman temelli veri olduğu için bu sütunu seçtik).

Burada önemli bir konu daha var, eğer time seri data da null varsa bunu yapmaya izin vermeyecektir. data da null olmaması gerekir.

-- Test veritabanına geri dönün
\c test_timescale_db;

-- Tabloyu hypertable'a dönüştürün
SELECT create_hypertable('public.projectadata', 'sendtime');


Timescale db de sıkıştırma özelliğini de kullanabilirsiniz.  

-- Sıkıştırmayı tabloya uygulayın
ALTER TABLE public.projectadata SET (timescaledb.compress, timescaledb.compress_orderby = 'sendtime');

-- Sıkıştırmayı uygula
SELECT compress_chunk(i.chunk_name) 
FROM show_chunks('public.projectdata') i;



tüm işlemler bu kadar,

şimdi burada aynı instance yani cluster da bulunan farklı db lerde bulunan bir tabloyu test_timescale_db ye atarak kullanıma başlayacağız.

bunun için dblinki kullanabiliriz, yada pg_admin , pg_dump gibi diğer toollar ile aktarımı yapabiliriz.

.-dblink Kullanarak Veri Kopyalayın

-- Mevcut veritabanında
CREATE EXTENSION dblink;

-- Test veritabanında
\c test_timescale_db
CREATE EXTENSION dblink;


daha sonra verileri atıyoruz..

tabi bu işlemden önce data da null olmadığını kontrol ediyoruz..

--varsa farklı kolon secebiliriz.
SELECT count(*) 
FROM public.projectdata 
WHERE sendtime IS NULL;


-- Mevcut veritabanına bağlanarak veri çekin ve yeni veritabanındaki tabloya ekleyin

INSERT INTO test_timescale_db.public.projectdata
SELECT * FROM dblink('dbname=test user=postgres', 'SELECT * FROM public.projectdata') 
AS t(customername VARCHAR(25), platformname VARCHAR(25), systemname VARCHAR(25), categoryname VARCHAR(255), tagname VARCHAR(100), sensorname VARCHAR(25), tagvalue DOUBLE PRECISION, tagdate VARCHAR(10), tagtime TIME, des_unit VARCHAR(155), hour INTEGER, minute INTEGER, second INTEGER, tagdescription VARCHAR(100), tagminvalue DOUBLE PRECISION, tagmaxvalue DOUBLE PRECISION, tagunit VARCHAR(50), data_status VARCHAR(8), tagerrvalue INTEGER, tagdatetime VARCHAR(26), sendtime TIMESTAMP);


tablo üzerinde chunklar olup olmadığını görebiliriz


SELECT show_chunks('public.proectdata');

--eğer chunk'lar varsa bunları sıkıştırabiliriz.

SELECT compress_chunk(chunk)
FROM show_chunks('public.projectdata') AS chunk;