ЁЯПЫя╕П рдзрдбрд╛ 18 тАФ OLTP рд╡рд┐рд░реБрджреНрдз OLAP: office рдЖрдгрд┐ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдп
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 18 рдкреИрдХреА рдзрдбрд╛ 18 тАФ рд╢реЗрд╡рдЯрдЪрд╛ рдзрдбрд╛! ┬╖ рдорд╛рдЧреАрд▓: lesson-17-app-code
рднрд╛рдЧ 3 тАФ рдЕрдзрд┐рдХ рдЦреЛрд▓рд╛рдд. рдзрдбреЗ 01тАУ12 рдиреА рд░реЗрдХреЙрд░реНрдб рд░реВрдо рдмрд╛рдВрдзрд▓реА рдЖрдгрд┐ рдЪрд╛рд▓рд╡рд▓реА. рдзрдбреЗ 13тАУ18 рд╣реЗ interviews рдЖрдгрд┐ incidents рдордзреНрдпреЗ рд╡рд┐рдЪрд╛рд░рд▓реЗ рдЬрд╛рдгрд╛рд░реЗ рд╡рд┐рд╖рдп рдЖрд╣реЗрдд тАФ рдкреНрд░рддреНрдпреЗрдХ рддреНрдпрд╛рдЪ
school.dbрд╡рд░ рдкреНрд░рддреНрдпрдХреНрд╖ рдЪрд╛рд▓рддреЛ.
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕, рдЖрдгрд┐ db/demo.py рдордзрд▓реЗ olap(): рд╣рдЬреЗрд░реАрдЪрд╛ рдорд╛рд╕рд┐рдХ
report, рдЪрд╛рд▓реВ 200,000-рдУрд│реАрдВрдЪреНрдпрд╛ table рд╡рд░ рдЖрдгрд┐ "nightly ETL" рдиреЗ рдмрдирд╡рд▓реЗрд▓реНрдпрд╛ summary table рд╡рд░ рдЪрд╛рд▓рд╡рд▓реЗрд▓рд╛,
рдЖрдгрд┐ grade_changes рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реНрд░реЗрдгреА-рдмрджрд▓ рдиреЛрдВрджрд╡рдгрд╛рд░рд╛ рдПрдХ trigger (change data capture).
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрдЪреЗ office рджрд┐рд╡рд╕рднрд░ рдЫреЛрдЯреНрдпрд╛ рдХрд╛рдорд╛рдВрдд рд╡реНрдпрд╕реНрдд рдЕрд╕рддреЗ: рдХрддрд░рд┐рдирд╛рдЪреА рд╣рдЬреЗрд░реА рд▓рд╛рд╡рд╛, рд░реЛрд╣рдирдЪреА рд╢реНрд░реЗрдгреА рджреБрд░реБрд╕реНрдд рдХрд░рд╛, рджрд┐рдпрд╛рдЪреЗ рдирд╛рд╡ рдиреЛрдВрджрд╡рд╛. рд╣реЗрдЪ OLTP тАФ online transaction processing.
рд╡рд░реНрд╖рд╛рддреВрди рдПрдХрджрд╛ рдореБрдЦреНрдпрд╛рдзреНрдпрд╛рдкрд┐рдХрд╛ рдПрдХ рдкреНрд░рдЪрдВрдб рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддрд╛рдд: "рд╢рд╛рд│рд╛ рд╕реБрд░реВ рдЭрд╛рд▓реНрдпрд╛рдкрд╛рд╕реВрди рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрд╖рд╛рдЪреА, рдорд╣рд┐рдиреНрдпрд╛рдиреБрд╕рд╛рд░ рд╣рдЬреЗрд░реА". рд╣реЗ office рд▓рд╛ рд╡рд┐рдЪрд╛рд░рд▓реЗ, рддрд░ рдХрд╛рд░рдХреВрди рд╢реЛрдзрдд рдЕрд╕рддрд╛рдирд╛ рд╕рдЧрд│реНрдпрд╛рдВрдЪреЗ рдХрд╛рдо рдерд╛рдВрдмрддреЗ. рдореНрд╣рдгреВрди рд╢рд╛рд│рд╛ рд╢реЗрдЬрд╛рд░реА рдПрдХ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдп ЁЯПЫя╕П рдареЗрд╡рддреЗ, рдкреНрд░рдЪрдВрдб рдкреНрд░рд╢реНрдирд╛рдВрд╕рд╛рдареА рдмрд╛рдВрдзрд▓реЗрд▓реЗ, рджрд░ рд░рд╛рддреНрд░реА office рдЪреНрдпрд╛ рдиреЛрдВрджреАрдВрддреВрди рднрд░рд▓реЗрд▓реЗ. рд╣реЗрдЪ OLAP тАФ online analytical processing, рд╕рд╣рд╕рд╛ рдПрдХ data warehouse.
рджрд░ рд░рд╛рддреНрд░реА рд╕рдЧрд│реЗ copy рди рдХрд░рддрд╛ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдп рддрд╛рдЬреЗ рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА office рдПрдХ рдмрджрд▓рд╛рдВрдЪреА рдбрд╛рдпрд░реА рдареЗрд╡рддреЗ: рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рд╢реНрд░реЗрдгреА рдмрджрд▓рд▓реА рдХреА рдПрдХ рдУрд│ рд▓рд┐рд╣рд┐рд▓реА рдЬрд╛рддреЗ. рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдп рддреА рдбрд╛рдпрд░реА рд╡рд╛рдЪрддреЗ. рд╣реЗрдЪ change data capture (CDC).
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
oltp["ЁЯЧДя╕П live room (OLTP)<br/>many tiny reads/writes ┬╖ row store"]
olap["ЁЯПЫя╕П warehouse (OLAP)<br/>few huge reads ┬╖ columnar"]
oltp -->|"ЁЯМЩ nightly ETL"| olap
oltp -. "CDC: every change (trigger / WAL)" .-> olap
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/database/lesson-diagrams.html#l18
тЭУ рдХрд╛рдп
- OLTP тАФ Postgres, MySQL, SQLite: rows рдПрдХрддреНрд░ рд╕рд╛рдард╡рд▓реЗрд▓реНрдпрд╛, point lookups рд╕рд╛рдареА indexes, рдЕрдиреЗрдХ рдЫреЛрдЯреЗ transactions.
- OLAP тАФ BigQuery, Redshift, Snowflake, ClickHouse, DuckDB: columnar storage (рдПрдХрд╛ column рдЪреНрдпрд╛ values рдПрдХрддреНрд░, compressed рд╕рд╛рдард╡рд▓реЗрд▓реНрдпрд╛), рдЕрдмреНрдЬрд╛рд╡рдзреА rows scan рдЖрдгрд┐ aggregate рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдмрд╛рдВрдзрд▓реЗрд▓реЗ.
- ETL / ELT тАФ рдЪрд╛рд▓реВ рдЦреЛрд▓реАрддреВрди extract, transform, warehouse рдордзреНрдпреЗ load, рдард░рд▓реЗрд▓реНрдпрд╛
рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдиреБрд╕рд╛рд░. Summary tables (рдЬрд╕реЗ
attendance_by_month) рд╣реЗ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкреЗ рд░реВрдк. - CDC тАФ рдкреНрд░рддреНрдпреЗрдХ рдмрджрд▓ рдШрдбрддрд╛рдЪ рдкрдХрдбрдгреЗ: change table рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рдгрд╛рд░рд╛ trigger (рд╣рд╛ demo), рдХрд┐рдВрд╡рд╛ Debezium рдХрд┐рдВрд╡рд╛ AWS DMS рд╕рд╛рд░рдЦреНрдпрд╛ tools рдиреЗ WAL (рдзрдбрд╛ 15) рд╡рд╛рдЪрдгреЗ.
- Star schema тАФ warehouse рдЪрд╛ рдЖрдХрд╛рд░: рдПрдХ рдореЛрдард╛ fact table (рд╣рдЬреЗрд░реАрдЪреНрдпрд╛ рдУрд│реА), рдЬреНрдпрд╛рднреЛрд╡рддреА dimension tables (рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреА, рд╡рд░реНрдЧ, рддрд╛рд░реАрдЦ).
ЁЯдФ рдХрд╛
рдЪрд╛рд▓реВ рдЦреЛрд▓реАрд╡рд░рдЪреЗ рдЬрдб reports рдмрд╛рдХреА рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рд╣рд│реВ рдХрд░рддрд╛рдд, рдЖрдгрд┐ dashboards рдирд╛ рд╕рддрдд refresh рд╡реНрд╣рд╛рдпрд▓рд╛ рдЖрд╡рдбрддреЗ. рддреНрдпрд╛рдВрдирд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареАрдЪ рдмрд╛рдВрдзрд▓реЗрд▓реНрдпрд╛ store рдордзреНрдпреЗ рд╣рд▓рд╡рд▓реНрдпрд╛рдиреЗ office рдЬрд▓рдж рдЖрдгрд┐ reports рд╕реНрд╡рд╕реНрдд рд░рд╛рд╣рддрд╛рдд.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
db/demo.py рдордзрд▓реЗ olap() report рджреЛрдиреНрд╣реА рдкреНрд░рдХрд╛рд░реЗ рдЪрд╛рд▓рд╡реВрди рд╡реЗрд│ рдореЛрдЬрддреЗ, рдЙрддреНрддрд░реЗ
рдЬреБрд│рддрд╛рдд рдХрд╛ рддрдкрд╛рд╕рддреЗ, рдордЧ cdc_grades trigger рдмрдирд╡рддреЗ рдЖрдгрд┐ рд░реЛрд╣рдирдЪреА maths рдЪреА рд╢реНрд░реЗрдгреА рдмрджрд▓рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 db/demo.py olap
python3 - <<'EOF'
import sqlite3
c = sqlite3.connect("db/school.db")
c.execute("UPDATE grades SET grade = 'A+' WHERE student_id = 2 AND subject = 'science'") # same value: A+ тЖТ A+
c.execute("UPDATE grades SET grade = 'B+' WHERE student_id = 1 AND subject = 'maths'"); c.commit()
print(c.execute("SELECT grade_id, old, new FROM grade_changes").fetchall())
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
report on the live 200,000-line table: ~29 ms ┬╖ on the nightly summary (12 rows): ~0.08 ms
(рддреБрдордЪреЗ рдЖрдХрдбреЗ рд╡реЗрдЧрд│реЗ рдЕрд╕рддреАрд▓), same answer: True, рдЖрдгрд┐ рдмрджрд▓рд╛рдВрдЪреНрдпрд╛ рдбрд╛рдпрд░реАрдд (9, 'B', 'A'). Snippet
рдордзреНрдпреЗ trigger рджреЛрдиреНрд╣реА updates рдиреЛрдВрджрд╡рддреЛ тАФ рддреЛ рдкреНрд░рддреНрдпреЗрдХ UPDATE OF grade рд╡рд░ рдЪрд╛рд▓рддреЛ, рддреАрдЪ value
рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд┐рдгрд╛рд▒реНрдпрд╛ update рд╡рд░рд╣реА.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдХреЛрдгрддреЗ рдкреНрд░рд╢реНрди office рдордзреНрдпреЗ рдЖрдгрд┐ рдХреЛрдгрддреЗ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдпрд╛рдд рд╣рд╡реЗрдд рд╣реЗ рддреБрдореНрд╣реА рд╕рд╛рдВрдЧреВ рд╢рдХрддрд╛, рдЖрдгрд┐ summary table рдЖрдгрд┐ рдмрджрд▓рд╛рдВрдЪреА рдбрд╛рдпрд░реА рд╡рд╛рдкрд░реВрди report рдЪрд╛рд▓реВ рдЦреЛрд▓реАрддреВрди рдмрд╛рд╣реЗрд░ рд╣рд▓рд╡реВ рд╢рдХрддрд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- production database рд╡рд░ рджрд░ рд╕реЗрдХрдВрджрд╛рд▓рд╛ refresh рд╣реЛрдгрд╛рд░реЗ dashboards
- warehouse рдордзрд▓реНрдпрд╛ rows рдмрджрд▓рдгреЗ тАФ рддреЛ source рдордзреВрди рдкреБрдиреНрд╣рд╛ рдмрд╛рдВрдзрд▓рд╛ рдЬрд╛рддреЛ, рдмрджрд▓рд▓рд╛ рдЬрд╛рдд рдирд╛рд╣реА
- рдХреЛрдгреАрдЪ monitor рди рдХрд░рдгрд╛рд░рд╛ nightly ETL (report рдЧреБрдкрдЪреВрдк рдорд╛рдЧрдЪреНрдпрд╛ рдЖрдард╡рдбреНрдпрд╛рдЪреЗрдЪ рджрд╛рдЦрд╡рддреЛ)
- рдХрд╛рд╣реА рд╣рдЬрд╛рд░ rows рд╕рд╛рдареА "рдЖрдкрд▓реНрдпрд╛рд▓рд╛ warehouse рд╣рд╡реЗ" тАФ рдПрдХ indexed query рдкреБрд░реЗрд╢реА рдЕрд╕реВ рд╢рдХрддреЗ
- CDC triggers рдкреНрд░рддреНрдпреЗрдХ write рд╡рд░ рдХрд╛рдо рд╡рд╛рдврд╡рддрд╛рдд рд╣реЗ рд╡рд┐рд╕рд░рдгреЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдмрд╣реБрддреЗрдХ companies product рд╕рд╛рдареА Postgres/MySQL рдЖрдгрд┐ analytics рд╕рд╛рдареА warehouse рдЪрд╛рд▓рд╡рддрд╛рдд, ETL рдХрд┐рдВрд╡рд╛ CDC pipelines рдиреЗ рдЬреЛрдбрд▓реЗрд▓реЗ тАФ data engineering рдЗрдереВрдирдЪ рд╕реБрд░реВ рд╣реЛрддреЗ.
ЁЯОУ рд░реЗрдХреЙрд░реНрдб рд░реВрдо рдЖрддрд╛ рдкреВрд░реНрдгрдкрдгреЗ рддреБрдордЪреА
рдЪрд┐рдХрдЯ рдЪрд┐рдареНрдареНрдпрд╛ тЖТ рдиреЛрдВрджрд╡рд╣реНрдпрд╛ рдЖрдгрд┐ keys тЖТ рдЕрднрд┐рд▓реЗрдЦрдкрд╛рд▓ тЖТ рдкреЗрдиреНрд╕рд┐рд▓рдордзрд▓реА рдиреЛрдВрджрд╡рд╣реА тЖТ рдПрдХ рддрдереНрдп, рдПрдХ рдЬрд╛рдЧрд╛ тЖТ рдХреЕрдЯрд▓реЙрдЧ тЖТ рджреЛрди рдХрд╛рд░рдХреВрди тЖТ рдиреВрддрдиреАрдХрд░рдг тЖТ рдЖрдЧреАрдкрд╛рд╕реВрди рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рдд тЖТ рдЕрдзрд┐рдХ рдЦреЛрд▓реНрдпрд╛ тЖТ on call тЖТ рдХреБрд▓реВрдкрдмрдВрдж рдиреЛрдВрджрд╡рд╣реА тЖТ rankings тЖТ рдбрд╛рдпрд░реА тЖТ рдЦреЛрд▓реАрдЪреНрдпрд╛ рдкреНрд░рддреА тЖТ рдЦреЛрдХрд╛ рдШреЗрдКрди рдЬрд╛рдгрд╛рд░реА рдорджрддрдиреАрд╕ тЖТ рд╢реЗрдЬрд╛рд░рдЪреЗ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдп. ЁЯЧДя╕ПЁЯОУ
git checkout main
python3 db/demo.py # every lesson, 01тАУ18, in one run