From: | Kingem Kurdam <kingemkurdam(at)gmail(dot)com> |
---|---|
To: | pgsql-tr-genel(at)postgresql(dot)org |
Subject: | Postgresql Nested Row ve JOIN |
Date: | 2018-01-01 23:09:33 |
Message-ID: | CAAz63+Wy4U00gZ-=soUcDNeVUsL3ooquKswxuL4sAyUGznvsWQ@mail.gmail.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-tr-genel |
Merhabalar,
Mysql + mongodb üzerinde çalışan bir sistemi postgresql geçirmeyi
düşünüyorum.
Database'i dizayn ederken takıldım, yardımcı olursanız sevinirim.
Postgresql'un json ve transaction desteği inanılmaz güzel.
Şu şekilde bir kullanıcılar tablom var yaklaşık *30 bin* kayıt oluyor.
CREATE TABLE members
(
id SERIAL PRIMARY KEY NOT NULL,
username CHAR(50) NOT NULL,
password CHAR(50) NOT NULL,
manager_id INT NOT NULL,
super_manager_id INT NOT NULL,
joker_manager_id INT NOT NULL
);
Birde döküman tablom var yaklaşık *5 milyon* kayıt oluyor.
CREATE TABLE documents
(
id SERIAL PRIMARY KEY NOT NULL,
members_id INT NOT NULL,
document_name CHAR(50) NOT NULL,
);
Şuan aktif sistemde *members *kısmı *mysql*'de *documents* kısmı da*
mongodb*'de bulunuyor ve döküman eklendiğinde
manager_username,joker_manager_username, super_manager_username
manager_id,joker_manager_id ve super_manager_id
kayıtla birlikte ekleniyor.
Fakat sistemde kullanıcının manageri değiştiğinde dökümanlarda kullanıcının
bu *6 kolonunun* değişmesi gerekiyor ve ihtiyaçtan 6 kolon var her satırda.
Döküman kayıtlarını listelerken kullanıcının *manager* bilgilerininin
*filtrelenip* listelenmesi gerekiyor.Çünkü her yönetici kendisine ait alt
kullanıcıların dökümanlarını görebilmesi gerekiyor.
Mongodb'de text halinde eklenip indexlendiğinde performans sıkıntısı
çıkarmıyor.
*Sormak istediğim yukardaki tablo yapısı hatalımı? kayıt sayısına göre.*
Aktif sistemde *documents* tablosunda epey bir read oluyor bazı zamanlarda.
Yükü anlatabilmek için grafikleri paylaşıyorum.
Son yedi güne ait mongodb :
https://gyazo.com/79553634f83460ef7352fb1595c27838.png
Son yedi güne ait mysql
https://gyazo.com/f0303d7badcb6ccce13c0b3a6019dd88.png
Sadece members kısmını listelemek için.2 farklı sorgu yazdım biri join biri
de sub-query.
// sorgu 1 join style explain sonucu https://explain.depesz.com/s/aJC6
SELECT u.username,
j.username AS jmanager,
s.username AS smanager,
m.username AS manager
FROM members AS u
left join members AS j
ON u.joker_manager_id = j.id
left join members AS s
ON u.super_manager_id = s.id
left join members AS m
ON u.manager_id = m.id
// sorgu 2 sub query explain sonucu https://explain.depesz.com/s/aalc
SELECT u.username,
(SELECT j.username
FROM members j
WHERE j.id = u.id) AS jmanager,
(SELECT s.username
FROM members s
WHERE s.id = u.id) AS smanager,
(SELECT m.username
FROM members m
WHERE m.id = u.id) AS manager
FROM members u
Bu şekilde index oluşturdum fakat yukardaki sorgularda herhangi bir
performans artışı olmadı.
CREATE INDEX "members_super_manager_id" ON
"public"."members"("super_manager_id");
CREATE INDEX "members_joker_manager_id" ON
"public"."members"("joker_manager_id");
CREATE INDEX "members_manager_id" ON "public"."members"("manager_id");
Acaba mongodb'deki gibi 6 extra kolon açarsam dahamı performanslı olacaktır?
Eskisi gibi kullanıcı document eklerken manager bilgilerinide birlikte
kaydetmek.
yada document eklendiğinde trigger ile ekleyen kullanıcının manager
bilgilerini eklemek.
*Documents* tablosunu members ile joinlersem nasıl bir şey olacak henüz
bilmiyorum.
*Documents* test datası oluşturup bakacağım fakat tablo yapısından tam emin
olamadım bu yüzden deneyimli arkadaşların yardımlarına *ihtiyacım* var. .
*members* test datası https://paste.ubuntu.com/26302697/
Yardımlarınızı ve yorumlarınızı bekliyorum.
Şimdiden Teşekkür Ederim.
Kadir
From | Date | Subject | |
---|---|---|---|
Next Message | AZiZ CiZMECi | 2018-02-04 15:43:26 | Postgresql Function içinde array nasıl kullanılır? |
Previous Message | İhsan Yiğitbaşı | 2017-12-28 17:33:00 | DBA Pozisyonları - İş İlanı |