İçeriğe geç
academia.sh

Ders 12 / 14

İşlem ve Çözümleme Yükleri

İşlem yükü ile çözümleme yükünün erişim biçimlerindeki farkı, satır ve sütun yönelimli saklamanın okunan bayt miktarına etkisi, kapsayan dizin ve yıldız şeması.

İçindekiler

Normalizasyon konusu şemanın nasıl kurulacağını belirledi. Kalan soru, bu şemanın hangi tür iş yükü altında çalışacağıdır. Tek tek ödünç işlemlerini kaydeden bir sistemle yıllık ödünç istatistiği çıkaran bir sistem aynı veriyi ister ama aynı erişim biçimini istemez. Bu dersin sorusu şudur: iki yük biçimi nasıl ayrılır, ve bu ayrım saklama düzeninde ne değiştirir?

İki Yük Biçimi

İşlem yükü (transactional workload), gişedeki günlük çalışmadır: bir üyenin kaydını anahtarla getir, bir ödünç satırı ekle, bir iade satırını güncelle. Nitelikleri şunlardır: her istek az sayıda satıra dokunur, satırın bütün sütunları istenir, gecikme milisaniyelerle ölçülür, ve aynı anda çok sayıda istek çalışır. Yazma oranı yüksektir.

Çözümleme yükü (analytical workload), rapor üretmedir: hangi şubede hangi ay kaç ödünç verildi, gecikme cezalarının toplamı nedir, hangi konu başlığı yıllara göre nasıl değişti. Nitelikleri terstir: her istek milyonlarca satıra dokunur, satırın yalnız birkaç sütununu ister, gecikme saniyelerle ölçülür, eşzamanlı istek sayısı düşüktür ve yazma neredeyse yoktur.

Bu iki yük aynı veriyi paylaşır ama birbirine zıt tasarım kararları gerektirir. İşlem yükü normalleştirilmiş şemadan, dar satırlardan ve anahtar üzerinden erişimden kazanır. Çözümleme yükü geniş taramalardan, önceden birleştirilmiş yapılardan ve yalnız gerekli sütunun okunmasından kazanır.

Satır ve Sütun Yönelimi

Fark, saklama düzeninde somutlaşır. Satır yönelimli saklama (row-oriented storage) bir satırın bütün sütunlarını diskte yan yana tutar. Bir satırı okumak tek bir blok okumasıdır — işlem yükü için ideal. Buna karşılık tek bir sütunu toplamak, o sütunun yanındaki bütün sütunları da okumayı gerektirir.

Sütun yönelimli saklama (column-oriented storage) tersini yapar: aynı sütunun bütün değerleri yan yana durur. Bir sütunu toplamak yalnız o sütunu okur; buna karşılık tek bir satırın tamamını getirmek her sütundan ayrı okuma gerektirir.

Aradaki fark ölçülebilir. Satır yönelimli bir motorda sütun yönelimine öykünmenin yolu, tek bir sütunu kendi bağıntısında tutmaktır:

mkdir -p yuk && cd yuk && rm -f satir.db sutun.db

sqlite3 satir.db <<'SQL'
PRAGMA page_size = 4096;
CREATE TABLE odunc (
  odunc_no    INTEGER PRIMARY KEY,
  uye_no      INTEGER NOT NULL,
  isbn        TEXT    NOT NULL,
  sube_kodu   TEXT    NOT NULL,
  alis_tarihi TEXT    NOT NULL,
  iade_tarihi TEXT    NOT NULL,
  gecikme_gun INTEGER NOT NULL,
  ceza_kurus  INTEGER NOT NULL,
  kanal       TEXT    NOT NULL,
  not_metni   TEXT    NOT NULL
);
WITH RECURSIVE sayac(n) AS (
  SELECT 1 UNION ALL SELECT n + 1 FROM sayac WHERE n < 200000
)
INSERT INTO odunc (uye_no, isbn, sube_kodu, alis_tarihi, iade_tarihi,
                   gecikme_gun, ceza_kurus, kanal, not_metni)
SELECT n % 5000, '978-975-' || (n % 900), 'MRK', '2025-03-02', '2025-03-16',
       n % 7, (n % 7) * 250, 'gise', 'kayit notu alani ' || n
FROM sayac;
SQL

sqlite3 sutun.db "PRAGMA page_size = 4096;
CREATE TABLE ceza_kurus (deger INTEGER NOT NULL);"
sqlite3 satir.db "ATTACH 'sutun.db' AS s;
INSERT INTO s.ceza_kurus SELECT ceza_kurus FROM odunc;"

echo "satir.db $(wc -c < satir.db | tr -d ' ') bayt"
echo "sutun.db $(wc -c < sutun.db | tr -d ' ') bayt"
sqlite3 satir.db "SELECT SUM(ceza_kurus) FROM odunc;"
sqlite3 sutun.db "SELECT SUM(deger) FROM ceza_kurus;"
satir.db 16568320 bayt
sutun.db 1957888 bayt
149999250
149999250

İki dosya aynı iki yüz bin değeri taşır ve aynı toplamı verir. Ceza toplamını hesaplamak için satır yönelimli düzende 16,5 milyon bayt taranmalıdır; sütun düzeninde 2 milyon bayt. Sayfa boyutu blokta açıkça belirlendiği için ölçüm yinelenebilir; bayt sayıları sayfa boyutuna ve motorun satır kodlamasına göre değişir, oran ise sütun sayısı ve sütun genişlikleriyle belirlenir.

Sıkıştırmanın Payı

