PostgreSQL Tutorial
Bugun sizlar bilan JOIN lar haqida gaplashamiz. JOIN lar orqali biz bir vaqtning o'zida bir nechta table dan malutmolarni olib kelishimiz mumkin. Ya'ni bizda user_files table bo'lsa va unda user_id , file_id columnlari dagi malumotlar kelsa biz JOIN lar orqali…
SQL so'rovi, ikki (yoki undan ko'p) jadvallarni birlashtirish uchun ishlatiladi, ammo, bu so'rovda chap jadvalning barcha qatorlari (qo'shimcha shart bajarilsa) qaytariladi, va agar o'ng jadvalda mos keladigan qator topilmasa, undagi ustunlar NULL qiymatini olishadi.
SELECT orders.order_id, customers.customer_name
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id;
Bu misolda, orders jadvalidagi customer_id ustuniga qarab customers jadvalidagi customer_id ustuni bilan LEFT JOIN amalga oshirilgan. Natijada, barcha orders jadvalidagi qatorlar qaytariladi, va agar customers jadvalidagi customer_id ustuni bilan mos keladigan qator topilmasa, customer_name ustuni NULL qiymati bilan to'ldiriladi.
SELECT fields
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;
Bu yerda, fields - olish uchun tanlangan ustunlar ro'yxati, table1 va table2 - birlashtiriladigan jadvallar, va column_name - ularning birlashuvini amalga oshirish uchun foydalaniladigan ustun. Ustun nomlari bir xil bo'lishi zarur.
Please open Telegram to view this post
VIEW IN TELEGRAM
PostgreSQL Tutorial
Please open Telegram to view this post
VIEW IN TELEGRAM
SQL so'rovi, ikki (yoki undan ko'p) jadvallarni birlashtirish uchun ishlatiladi, ammo, bu so'rovda o'ng jadvalning barcha qatorlari (qo'shimcha shart bajarilsa) qaytariladi, va agar chap jadvalda mos keladigan qator topilmagan bo'lsa, undagi ustunlar NULL qiymatini olishadi.
Quyidagi misolni ko'ramiz:
SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;
SELECT fields
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;
Bu yerda, fields - olish uchun tanlangan ustunlar ro'yxati, table1 va table2 - birlashtiriladigan jadvallar, va column_name - ularning birlashuvini amalga oshirish uchun foydalaniladigan ustun. Ustun nomlari bir xil bo'lishi zarur.
Please open Telegram to view this post
VIEW IN TELEGRAM
SQL so'rovi, ikki (yoki undan ko'p) jadvallarni birlashtirish uchun ishlatiladi. Bu so'rovda, barcha qatorlar qaytariladi va agar bir jadvalda mos keladigan qator bo'lmasa, undagi ustunlar NULL qiymatini olishadi. Boshqa so'z bilan aytganda, bu so'rov LEFT JOIN va RIGHT JOIN ni birlashtiradi.
Quyidagi misolni ko'ramiz:
SELECT orders.order_id, customers.customer_name
FROM orders
FULL OUTER JOIN customers ON orders.customer_id = customers.customer_id;
Bu misolda, orders jadvalidagi customer_id ustuniga qarab customers jadvalidagi customer_id ustuni bilan FULL OUTER JOIN amalga oshirilgan. Natijada, barcha orders va customers jadvallaridagi qatorlar qaytariladi, va agar qo'shimcha jadvalarda customer_id ustuni bilan mos keladigan qator topilmagan bo'lsa, customer_name ustuni NULL qiymati bilan to'ldiriladi.
sql
SELECT fields
FROM table1
FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
SQL so'rovi, bir jadvallarning bir necha qatorlarini o'z ichiga birlashtirish uchun ishlatiladi. Bunday so'rovda, bir jadvalning har bir qatori boshqa qatorlar bilan o'z ichiga birlashtiriladi, o'zini boshqa qatorlariga o'xshash bo'lgan ustunlari boyicha.
Quyidagi misolni ko'ramiz. Agar bizda employees deb nomlangan jadval bo'lsa:
SELECT e1.employee_id, e1.employee_name, e2.supervisor_id, e2.supervisor_name
FROM employees e1
JOIN employees e2 ON e1.supervisor_id = e2.employee_id;
Bu so'rovda employees jadvali o'zini supervisor_id ustuni employee_id ustuni bilan birlashtiradi. Natijada, har bir xodimning ma'mul xodimi bor. e1 va e2 tabelalariga jadvallar qo'llanilgan qatlamalar hisoblanadi.
SELF JOIN so'rovining sintaksisi quyidagicha:
SELECT fields
FROM table1 alias1
JOIN table1 alias2 ON alias1.column_name = alias2.column_name;
Bu yerda, fields - olish uchun tanlangan ustunlar ro'yxati, table1 - o'zini o'ziga birlashtirish kerak bo'lgan jadval, va alias1 va alias2 - jadvalni o'z ichiga birlashtirish uchun ishlatiladigan aliaslar. Ustun nomlari bir xil bo'lishi zarur.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
CREATE TABLE IF NOT EXISTS products (
id SERIAL PRIMARY KEY ,
name VARCHAR(50) UNIQUE NOT NULL ,
price INT NOT NULL
);
CREATE TABLE IF NOT EXISTS products_history(
id INT ,
name VARCHAR(50) NOT NULL ,
price INT NOT NULL ,
status VARCHAR(15) NOT NULL ,
created_at TIMESTAMP DEFAULT current_timestamp
);
CREATE OR REPLACE FUNCTION update_products_history()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO products_history (id, name, price, status)
VALUES (
coalesce(NEW.id, old.id),
COALESCE(NEW.name, OLD.name),
COALESCE(NEW.price, OLD.price),
CASE
WHEN TG_OP = 'INSERT' THEN 'INSERT'
WHEN TG_OP = 'UPDATE' THEN 'UPDATE'
WHEN TG_OP = 'DELETE' THEN 'DELETE'
END
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER products_history_trigger
AFTER INSERT OR UPDATE OR DELETE
ON products
FOR EACH ROW
EXECUTE FUNCTION update_products_history();
create or replace procedure insert_product(
name varchar,
price int
)
language plpgsql
as $$
begin
INSERT INTO products(name, price) VALUES (name, price*100);
commit;
end;$$;
call insert_product('Banana', 5);
INSERT INTO products(name, price) VALUES ('Phone23455', 5000);
DELETE FROM products WHERE id=3;
👍1
PostgreSQL Tutorial
CREATE TABLE IF NOT EXISTS products ( id SERIAL PRIMARY KEY , name VARCHAR(50) UNIQUE NOT NULL , price INT NOT NULL ); CREATE TABLE IF NOT EXISTS products_history( id INT , name VARCHAR(50) NOT NULL , price INT NOT NULL , status…
1. Products nomli table yaratiladi.
2. Products_history nomli table yaratiladi,
3. Update Product history nomli FUNCTION yaratiladi.
4. products_history_trigger nomli Trigger yaratiladi.
5. insert_procedure nomli protsedura yaratiladi.
Products table ga malumot qo'shilganda uning har bitta rowini tinglab turgan trigger update_products_history nomli functionni chiqirib yuboryapti. update_products_history function esa products_history table ga coalesce yordamida qo'shyapti. (colasce - update ga o'xshaydi. Unga agar yangi malumot berilsa o'sha malumotni yozyapti agar yangi malumot berilmasa eskini yozib qo'yayapti). CASE ni ichida esa actionga qarab statusni aniqlab olib yozib qo'yayapti.
Bu yerda protsedura ham bor u esa call qilinganda unga name va price berilyapti u esa products table ham name ni o'z holicha, price ni esa dollardan cent ga o'zgartirib yozib qo'yayapti!
Keyingi postlarimda TRIGGER, FUNCTION, INDEX, PROCEDURE, TRANSACTION lar haqida alohida to'xtalib example lar bilan to'liq malumot beraman........
2. Products_history nomli table yaratiladi,
3. Update Product history nomli FUNCTION yaratiladi.
4. products_history_trigger nomli Trigger yaratiladi.
5. insert_procedure nomli protsedura yaratiladi.
Products table ga malumot qo'shilganda uning har bitta rowini tinglab turgan trigger update_products_history nomli functionni chiqirib yuboryapti. update_products_history function esa products_history table ga coalesce yordamida qo'shyapti. (colasce - update ga o'xshaydi. Unga agar yangi malumot berilsa o'sha malumotni yozyapti agar yangi malumot berilmasa eskini yozib qo'yayapti). CASE ni ichida esa actionga qarab statusni aniqlab olib yozib qo'yayapti.
Bu yerda protsedura ham bor u esa call qilinganda unga name va price berilyapti u esa products table ham name ni o'z holicha, price ni esa dollardan cent ga o'zgartirib yozib qo'yayapti!
Keyingi postlarimda TRIGGER, FUNCTION, INDEX, PROCEDURE, TRANSACTION lar haqida alohida to'xtalib example lar bilan to'liq malumot beraman........
👍8⚡1
sql
CREATE TABLE customers(
customer_id INT GENERATED ALWAYS AS IDENTITY,
customer_name VARCHAR(255) NOT NULL,
PRIMARY KEY(customer_id)
);
CREATE TABLE contacts(
contact_id INT GENERATED ALWAYS AS IDENTITY,
customer_id INT,
contact_name VARCHAR(255) NOT NULL,
phone VARCHAR(15),
email VARCHAR(100),
PRIMARY KEY(contact_id),
CONSTRAINT fk_customer
FOREIGN KEY(customer_id)
REFERENCES customers(customer_id)
ON DELETE SET NULL
);
⚡1
Umidjon Jabborov
Trigger haqida ma'lumot bera olasizmi qandya hoaltlarda ishlatiladi
PostgreSQL-da triggerlar (triggers) ma'lum bir hodisalar sodir bo'lganda avtomatik tarzda ishga tushadigan maxsus protseduralar (functions) hisoblanadi. Odatda triggerlar jadvallarda (tables) ma'lumotlar qo'shilganda, yangilanganda yoki o'chirilganda (INSERT, UPDATE, DELETE) ishga tushadi. Triggerlar yordamida ma'lumotlar yaxlitligini ta'minlash, avtomatlashtirilgan tekshiruvlar yoki o'zgarishlar amalga oshirish mumkin.
Trigger yaratish
Trigger yaratish uchun CREATE TRIGGER buyrug'i ishlatiladi. Bu buyruq trigger nomini, qachon va qaysi jadvalda ishga tushishini aniqlab beradi.
CREATE TRIGGER trigger_name
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE | TRUNCATE }
ON table_name
FOR EACH ROW
EXECUTE FUNCTION function_name();
BEFORE yoki AFTER: Trigger operatsiyadan oldin (BEFORE) yoki keyin (AFTER) ishga tushishi kerakligini aniqlaydi.
INSERT, UPDATE, DELETE, TRUNCATE: Qaysi hodisa triggerni ishga tushirishini aniqlaydi.
table_name: Trigger bog'langan jadval nomi.
function_name: Trigger ishga tushiradigan funksiyaning nomi.
Misol
Keling, quyidagi misol orqali triggerni ko'rib chiqamiz. Biz yangi yozuv qo'shilganda avtomatik tarzda jadvaldagi boshqa ustunni yangilaydigan trigger yaratamiz.
1. Trigger funksiyasini yaratish:
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.modified_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Bu funksiya modified_at ustunini hozirgi vaqt (NOW()) bilan yangilaydi.
2. Triggerni yaratish:
CREATE TRIGGER update_modified_at
BEFORE INSERT OR UPDATE ON your_table_name
FOR EACH ROW
EXECUTE FUNCTION update_modified_column();
Bu trigger har safar your_table_name jadvaliga yangi yozuv qo'shilganda yoki mavjud yozuv yangilanganda modified_at ustunini hozirgi vaqt bilan yangilaydi.
Triggerlarni o'chirish
Agar triggerni o'chirmoqchi bo'lsangiz, quyidagi buyruqni ishlatishingiz mumkin:
DROP TRIGGER trigger_name ON table_name;
Qo'shimcha ma'lumot
Triggerlar juda kuchli vosita bo'lib, ularni noto'g'ri ishlatish jadvallar bilan bog'liq operatsiyalarni sekinlashtirishi yoki murakkabligi tufayli qiyinchiliklar keltirib chiqarishi mumkin. Shu sababli, triggerlarni ishlab chiqishda ehtiyotkorlik bilan yondashish tavsiya etiladi.
Trigger yaratish
Trigger yaratish uchun CREATE TRIGGER buyrug'i ishlatiladi. Bu buyruq trigger nomini, qachon va qaysi jadvalda ishga tushishini aniqlab beradi.
CREATE TRIGGER trigger_name
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE | TRUNCATE }
ON table_name
FOR EACH ROW
EXECUTE FUNCTION function_name();
BEFORE yoki AFTER: Trigger operatsiyadan oldin (BEFORE) yoki keyin (AFTER) ishga tushishi kerakligini aniqlaydi.
INSERT, UPDATE, DELETE, TRUNCATE: Qaysi hodisa triggerni ishga tushirishini aniqlaydi.
table_name: Trigger bog'langan jadval nomi.
function_name: Trigger ishga tushiradigan funksiyaning nomi.
Misol
Keling, quyidagi misol orqali triggerni ko'rib chiqamiz. Biz yangi yozuv qo'shilganda avtomatik tarzda jadvaldagi boshqa ustunni yangilaydigan trigger yaratamiz.
1. Trigger funksiyasini yaratish:
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.modified_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Bu funksiya modified_at ustunini hozirgi vaqt (NOW()) bilan yangilaydi.
2. Triggerni yaratish:
CREATE TRIGGER update_modified_at
BEFORE INSERT OR UPDATE ON your_table_name
FOR EACH ROW
EXECUTE FUNCTION update_modified_column();
Bu trigger har safar your_table_name jadvaliga yangi yozuv qo'shilganda yoki mavjud yozuv yangilanganda modified_at ustunini hozirgi vaqt bilan yangilaydi.
Triggerlarni o'chirish
Agar triggerni o'chirmoqchi bo'lsangiz, quyidagi buyruqni ishlatishingiz mumkin:
DROP TRIGGER trigger_name ON table_name;
Qo'shimcha ma'lumot
Triggerlar juda kuchli vosita bo'lib, ularni noto'g'ri ishlatish jadvallar bilan bog'liq operatsiyalarni sekinlashtirishi yoki murakkabligi tufayli qiyinchiliklar keltirib chiqarishi mumkin. Shu sababli, triggerlarni ishlab chiqishda ehtiyotkorlik bilan yondashish tavsiya etiladi.
👍3
SELECT setval('track_codes_id_seq', 11062);
shu yerda turib tursin. Birozdan keyiin tushuntirib yozvoraman!
shu yerda turib tursin. Birozdan keyiin tushuntirib yozvoraman!
SELECT setval('track_codes_id_seq', 11062);
so'rovi
track_codes_id_seq
deb nomlangan SEQUENCE
ning hozirgi qiymatini 11062 ga sozlaydi. Keling, qadamlar bo'yicha tushuntirib o'taman:### 1. SEQUENCE nima?
PostgreSQL-da
SERIAL
yoki BIGSERIAL
tipidagi ustunlar avtomatik ravishda ketma-ket tartibda raqamlanadi. Buning uchun PostgreSQL har bir ustun uchun "SEQUENCE" yaratadi. Bu SEQUENCE
keyingi yozuvlar uchun id
yoki boshqa avtomatik qiymatlarni o'z ichiga oladi va tartiblab beradi.Misol uchun, agar sizda
id
ustuni SERIAL
deb belgilangan bo'lsa, har bir yangi yozuv qo'shilganda, bu ustunga avvalgi qiymatdan bir birlikka katta raqam avtomatik beriladi.### 2. `setval` funksiyasi nima qiladi?
setval
funksiyasi siz ko'rsatgan SEQUENCE
qiymatini majburan o'zgartiradi va uni qo'yilgan qiymatga to'g'rilaydi. Bu funksiya sizga SEQUENCE
ni qo'lda boshqarish imkonini beradi.### 3. So'rovning maqsadi
Bu so'rov
track_codes_id_seq
deb nomlangan SEQUENCE
ning keyingi qiymatini 11062 qilib o'rnatadi. Bu shuni anglatadi:- Agar keyingi yozuv
track_codes
jadvaliga qo'shilsa, uning id
qiymati avtomatik ravishda 11063 bo'ladi (chunki setval
11062 ga o'rnatilgan).### Qachon ishlatiladi?
- Agar siz jadvalga qo'lda ma'lumot kiritgan bo'lsangiz va
SEQUENCE
bilan ishlaydigan avtomatik qiymat izdan chiqqan bo'lsa (masalan, id
ustuni allaqachon qo'lda yuqori raqamli qiymatlar olgan bo'lsa), siz SEQUENCE
qiymatini bu usulda tiklashingiz kerak bo'ladi.- Yoki eski yozuvlarni o'chirib tashlab, keyingi
id
qiymatini yangi raqamdan boshlashni istasangiz.### Misol:
Agar
track_codes
jadvalida hozirgi eng katta id
qiymati 11062 bo'lsa va siz SEQUENCE
ni to'g'rilamasangiz, keyingi yozuv uchun id
qiymati kichikroq yoki noto'g'ri bo'lishi mumkin. setval
yordamida siz keyingi yozuvni to'g'ri tartibda davom ettirish uchun SEQUENCE
ni 11062 ga to'g'irlaysiz, shunda keyingi yozuv 11063 raqamidan boshlanadi.### Yakuniy natija:
-
setval('track_codes_id_seq', 11062);
keyingi yozuv uchun id
qiymatini 11063 qilib sozlash uchun SEQUENCE
ni 11062 ga o'rnatadi.👍2
EXPLAIN ANALYZE SELECT * FROM Users WHERE user_id = 5300157486;
Bazada so'rov ning qanchalik tez ishlayotganini ko'rsatuvchi sql query hisoblanadi. Juda kerakli query ayniqsa dasturingiz sekin ishlayotgan vaqt va siz uni tezlashtirmoqchi bo'lganingizda.
@psql_tutorial
🔥2👍1
SELECT query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
Bu query bazada eng kop vaqt olayotgan so'rovlarni topish uchun ishlatasiz.
Agar statistika pg_stat_statements yoqilmagan bo'lsa quyidagi so'rov bilan yoqasiz: 👇
CREATE EXTENSION pg_stat_statements;
Kopchilik cloud psql bazalarda bu extension uchun dostup yoq ammo support bilan "otnosheniya" qilib yoqtirib olsangiz bo'ladi 😅 😉
menda hozir pg_stat_statements extension uchun dostup yo'q ekan TIMEWEB CLOUD PSQL bazasida endi adminkalar bilan "otnosheniya" qilib yoqtirib olishim kerak 😅
❤1🆒1
Juda katta hajmdagi malumotlarni bazaga kiritish bo'yicha eng yaxshi usullar:
BULK INSERT👇
ENG TEZ USUL (COPY FROM) 🚀
BULK INSERT👇
INSERT INTO users (name, email)
VALUES
('User1', 'user1@example.com'),
('User2', 'user2@example.com'),
...
('User1000', 'user1000@example.com');
ENG TEZ USUL (COPY FROM) 🚀
COPY users(name, email) FROM '/path/to/data.csv' DELIMITER ',' CSV HEADER;
👍5
SELECT
(
SELECT COUNT(*)
FROM user_bots ub2
WHERE ub2.bot_id = ub.bot_id
AND ub2.in_channel = TRUE
AND DATE(ub2.created_at) BETWEEN $2 AND $3
) AS subscribers_in_channel,
(
SELECT COALESCE(ROUND(SUM(tm.price) / 100.0, 0), 0)
FROM transaction_meta tm
WHERE tm.bot_id = ub.bot_id
AND tm.status = 'success'
AND DATE(tm.created_at) BETWEEN $2 AND $3
) AS total_revenue_today,
(
SELECT COUNT(*)
FROM transaction_meta tm
WHERE tm.bot_id = ub.bot_id
AND tm.status = 'success'
AND DATE(tm.created_at) BETWEEN $2 AND $3
) AS sales_today,
(
SELECT COALESCE(ROUND(AVG(tm.price) / 100.0, 0), 0)
FROM transaction_meta tm
WHERE tm.bot_id = ub.bot_id
AND tm.status = 'success'
AND DATE(tm.created_at) BETWEEN $2 AND $3
) AS average_sale_price_today
FROM user_bots ub
WHERE ub.bot_id = $1
GROUP BY ub.bot_id;
🤝2❤1
📌 PostgreSQL’da Partition nima va nega u muhim?
#PostgreSQL #Partition #DatabaseOptimization
🔹 Partitioning — bu katta hajmdagi jadvalni bo‘laklarga ajratish texnikasi. Bu bo‘laklar partition deb ataladi va ular asosan samaradorlikni oshirish va qidiruvni tezlashtirish uchun ishlatiladi.
💡 Tasavvur qil:
Senda 100 million qatorli orders jadvali bor. Har safar qidiruv qilishda butun jadvalni ko‘zdan kechirish kerakmi? Yo‘q, buning o‘rniga orders_2023, orders_2024, orders_2025 kabi yil bo‘yicha bo‘lingan partition’lar foydali bo‘ladi.
⸻
🔧 Partition turlari:
1. Range Partitioning – ma’lumotlar qiymat oralig‘iga qarab ajratiladi.
Misol: date BETWEEN '2024-01-01' AND '2024-12-31'
2. List Partitioning – muayyan qiymatlarga qarab bo‘linadi.
Misol: region IN ('Toshkent', 'Fargʻona')
3. Hash Partitioning – ma’lumotlar hash funksiyasi orqali bo‘linadi.
Misol: user_id % 4
⸻
✅ Afzalliklari:
• Performance oshadi – kerakli partition’ni skanerlash kifoya.
• Ma’lumotni boshqarish osonlashadi – eski partlarni arxivlash, o‘chirish, yoki zaxiralash mumkin.
• Parallel query’lar – bir nechta partition ustida bir vaqtning o‘zida ishlaydi.
📚 P.S.: Partition ishlatish — bu katta hajmdagi jadval bilan ishlayotgan professional backendchilar uchun “must-know” texnika. Ayniqsa, vaqt bo‘yicha statistika, arxiv, loglar va billing tizimlarida juda asqotadi.
#PostgreSQL #Partition #DatabaseOptimization
🔹 Partitioning — bu katta hajmdagi jadvalni bo‘laklarga ajratish texnikasi. Bu bo‘laklar partition deb ataladi va ular asosan samaradorlikni oshirish va qidiruvni tezlashtirish uchun ishlatiladi.
💡 Tasavvur qil:
Senda 100 million qatorli orders jadvali bor. Har safar qidiruv qilishda butun jadvalni ko‘zdan kechirish kerakmi? Yo‘q, buning o‘rniga orders_2023, orders_2024, orders_2025 kabi yil bo‘yicha bo‘lingan partition’lar foydali bo‘ladi.
⸻
🔧 Partition turlari:
1. Range Partitioning – ma’lumotlar qiymat oralig‘iga qarab ajratiladi.
Misol: date BETWEEN '2024-01-01' AND '2024-12-31'
2. List Partitioning – muayyan qiymatlarga qarab bo‘linadi.
Misol: region IN ('Toshkent', 'Fargʻona')
3. Hash Partitioning – ma’lumotlar hash funksiyasi orqali bo‘linadi.
Misol: user_id % 4
⸻
✅ Afzalliklari:
• Performance oshadi – kerakli partition’ni skanerlash kifoya.
• Ma’lumotni boshqarish osonlashadi – eski partlarni arxivlash, o‘chirish, yoki zaxiralash mumkin.
• Parallel query’lar – bir nechta partition ustida bir vaqtning o‘zida ishlaydi.
CREATE TABLE orders (
id serial,
customer_id int,
order_date date
) PARTITION BY RANGE (order_date);
CREATE TABLE orders_2024 PARTITION OF orders
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
📚 P.S.: Partition ishlatish — bu katta hajmdagi jadval bilan ishlayotgan professional backendchilar uchun “must-know” texnika. Ayniqsa, vaqt bo‘yicha statistika, arxiv, loglar va billing tizimlarida juda asqotadi.
👍3
👎 PostgreSQL Partitioning’ning Kamchiliklari
Partition zo‘r narsa, lekin har bir "qulaylik" o‘z narxiga ega. Endi uning kamchiliklari haqida gaplashamiz:
❌ 1. Yozish (INSERT) sekinlashuvi
Ko‘pchilik o‘ylaydi: "Partition faqat tezlashtiradi!"
Yo‘q, INSERT operatsiyasi har safar to‘g‘ri partition’ni topish uchun qo‘shimcha tekshiruvlardan o‘tadi.
Ayniqsa, ko‘p bo‘lakli (many partitions) strukturada bu sezilarli kechikishga olib kelishi mumkin.
❌ 2. Trigger va Foreign Key cheklovlari
Partitionlangan jadvalda foreign key ishlamaydi (child jadval bo‘lishi mumkin emas).
Triggerlarni har bir partition uchun alohida qo‘shish kerak bo‘ladi. Ota jadvalda qo‘shilgan triggerlar child'larda ishlamaydi.
❌ 3. Maintenance murakkabligi
Har bir partition bu alohida jadval. Ularni yaratish, o‘chirish, migratsiya qilish – qo‘shimcha bosh og‘riq.
Agar partitionlar avtomatik yaratilmasa, yangilari qo‘lda yoki dastur orqali qo‘shilishi kerak bo‘ladi.
❌ 4. Planning va optimization murakkablashadi
Query planner noto‘g‘ri partition’ni tanlasa – optimal ishlamaydi.
Ba’zida indeks ishlamay qoladi, chunki u faqat bitta partition’da bor.
❌ 5. Yozishda UPDATE muammolari
Agar UPDATE operatsiyasi partition ajratilgan ustunga ta’sir qilsa, PostgreSQL yozuvni bir partition’dan olib, boshqasiga ko‘chiradi (DELETE + INSERT).
Bu esa performanceni keskin tushiradi.
📌 Xulosa:
Partition – kuchli qurol, lekin uni kerakli joyda va to‘g‘ri strategiya bilan ishlatmasang, aks ta’sir qiladi.
EXPLAIN ANALYZE bilan sinab ko‘r, so‘ngra bo‘laklarga bo‘l!
Partition zo‘r narsa, lekin har bir "qulaylik" o‘z narxiga ega. Endi uning kamchiliklari haqida gaplashamiz:
❌ 1. Yozish (INSERT) sekinlashuvi
Ko‘pchilik o‘ylaydi: "Partition faqat tezlashtiradi!"
Yo‘q, INSERT operatsiyasi har safar to‘g‘ri partition’ni topish uchun qo‘shimcha tekshiruvlardan o‘tadi.
Ayniqsa, ko‘p bo‘lakli (many partitions) strukturada bu sezilarli kechikishga olib kelishi mumkin.
❌ 2. Trigger va Foreign Key cheklovlari
Partitionlangan jadvalda foreign key ishlamaydi (child jadval bo‘lishi mumkin emas).
Triggerlarni har bir partition uchun alohida qo‘shish kerak bo‘ladi. Ota jadvalda qo‘shilgan triggerlar child'larda ishlamaydi.
❌ 3. Maintenance murakkabligi
Har bir partition bu alohida jadval. Ularni yaratish, o‘chirish, migratsiya qilish – qo‘shimcha bosh og‘riq.
Agar partitionlar avtomatik yaratilmasa, yangilari qo‘lda yoki dastur orqali qo‘shilishi kerak bo‘ladi.
❌ 4. Planning va optimization murakkablashadi
Query planner noto‘g‘ri partition’ni tanlasa – optimal ishlamaydi.
Ba’zida indeks ishlamay qoladi, chunki u faqat bitta partition’da bor.
❌ 5. Yozishda UPDATE muammolari
Agar UPDATE operatsiyasi partition ajratilgan ustunga ta’sir qilsa, PostgreSQL yozuvni bir partition’dan olib, boshqasiga ko‘chiradi (DELETE + INSERT).
Bu esa performanceni keskin tushiradi.
📌 Xulosa:
Partition – kuchli qurol, lekin uni kerakli joyda va to‘g‘ri strategiya bilan ishlatmasang, aks ta’sir qiladi.
EXPLAIN ANALYZE bilan sinab ko‘r, so‘ngra bo‘laklarga bo‘l!