Kursusel oli kokku 9 moodulit, kus iga juurde anti ka ports kohustuslikku kirjandust lugeda. Loomulikult sel ajal ma seda ei jõudnud lugeda, kuid võtan nüüd eesmärgiks kuu aega järjest lugeda. Vaatame, kuhu jõuame. Lugemine suvalises järjekorras.


Tim Lu: OLTP vs OLAP: A Beginner’s Guide to Data Systems, moodul 2: andmemudelid ja baasid, lisainfot OLAP ja OLTP süsteemide kohta.


OLTP:

SELECT customer_name FROM database WHERE customer_ID = 23;


OLAP:

-- Faktid
fact_sales(sale_id, sale_date_key, product_key, store_key, customer_key, qty, net_amount)
fact_inventory(snapshot_date_key, product_key, store_key, qty_on_hand, inventory_value) -- Dimensioonid
dim_date(date_key, full_date, year, quarter, month, month_name, is_weekend)
dim_product(product_key, product_name, category, subcategory, brand)
dim_store(store_key, store_name, city, region)
dim_customer(customer_key, customer_segment) Küsimus: regiooni, kategooria ja kuu lõikes näita müüki, müügi kasvu eelmise kuuga võrreldes, kumulatiivset müüki aastas, kategooria osakaalu regioonis ning viimase laoseisu (poolliidetav mõõdik). WITH monthly_sales AS (
    SELECT
        st.region,
        p.category,
        d.year,
        d.month,
        d.month_name,
        MIN(d.full_date) AS month_start,
        SUM(fs.qty) AS units_sold,
        SUM(fs.net_amount) AS net_sales
    FROM fact_sales fs
    JOIN dim_date d      ON d.date_key = fs.sale_date_key
    JOIN dim_product p   ON p.product_key = fs.product_key
    JOIN dim_store st    ON st.store_key = fs.store_key
    WHERE d.year = 2025
    GROUP BY
        st.region,
        p.category,
        d.year,
        d.month,
        d.month_name
), sales_with_olap AS (
    SELECT
        region,
        category,
        year,
        month,
        month_name,
        month_start,
        units_sold,
        net_sales,         -- eelmine kuu samas regioonis + kategoorias
        LAG(net_sales) OVER (
            PARTITION BY region, category
            ORDER BY month
        ) AS prev_month_sales,         -- kumulatiiv müük aasta sees
        SUM(net_sales) OVER (
            PARTITION BY region, category, year
            ORDER BY month
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        ) AS ytd_sales,         -- kategooria osakaal regiooni kuu müügist
        net_sales * 100.0 / SUM(net_sales) OVER (
            PARTITION BY region, year, month
        ) AS category_share_in_region_pct,         -- regiooni järjekoht kuu müügi järgi
        RANK() OVER (
            PARTITION BY year, month
            ORDER BY SUM(net_sales) OVER (PARTITION BY region, year, month) DESC
        ) AS region_rank_in_month
    FROM monthly_sales
), latest_inventory AS (
    -- poolliidetav: laoseisu EI tohi liita kuude lõikes, võtame viimase hetke
    SELECT DISTINCT ON (st.region, p.category)
        st.region,
        p.category,
        fi.qty_on_hand,
        fi.inventory_value,
        d.full_date AS inventory_snapshot_date
    FROM fact_inventory fi
    JOIN dim_date d    ON d.date_key = fi.snapshot_date_key
    JOIN dim_product p ON p.product_key = fi.product_key
    JOIN dim_store st  ON st.store_key = fi.store_key
    WHERE d.year = 2025
    ORDER BY st.region, p.category, d.full_date DESC
) SELECT
    s.region,
    s.category,
    s.year,
    s.month,
    s.month_name,
    s.units_sold,
    ROUND(s.net_sales, 2) AS net_sales,
    ROUND(s.prev_month_sales, 2) AS prev_month_sales,
    ROUND(
        100.0 * (s.net_sales - s.prev_month_sales)
        / NULLIF(s.prev_month_sales, 0),
        1
    ) AS mom_growth_pct,
    ROUND(s.ytd_sales, 2) AS ytd_sales,
    ROUND(s.category_share_in_region_pct, 1) AS category_share_in_region_pct,
    s.region_rank_in_month,
    i.qty_on_hand,
    ROUND(i.inventory_value, 2) AS inventory_value,
    i.inventory_snapshot_date
FROM sales_with_olap s
LEFT JOIN latest_inventory i
    ON i.region = s.region
   AND i.category = s.category
WHERE s.month IN (10, 11, 12)   -- slice: Q4
ORDER BY
    s.region,
    s.month,
    s.net_sales DESC; 



OLAP mõiste Päringus
Slice WHERE d.year = 2025 ja month IN (10,11,12)
Dice regioon + kategooria + kuu
Drill-down regioon → kategooria
Liidetav mõõdik net_sales, units_sold
Poolliidetav inventory_value ainult viimasest hetkest
Ajaline võrdlus LAG() (month-over-month)
Kumulatiiv SUM() OVER (YTD)
Osakaal category_share_in_region_pct
Ranking RANK() regioonide seas




Meeldetuletuseks

Tavaliselt alguses OLTP ja siis liigutakse edasi sümbioosile neist mõlemast. OLTP igapäevaste tehingute töötlemine, andmed asjakohased ja täpsed. OLAP koondavad ja analüüsivad neid andmeid. OLTP OLAPile liikumine toimub, siis kui tunned, et andmehulk on muutunud suureks (ei, see ei ole paarkümmendtuhat rida), ja reaalselt tegeled ka oma andmete analüüsimisega. Või OTLP päringud võtavad liialt aega, mis selle põhjuseks on? Artikli näide mõlema põhimõtte sümbioosist: e-kaubandusettevõte kasutab OLTP-süsteemi laoseisu ja tellimustega seotud tehingute reaalajas jälgimiseks ning OLAP-süsteemi ostutrendide, klientide eelistuste ja hooajalise nõudluse analüüsimiseks. 




Allikas: https://www.datacamp.com/blog/oltp-vs-olap