Sütun yöneliminin ikinci kazancı sıkıştırmadadır. Aynı sütunun değerleri aynı tipten ve çoğu zaman birbirine benzer olduğu için, satır yönelimli düzende elde edilemeyecek oranlar yakalanır. Üç yöntem yaygındır: sözlük kodlaması (dictionary encoding) tekrarlanan değerleri küçük tam sayılara eşler — şube kodu sütunu için birkaç bit yeter; koşu uzunluğu kodlaması (run-length encoding) sıralı sütunlarda ardışık aynı değerleri tek bir çift olarak saklar; bit paketleme dar aralıklı tam sayıları tam bayt sınırına hizalamadan yazar.

Sıkıştırma yalnız yer kazandırmaz. Okunan bayt azaldığı için tarama da hızlanır ve bazı işlemler değerleri açmadan, kodlanmış hâl üzerinde yapılabilir.

Satır Yönelimli Motorda Karşılık

Satır yönelimli bir motorun bu kazanca en yakın karşılığı kapsayan dizindir (covering index): sorgunun ihtiyaç duyduğu bütün sütunları içeren bir dizin. Motor tabloya hiç gitmeden yanıtı dizinden üretir.

sqlite3 :memory: <<'SQL'
CREATE TABLE odunc (
  odunc_no    INTEGER PRIMARY KEY,
  uye_no      INTEGER NOT NULL,
  sube_kodu   TEXT    NOT NULL,
  not_metni   TEXT    NOT NULL,
  ceza_kurus  INTEGER NOT NULL
);
EXPLAIN QUERY PLAN SELECT sube_kodu, SUM(ceza_kurus) FROM odunc GROUP BY sube_kodu;
CREATE INDEX odunc_ceza ON odunc (sube_kodu, ceza_kurus);
EXPLAIN QUERY PLAN SELECT sube_kodu, SUM(ceza_kurus) FROM odunc GROUP BY sube_kodu;
SQL
QUERY PLAN
|--SCAN odunc
`--USE TEMP B-TREE FOR GROUP BY
QUERY PLAN
`--SCAN odunc USING COVERING INDEX odunc_ceza

Dizin eklendikten sonra plan iki yönden değişir: tarama tablo yerine dizin üzerinde yapılır — yani yalnız iki sütun okunur — ve gruplama için geçici bir yapı kurulmasına gerek kalmaz, çünkü dizin zaten şube koduna göre sıralıdır. Kapsayan dizin, dar bir sorgu için sütun yönelimine yaklaşır; genişleyen sorgu kümesi için her birine ayrı dizin gerekeceğinden ölçeklenmez.

Çözümleme Şeması

Çözümleme yükü şema biçimini de değiştirir. Yıldız şeması (star schema) merkeze bir olgu bağıntısı (fact table), çevresine boyut bağıntıları (dimension table) koyar. Kütüphane örneğinde olgu bağıntısı ödünç olaylarıdır; boyutlar üye, kitap, şube ve takvimdir.

Olgu bağıntısının satırı, ölçülebilir büyüklükleri ve boyutlara giden anahtarları taşır: gecikme günü, ceza tutarı, üye anahtarı, kitap anahtarı, şube anahtarı, tarih anahtarı. Boyut bağıntıları ise kasten normalleştirilmemiştir — şube boyutu şube adını, ilini ve bölgesini bir arada tutar. Gerekçe önceki dersteki denormalizasyon gerekçesidir: boyutlar küçüktür, nadiren değişir ve her sorguda birleştirilir.

Tasarımın ilk kararı taneciktir (grain): olgu bağıntısının bir satırı neyi temsil eder? “Bir ödünç işlemi” ile “bir şubenin bir günlük özeti” farklı taneciklerdir ve sonradan değiştirilemez — daha ince tanecikten kabaya inilebilir, tersi yapılamaz.

İki Yükü Ayırmak

İki yükü aynı veritabanında çalıştırmak, ikisini de bozar. Uzun süren bir çözümleme sorgusu işlem yükünün kaynaklarını tüketir; işlem yükünün yazmaları çözümleme sorgusunun gördüğü veriyi değiştirir. Yaygın karşılık, çözümleme yükünü ayrı bir kopyaya taşımaktır: veri işlem sisteminden düzenli aralıklarla çıkarılır, dönüştürülür ve çözümleme sistemine yüklenir.

Bunun bedeli tazeliktir. Çözümleme kopyası her zaman bir miktar geridedir ve bu gecikmenin ne kadar olabileceği, sistemin karşılaması gereken açık bir gereksinimdir.

Özet

  • İşlem yükü az satıra çok sütunla, çözümleme yükü çok satıra az sütunla erişir; ikisi zıt tasarım kararları gerektirir.
  • Satır yönelimli saklama satırın bütün sütunlarını yan yana tutar; sütun yönelimli saklama aynı sütunun değerlerini yan yana tutar ve toplamada okunan baytı düşürür.
  • Aynı sütunun değerleri benzer olduğu için sütun düzeni sözlük kodlaması ve koşu uzunluğu kodlaması gibi yöntemlerle daha iyi sıkıştırılır.
  • Kapsayan dizin, satır yönelimli motorda dar sorgular için benzer bir kazanç verir ama genişleyen sorgu kümesine ölçeklenmez.
  • Yıldız şeması olgu bağıntısını boyutlarla çevreler; taneciğin seçimi geri alınamaz bir karardır.

Sonraki Adım

Bu ders iki kez aynı varsayıma dayandı: bir ödünç kaydının yazılması ya tümüyle olur ya hiç olmaz, ve bir çözümleme sorgusu yarım yazılmış bir durumu görmemelidir. Bu varsayımlar kursun ilk dersinde de geçmişti — dosyaya eşzamanlı yazan iki süreç bunları sağlayamamıştı. Sıradaki ders, veritabanı yönetim sisteminin bu güvenceleri hangi adla verdiğini tanımlar: atomiklik, tutarlılık, yalıtım ve kalıcılık.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat