CodeGym /Kurslar /SQL SELF /PostgreSQL-də müvəqqəti cədvəllərlə işləmək

PostgreSQL-də müvəqqəti cədvəllərlə işləmək

SQL SELF
Səviyyə , Dərs
Mövcuddur

Müvəqqəti cədvəllər — bunlar yalnız cari sessiya və ya tranzaksiya müddətində mövcud olan cədvəllərdir. Sessiyan bitən kimi (və ya tranzaksiya bağlananda) müvəqqəti cədvəl və onun məlumatları qumda iz kimi yox olur. Onlar müvəqqəti məlumat saxlamaq, aralıq hesablamalar və ya mürəkkəb əməliyyatlar üçün məlumat hazırlamaq üçün idealdır.

Bəs bunlar niyə lazımdır?

  • Müvəqqəti məlumat saxlama: Məsələn, səndə bir neçə mərhələdə aparılan mürəkkəb hesablamalar var. Əsas cədvəli yükləmək əvəzinə, müvəqqəti cədvəllərdən istifadə edə bilərsən.
  • Məlumat analizi: Bir neçə mənbədən məlumat toplayıb, onları işləyib, analizdən sonra müvəqqəti cədvəli silə bilərsən.
  • Mürəkkəb sorğuların optimallaşdırılması: Bəzən sorğunu bir neçə mərhələyə bölmək və müvəqqəti cədvəllərdən istifadə etmək daha sürətli olur.
  • Risklərin minimallaşdırılması: Real cədvəlləri təsadüfən korlamaq riski yoxdur — müvəqqəti cədvəllər tam izolyasiya olunub.

Müvəqqəti cədvəllərin magiyası ondadır ki, onların məlumatları yalnız sənə görünür! Digər istifadəçilər bu cədvəllərə baxa bilməz, ona görə də müvəqqəti cədvəllər eksperimentlər üçün tam təhlükəsizdir.

Müvəqqəti cədvəllərin yaradılması

Müvəqqəti cədvəl yaratmaq adi cədvəl yaratmağa bənzəyir, sadəcə TEMP və ya TEMPORARY açar sözü əlavə olunur.

Sintaksis:

CREATE TEMP TABLE table_name (
    column_name data_type constraints,
    ...
);

Çox sadədir, düzdür? Müvəqqəti cədvəl sessiyan bitəndə avtomatik yox olacaq.

Nümunə kimi tələbələr haqqında məlumat saxlamaq üçün müvəqqəti cədvəl yaradaq:

CREATE TEMP TABLE temp_students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INTEGER CHECK (age > 0)
);

İndi bizdə temp_students adlı müvəqqəti cədvəl var, ora məlumat əlavə edib, adi cədvəl kimi işləyə bilərik. Sadəcə unutma — sessiyanı bağlayanda o yox olacaq.

Sorğudan müvəqqəti cədvəl yaratmaq

Bəzən müvəqqəti cədvəlin strukturunu əl ilə yazmaq istəmirsən — xüsusən də sadəcə hansısa sorğunun nəticəsini saxlamaq və onunla işləmək istəyirsənsə. Bu halda belə bir forma köməyə gəlir:

CREATE TEMP TABLE cədvəl_adı AS
SELECT ...;

Bu konstruktor müvəqqəti cədvəli təkcə yaradır yox, dərhal sorğudan gələn məlumatlarla doldurur.

Tutaq ki, heç bir kursa yazılmamış tələbələri saxlamaq istəyirsən:

CREATE TEMP TABLE temp_unregistered_students AS
    SELECT s.id, s.name
    FROM students s
    LEFT JOIN enrollments e ON s.id = e.student_id
    WHERE e.student_id IS NULL;

İndi səndə temp_unregistered_students adlı cədvəl var və onu skriptin digər hissələrində istifadə edə bilərsən — sorğunu təkrar yazmağa ehtiyac yoxdur.

Bunun nə xeyri var?

  • Sütunları və tipləri açıq göstərməyə ehtiyac yoxdur — PostgreSQL onları SELECT nəticəsindən özü müəyyən edəcək.
  • Müvəqqəti məlumatları dəfələrlə istifadə edə bilərsən, təkrar hesablamaya ehtiyac yoxdur.
  • Xüsusilə hesabatlarda, ETL əməliyyatlarında və analitikada çox faydalıdır.

Müvəqqəti cədvəllər tranzaksiyalarda

