CodeGym /Kurslar /SQL SELF /Məlumatların kütləvi yüklənməsinin optimallaşdırılması

Məlumatların kütləvi yüklənməsinin optimallaşdırılması

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

Təsəvvür elə, sənə bir milyon sətri yükləmək lazımdır. Əgər bunu yavaş-yavaş eləsən, serverin uzun müddət məşğul olacaq, istifadəçilər database-in ləng işlədiyini hiss edəcəklər, amma ən pisi — kofein proses bitənə qədər soyuyacaq. Optimallaşdırma serverin yüklənməsinin qarşısını alır, gözləmə vaxtını azaldır və yükləmə zamanı səhvlərin ehtimalını minimuma endirir.

Gəlin sadə addımlardan başlayaq, sonra isə daha çətin və hiyləgər fəndlərə keçək.

İndekslərin və trigger-lərin söndürülməsi

İndekslər və trigger-lər — database-lərimizi ağıllı və çevik edən əla şeylərdir. Amma kütləvi məlumat yükləyərkən onlar prosesi xeyli ləngidir, çünki server hər sətr üçün indeksləri yeniləməyə və trigger-ləri işlətməyə çalışacaq.

Bunu müvəqqəti olaraq sistemin boynundan atmaq üçün onları söndürmək olar.

İndekslərin və trigger-lərin söndürülməsi nümunəsi:

-- Cədvəl üçün trigger-ləri söndürürük
ALTER TABLE students DISABLE TRIGGER ALL;

-- Məlumatları yükləyirik
COPY students FROM '/path/to/students.csv' DELIMITER ',' CSV HEADER;

-- Trigger-ləri yenidən aktiv edirik
ALTER TABLE students ENABLE TRIGGER ALL;

Bu necə işləyir?

  1. Bütün trigger-ləri DISABLE TRIGGER ALL komandası ilə müvəqqəti söndürürük.
  2. Məlumat yükləndikdən sonra ENABLE TRIGGER ALL ilə trigger-ləri geri qaytarırıq.

Tipik səhv: əgər trigger-ləri geri aktiv etməyi unutsan, bəzi avtomatlaşdırma prosesləri (məsələn, default field-lərin yenilənməsi) düzgün işləməyə bilər. Ona görə də hər şeyi yerinə qaytarmağı unutma — bu, telefonunda "avia" rejimindən çıxmağa bənzəyir.

Transaction-lardan istifadə

Transaction-lar bütün məlumatı sanki bir böyük əməliyyat kimi yükləməyə imkan verir. Əgər nəsə səhv getsə, dəyişiklikləri geri qaytara bilərsən və database-in yarımçıq məlumatlarla dolu xaosa çevrilməz.

Transaction istifadəsi nümunəsi:

-- Transaction-a başlayırıq
BEGIN;

-- Məlumatları yükləyirik
COPY courses FROM '/path/to/courses.csv' DELIMITER ',' CSV HEADER;

-- Dəyişiklikləri təsdiqləyirik
COMMIT;

Niyə bu daha sürətlidir?

Məlumatları transaction-suz yükləyəndə, server hər sətrdən sonra dəyişiklikləri təsdiqləyir. Transaction ilə isə server bunu yalnız yükləmənin sonunda edir, bu da xeyli vaxt qazandırır.

İnteqrasiya yoxlamasının söndürülməsi

Əgər yükləmə zamanı xarici açar və ya unikal məhdudiyyətləri yoxlamağa ehtiyac yoxdursa, onları söndür. Əks halda database hər sətri yoxlayacaq və proses ləngiyəcək.

İnteqrasiya yoxlamasının söndürülməsi nümunəsi:

SET session_replication_role = 'replica';

-- Məlumatları yükləyirik
COPY enrollments FROM '/path/to/enrollments.csv' DELIMITER ',' CSV HEADER;

SET session_replication_role = 'origin';

session_replication_role = 'replica' məlumatların inteqrasiyasını (məsələn, unikal və FOREIGN KEY məhdudiyyətlərini) söndürür.

İcra üçün yaddaşın artırılması

PostgreSQL yaddaş ayarları məlumat yükləməsinin performansını yaxşılaşdıra bilər. Əsas parametrlər work_memmaintenance_work_mem-dir.

Yaddaşın artırılması nümunəsi:

-- Yaddaş həcmini artırırıq
SET work_mem = '64MB';
SET maintenance_work_mem = '256MB';

-- Məlumatları yükləyirik
COPY teachers FROM '/path/to/teachers.csv' DELIMITER ',' CSV HEADER;

Bu nə verir?

  • work_mem aralıq əməliyyatlar üçün, məsələn, sort və ya hash üçün istifadə olunur.
  • maintenance_work_mem indekslərlə bağlı əməliyyatlara, məsələn, onların yenidən qurulmasına təsir edir.

Məsləhət: Yaddaşı artıranda ehtiyatlı ol, xüsusilə resursları məhdud olan sistemlərdə.

Məlumatların yükləmədən əvvəl hazırlanması

Məlumatların hazırlanması yükləmə vaxtını xeyli azalda bilər. Məsələn, əgər təkrarlanan sətirlər varsa, onları əvvəlcədən filtr et ki, PostgreSQL serveri lazımsız məlumatları emal etməyə vaxt itirməsin.

Məlumatların təmizlənməsi nümunəsi:

Əgər təkrarlanan sətirlər olan bir faylın varsa, onları silmək üçün Python istifadə edə bilərsən.

import pandas as pd

# CSV faylını yükləyirik
data = pd.read_csv('students.csv')

# Dublikatları silirik
data = data.drop_duplicates()

# Təmiz CSV-ni saxlayırıq
data.to_csv('students_clean.csv', index=False)

Məlumatların partition-lanması

Əgər çox böyük bir faylın varsa, onu bir neçə kiçik fayla böl. Bu, PostgreSQL-in məlumatları daha effektiv emal etməsinə imkan verəcək.

Nümunə:

large_data.csv faylını Linux-da hər biri 1000 sətr olan hissələrə böl:

split -l 1000 large_data.csv chunk_

Sonra onları ayrı-ayrılıqda yüklə:

COPY students FROM 'chunk_aa' DELIMITER ',' CSV HEADER;
COPY students FROM 'chunk_ab' DELIMITER ',' CSV HEADER;
-- Və s.

Yükləməni fon rejimində icra etmək

Əgər imkan varsa, məlumatları yükləmək üçün fon proseslərindən istifadə et ki, əsas database-in yüklənməsin.

pg_cron kimi alətlər tapşırıqları cədvəl üzrə işə salmağa kömək edir.

Nümunə: pg_cron ilə fon yükləməsini qurmaq:

CREATE EXTENSION pg_cron;

SELECT cron.schedule('*/5 * * * *', $$COPY students FROM '/path/to/data.csv' DELIMITER ',' CSV HEADER$$);

Hər 5 dəqiqədən bir fayldakı məlumatlar cədvələ yüklənəcək.

Bu sadəcə nümunədir, əslində belə etmək lazım deyil! Sadəcə göstərmək istəyirdim ki, PostgreSQL çox çevikdir və sən məlumat əlavə etməni birbaşa SQL script-lərindən çox rahat idarə edə bilərsən.

Gizli tələlər

Nəzərə almağa dəyər bir neçə məqam:

  • İndeksləri və trigger-ləri söndürürsənsə, onları yenidən aktiv etməyi unutma! Unutsan — yükləmədən sonra səhvləri düzəltməli olacaqsan.
  • Yaddaş parametrlərini artıranda server resurslarını izləmək lazımdır: bir acgöz sorğu bütün RAM-ı yeyə bilər.
  • Transaction-lardan istifadə edəndə əmin ol ki, məlumat faylında kritik səhvlər yoxdur. Bir səhv bütün yükləməni geri qaytarmağa bəs edər.

Gələcək üçün tövsiyələr

Artıq bilirsən ki, kütləvi məlumat yükləməsini necə optimallaşdırmaq olar — indeksləri söndürməkdən transaction-lardan istifadəyə qədər. Bu bacarıqlar sənə məlumatları daha tez yükləməyə, server resurslarına, əsəblərinə, kofeinə qənaət etməyə və istifadəçiləri razı salmağa kömək edəcək.

Gələn dəfə, əgər gigabaytlarla fayllarla işləməli olsan, artıq hazırsan!

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