CodeGym /Kurslar /SQL SELF /İndekslərin silinməsi və dəyişdirilməsi: DROP INDE...

İndekslərin silinməsi və dəyişdirilməsi: DROP INDEX, REINDEX

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

PostgreSQL-də indeksləri silmək və ya dəyişmək bir neçə halda lazım ola bilər:

  • İndekslərin artıq olması: Əgər çoxlu indeks yaratmışıqsa və onlar artıq istifadə olunmursa, bu INSERT, UPDATEDELETE kimi yazma əməliyyatlarını ləngidə bilər.
  • İndekslərin zədələnməsi: Bəzən indekslər zədələnə bilər, xüsusilə sistemdə problem olduqda və ya PostgreSQL düzgün bağlanmadıqda.
  • Optimallaşdırma: Sən öyrənirsən ki, sorğular üçün daha uyğun indeks tipi var və mövcud indeksi dəyişmək istəyirsən.
  • Cədvəl strukturunun dəyişməsi: Cədvələ sütun əlavə və ya siləndə, həmin sütunlara bağlı indekslər artıq aktual olmaya bilər.

İndi isə indeksləri idarə etməyə kömək edən DROP INDEXREINDEX komandaları ilə necə işləmək lazım olduğunu izah edəcəyik.

DROP INDEX ilə indekslərin silinməsi

DROP INDEX komandası indeksin bazadan silinməsi üçün istifadə olunur. Ümumi sintaksis belədir:

DROP INDEX [ IF EXISTS ] index_name [ CASCADE ];

Gəlin bunu bir az daha detallı baxaq:

  • IF EXISTS: indeks adı mövcud deyilsə, səhvin qarşısını alır. Bunun əvəzinə PostgreSQL sadəcə xəbərdarlıq verir.
  • index_name: silmək istədiyin indeksin adı.
  • CASCADE: indekslə bağlı bütün obyektlərin də silinəcəyini göstərir. Bu nadir hallarda istifadə olunur, çünki indekslərin adətən asılılıqları olmur.

Nümunə 1: sadə indeks silinməsi

Təsəvvür elə ki, students adlı cədvəldə email sütununda indeks var. Artıq bu indeks lazım deyil. Onu belə silə bilərik:

DROP INDEX idx_students_email;

Burada idx_students_email — indeksin adıdır. Sorğunu işlətdikdən sonra indeks bazadan silinəcək.

Nümunə 2: indeksin mövcudluğunu yoxlayaraq silmək

Əgər əmin deyilsənsə ki, indeks var, IF EXISTS opsiyasını istifadə et:

DROP INDEX IF EXISTS idx_students_email;

Əgər indeks yoxdursa, PostgreSQL səhv verməyəcək — sadəcə xəbərdarlıq alacaqsan.

Nümunə 3: asılı obyektləri silməyə cəhd edək (CASCADE)

Tutaq ki, hansısa məhdudiyyətlə bağlı indeks var. Məsələn, UNIQUE məhdudiyyəti üçün avtomatik yaradılmış unikal indeks. Belə indeksi silməyə çalışsan, PostgreSQL bunu etməyə imkan verməyəcək, ta ki CASCADE yazmayınca:

DROP INDEX idx_students_email CASCADE;

Diqqət et, bu yanaşmanı ehtiyatla istifadə et. Əmin deyilsənsə, heç nəyi kaskadla silməyə tələsmə.

REINDEX ilə indekslərin bərpası

REINDEX komandası indekslər zədələnəndə və ya köhnələndə onları bərpa etmək üçün istifadə olunur. Bu, fayl sistemində səhvlər, bazada nasazlıq və ya sadəcə uzun müddət istifadə nəticəsində baş verə bilər.

Əsas sintaksis

REINDEX { INDEX | TABLE | SCHEMA | DATABASE } name;

Opsiyalara bir az daha baxaq:

  • INDEX: konkret indeksi bərpa edir.
  • TABLE: göstərilən cədvəldəki bütün indeksləri bərpa edir.
  • SCHEMA: göstərilən sxemadakı bütün cədvəllərin indekslərini bərpa edir.
  • DATABASE: cari bazadakı bütün indeksləri bərpa edir.

Nümunə 1: konkret indeksin bərpası

Əgər idx_students_email indeksinin yavaş işlədiyini hiss etmisənsə, onu bərpa edə bilərsən:

REINDEX INDEX idx_students_email;

Nümunə 2: cədvəldəki bütün indekslərin bərpası

Əgər students cədvəlində indekslərin zədələndiyindən şübhələnirsənsə, hamısını bərpa et:

REINDEX TABLE students;

Nümunə 3: bütün bazadakı indekslərin bərpası

Sistem nasazlığı zamanı bütün bazadakı indekslər zədələnə bilər. Onları belə bərpa edə bilərsən:

REINDEX DATABASE university;

Qeyd: Bu əmri işlətmək üçün superuser hüququ lazımdır.

DROP INDEXREINDEX ilə işləyərkən məsləhətlər

Xüsusilə avtomatlaşdırma ssenarilərində səhvlərin qarşısını almaq üçün həmişə IF EXISTS istifadə et.

İndeksi silməzdən əvvəl həqiqətən istifadə olunmadığına əmin ol. İndeksin istifadə olunub-olunmadığını yoxlamaq üçün sorğu işlə:

SELECT *
FROM pg_stat_user_indexes 
WHERE indexrelname = 'idx_students_email';

CASCADE parametrinə diqqətli ol! Bəzən asılı məhdudiyyətlər və ya obyektlər məlumatların bütövlüyü üçün vacibdir.

Bazanın müntəzəm servisi üçün REINDEX istifadə et. Bu, xüsusilə tez-tez dəyişən cədvəllər və ya böyük həcmli məlumatlarla işləyərkən faydalıdır.

Hansı səhvlərlə qarşılaşmaq olar?

İndekslərin silinməsi və ya dəyişdirilməsi bir sıra tipik səhvlərlə müşayiət oluna bilər.

Mövcud olmayan indeksi silməyə cəhd. Əgər IF EXISTS istifadə etmirsənsə, PostgreSQL belə səhv verəcək:

ERROR:  index "idx_nonexistent" does not exist

Sistem indeksinin silinməsi. Təsadüfən sistem indeksini silməyə çalışsan, bu fəlakətə səbəb ola bilər. Məsələn, əsas sütunlar (primary key) ilə bağlı indekslər var. Onları birbaşa silmək olmaz, PostgreSQL ALTER TABLE DROP CONSTRAINT ilə silməyə məcbur edəcək.

Cədvəlin bloklanması. DROP INDEX və ya REINDEX əməliyyatları bəzən cədvəli bloklaya bilər, xüsusilə cədvələ paralel sorğular gedirsə. Əgər bunu istəmirsənsə, REINDEX əvəzinə CONCURRENTLY parametri ilə indeks yaratmağı düşün.

Real layihələrdə tətbiqi

Sorğuların optimizasiyası: əgər indeks artıq istifadə olunmursa, onu sil ki, bazanın resursları boşuna getməsin.

İndekslərin təmizlənməsi: inkişaf zamanı test üçün yaradılmış "zibil" indekslər qala bilər. Lazımsız indeksləri müntəzəm sil.

Performansın dəstəklənməsi: indekslərin sürətli və düzgün işləməsi üçün REINDEX istifadə et.

Artıq bu alətlərlə yalnız indeks yaratmaq yox, həm də PostgreSQL-də indeksləri effektiv idarə edə bilərsən. Bu, bazanın optimizasiyası və performansının təmin olunmasında vacib mərhələdir. İndekslərini qaydasında saxla!

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