Müvəqqəti cədvəlləri tranzaksiya daxilində də yarada bilərsən. Bu halda onlar tranzaksiya bitən kimi avtomatik silinəcək. Bu, xüsusilə müvəqqəti məlumatların bazada qalmayacağına əmin olmaq istədiyin tapşırıqlarda faydalıdır. Tranzaksiyalar barədə daha ətraflı bir neçə səviyyə sonra danışacam — hələlik rahat ol, narahat olma :P

Nümunə:

BEGIN;

CREATE TEMP TABLE temp_transactions (
    transaction_id SERIAL PRIMARY KEY,
    amount NUMERIC(10, 2) NOT NULL,
    status VARCHAR(50)
);

INSERT INTO temp_transactions (amount, status)
VALUES (100.50, 'Gözləmədə');

-- Məlumatlara baxaq
SELECT * FROM temp_transactions;

COMMIT;
-- İndi temp_transactions cədvəli yox oldu!

Əgər COMMIT əvəzinə ROLLBACK etsən, həm məlumatlar, həm də cədvəl silinəcək.

Müvəqqəti cədvəllərin real tapşırıqlarda istifadəsi

Nümunə 1: Məlumatların müvəqqəti birləşdirilməsi

Tutaq ki, səndə iki cədvəl var: studentscourses. Tapşırıq — hansı tələbələrin hələ kurslara yazılmadığını tapmaqdır. Əvvəlcə məlumatları müvəqqəti cədvəldə toplayıb, sonra analiz edə bilərik.

CREATE TEMP TABLE temp_unregistered_students AS
	SELECT s.id, s.name
	FROM students s
	LEFT JOIN enrollments e ON s.id = e.student_id
	WHERE e.student_id IS NULL;

-- İndi temp_unregistered_students müvəqqəti cədvəli ilə işləyə bilərik.
SELECT * FROM temp_unregistered_students;

Nümunə 2: Hesabat üçün məlumatların hazırlanması

Bəzən bir neçə cədvəldən məlumat toplayıb, onları çevirmək və hesabat hazırlamaq lazımdır. Müvəqqəti cədvəllər bu iş üçün əladır.

CREATE TEMP TABLE temp_sales AS
	SELECT p.product_id, p.name, SUM(s.quantity) AS total_quantity
	FROM products p
	JOIN sales s ON p.product_id = s.product_id
	GROUP BY p.product_id, p.name;

-- Nəticəni müvəqqəti cədvəldə saxladıq. İndi onun əsasında hesabat qurmaq olar:
SELECT name, total_quantity FROM temp_sales WHERE total_quantity > 50;

Müvəqqəti cədvəllərin fəndləri və xüsusiyyətləri

Müvəqqəti cədvəllərin adlandırılması: Əgər səndə artıq students adlı adi cədvəl varsa, yenə də eyni adda müvəqqəti cədvəl yarada bilərsən! Müvəqqəti cədvəl sessiya daxilində üstünlük təşkil edəcək. Amma unutma, bu bəzən çaşdırıcı ola bilər.

Müvəqqəti cədvəllərin optimallaşdırılması: PostgreSQL PRIMARY KEY və ya UNIQUE məhdudiyyəti olan sütunlar üçün avtomatik indeks yaradır, hətta müvəqqəti cədvəllərdə də. Əgər məlumatlarla işi sürətləndirmək istəyirsənsə, özün də indeks əlavə edə bilərsən:

CREATE INDEX idx_temp_students_age ON temp_students (age);

Müvəqqəti cədvəlin silinməsi: Əgər müvəqqəti cədvəli sessiya bitmədən silmək istəyirsənsə, DROP TABLE əmri istifadə et:

DROP TABLE temp_students;

Müvəqqəti cədvəldə məlumat həcmi: Müvəqqəti cədvəllər yaddaşda saxlanılır (resurslar kifayət edirsə), bu da onları çox sürətli edir. Amma unutma, çox böyük məlumatlar artıq diskə yazıla bilər.

Tez-tez rast gəlinən səhvlər və onlardan necə qaçmaq olar

Səhv 1: "Cədvəl artıq mövcuddur"

Əgər eyni adda başqa bir müvəqqəti cədvəl varsa, yeni müvəqqəti cədvəl yaratmağa çalışsan, səhv alacaqsan. CREATE TEMP TABLE IF NOT EXISTS istifadə et və ya cədvəli yaratmazdan əvvəl sil:

DROP TABLE IF EXISTS temp_students;
CREATE TEMP TABLE temp_students (...);

Səhv 2: "Cədvəl çox tez yox olur"

Əgər müvəqqəti cədvəli tranzaksiya daxilində yaradırsansa, unutma ki, tranzaksiya bitəndə o da yox olacaq. Addımlarını əvvəlcədən planlaşdır!

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION