PostgreSQL návrh a implementace náročných databázových aplikací



Podobné dokumenty
INDEXY JSOU GRUNT. Pavel Stěhule

TimescaleDB. Pavel Stěhule 2018

Administrace, Monitoring. Pavel Stěhule P2D2, Praha 2016

Paralelní dotazy v PostgreSQL 9.6 (a 10.0)

Čteme EXPLAIN. CSPUG, Praha. Tomáš Vondra Czech and Slovak PostgreSQL Users Group

FRED & PostgreSQL. CZ.NIC, z.s.p.o. Jaromír Talíř <jaromir.talir@nic.cz>

Optimalizace dotazů a databázové transakce v Oracle

PostgreSQL. Podpora dědičnosti Rozšiřitelnost vlastní datové typy. Univerzální nasazení ve vědecké sféře

Použití databází na Webu

Optimalizace plnění a aktualizace velkých tabulek. Milan Rafaj, IBM

O Apache Derby detailněji. Hynek Mlnařík

CSPUG 2011-květen. GridSQL a pg-pool II. Vratislav Beneš benes@optisolutions.cz

8. Zpracování dotazu. J. Zendulka: Databázové systémy 8 Zpracování dotazu 1

SQL injection princip a ochrana

J. Zendulka: Databázové systémy 8 Zpracování dotazu Podstata optimalizace zpracování dotazu

Výkonnostní archeologie

Fyzické uložení dat a indexy

Použití PostgreSQL v. P2D Martin Swiech

Databáze II. 1. přednáška. Helena Palovská

Návrh a prototypová implementace databáze pro

RNDr. Michal Kopecký, Ph.D. Department of Software Engineering, Faculty of Mathematics and Physics, Charles University in Prague

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Healtcheck. databáze ORCL běžící na serveru db.tomas-solar.com pro

Novinky v Microsoft SQL Serveru RNDr. David Gešvindr MVP: Data Platform MCSE: Data Platform MCSD: Windows Store MCT

PG 9.5 novinky ve vývoji aplikací

Novinky v PostgreSQL 9.4. Tomáš Vondra, 2ndQuadrant

Monitoring SQL Server, Resource Governor, Tracing SQL Server

Úvod do databází. Modelování v řízení. Ing. Petr Kalčev

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

8.2 Používání a tvorba databází

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

Marketingová komunikace. 2. a 3. soustředění. Mgr. Pavel Vávra 9103@mail.vsfs.cz. Kombinované studium Skupina N9KMK3PH (vm3aph)

Databáze I. 5. přednáška. Helena Palovská

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Operátory ROLLUP a CUBE

01. Kdy se začala formovat koncept relačních databází (Vznik relačního modelu, první definice SQL)? a) 1950 b) 1960 c) 1970 d) 1980

PostgreSQL jako platforma pro datové sklady

Monitoring výkonu PostgreSQL

Databázové systémy. Cvičení 6: SQL

SSD vs. HDD / WAL, indexy a fsync

Jak ušetřit místo a zároveň mít data snadno dostupná. David Turoň

Architektura DBMS. RNDr. Ondřej Zýka

Základy databází. O autorech 17 PRVNÍ ČÁST. KAPITOLA 1 Začínáme 19

Databázové systémy úvod

Základy informatiky. 06 Databázové systémy. Kačmařík/Szturcová/Děrgel/Rapant

Databázové systémy a SQL

Stěhování aplikací. Michal Tomek, Sales Manager

Marketingová komunikace. 3. soustředění. Mgr. Pavel Vávra Kombinované studium Skupina N9KMK3PH (vm3bph)

Tabulka fotbalové ligy

2. přednáška. Databázový přístup k datům (SŘBD) Možnost počítání v dekadické aritmetice - potřeba přesných výpočtů, např.

Nerelační databázové modely. Helena Palovská

Analýza výkonu HELIOS Green

SQL - trigger, Databázové modelování

Databázové systémy. Doc.Ing.Miloš Koch,CSc.

Jazyk SQL databáze SQLite. připravil ing. petr polách

Databázové a informační systémy

Microsoft Access tvorba databáze jednoduše

Základy informatiky. 08 Databázové systémy. Daniela Szturcová

Enterprise funkce SQL Serveru 2016, které jsou od SP1 zdarma

Obsah. Kapitola 1. Kapitola 2. Kapitola 3. Kapitola 4. Úvod 11. Stručný úvod do relačních databází 13. Platforma 10g 23

Transakce a zamykání. Administrace MS SQL Serveru (NDBI039) Pavel Hryzlík

KIV/ZIS cvičení 5. Tomáš Potužák

IDS optimalizátor. Ing. Jan Musil, IBM ČR Community of Practice for

Implementace dávkových operací

Relační DB struktury sloužící k optimalizaci dotazů - indexy, clustery, indexem organizované tabulky

Optimalizace. Ing. Marek Sušický, RNDr. Ondřej Zýka

Marketingová komunikace. 2. soustředění. Mgr. Pavel Vávra Kombinované studium Skupina N9KMK1aPH/N9KMK1bPH (um1a1ph/um1b1ph)

SQL SQL-SELECT. Informační a znalostní systémy. Informační a znalostní systémy SQL- SELECT

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

UAI/612 - Cloudová Řešení. Technologie

Vladimír

Materializované pohledy

Migrace CIDUG. Ing. Pavel Krutina

Netezza. Martin Pavlík. 2. Února to pravé řešení pro analytický datový sklad

Stručný obsah. K2118.indd :15:27

Maturitní témata z předmětu PROGRAMOVÉ VYBAVENÍ pro šk. rok 2012/2013

XMW4 / IW4 Pokročilé SELECT dotazy. Štefan Pataky

Verzování a publikace dat na webu za pomoci PostgreSQL

Transakce a zamykání Jiří Tomeš

DUM 12 téma: Příkazy pro tvorbu databáze

PRŮBĚHOVÝ TEST Z PŘEDNÁŠEK

KAPITOLA 1 Představení platformy Microsoft SQL Server 2008

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

Databáze s tisíci uložených procedur. Pavel Bláhovec, DiS pavel@blahovec.cz

Programování v jazyku C# II. 5.kapitola

První pomoc pro DBA. administrátory CIDUG. Milan Rafaj IBM Česká republika

Databáze Bc. Veronika Tomsová

Servery Incad, stav k

Databázové systémy I. 1. přednáška

Transakce. Ing. Marek Sušický, RNDr. Ondřej Zýka

37. Indexování a optimalizace dotazů v relačních databázích, datové struktury, jejich výhody a nevýhody

Obsah. Kapitola 1. Kapitola 2. Kapitola 3. Úvod 9

Programování a implementace Microsoft SQL Server 2014 databází

Maturitní témata Školní rok: 2015/2016

B0M33BDT Stream processing. Milan Kratochvíl

FIREBIRD relační databázový systém. Tomáš Svoboda

Optimalizace SQL dotazů

Architektura DBMS. MI-DSP 2013/14 RNDr. Ondřej Zýka,

Disková pole (RAID) 1

Transkript:

PostgreSQL návrh a implementace náročných databázových aplikací Pavel Stěhule 2013 Výkon libovolné aplikace spravující větší množství dat je determinován primárně návrhem aplikace a strukturou spravovaných dat. Obé musí být ve souladu s vybranou databázovou technologií.

Pavel Stěhule Major contributor PostgreSQL Zakládající člen CSPUGu DBA v GoodData PostgreSQL + BI + cloud Popularizace SQL a PostgreSQL v ČR Konzultace a školení PostgreSQL a SQL Výkonnostní audit nasazení PostgreSQL Poradenství při problémech s výkonem PostgreSQL

Základní faktory ovlivňující výkon databáze HW (CPU, RAM, IO, NET) Architektura databáze (OLTP, OLAP) Architektura aplikace (OLTP, OLAP) Funkční požadavky (ACID, CAP,...) Design databáze (existence indexů, použití EAV,..) Aktuální stav databáze (stav indexů, uspořádání tabulek) Schopnost optimalizátoru generovat optimální prováděcí plány Design UI aplikace (skrolování, vyhledávání) Použití cache (aplikační, mater. pohledy, memcache) Konfgurace databáze Konfgurace OS (konfgurace virtualizace)

Aplikační vrstvy Queries, transactions - aplication Drivers, connections, caching - middleware Schema, config - Database Filesystem, kernel operation system Storage, RAM/CPU, NETWORK hardware

Rady U většiny problémů s výkonem, které se svalují na databáze se ukáže, že se nejedná o problém databáze. Méně než 10% dotazů způsobuje 90% zátěže databáze. V libovolném čase je možné správně identifkovat a odstranit pouze jeden výkonnostní problém, jedno úzké hrdlo, jeden nejpomalejší SQL příkaz.

Etapy zpracování dotazu Příprava prováděcího plánu parsování plánování na tvrdo specifkuje metodu JOINů (hashjoin, merge join, nested loop), pořadí Exekuce prováděcího plánu většina parametrů a metod je zafxována předem (na základě odhadů) při plánování quick sort /external sort dynamicky Mezi optimalizací a exekucí může být výrazná časová prodleva během které může dojít ke změně obsahu tabulek

CPU OLTP max connection ~ 10 * CPU OLAP max connection ~ 1 * CPU PostgreSQL je primárně OLTP databáze bez dalšího sw používá pouze jedno CPU jádro pro zpracování SQL příkazů (předpoklad hrdlem je IO) komerční fork Greenplum vestavěné MPP PL/Proxy podpora shardingu/horizontal partit. GridSQL (dnes Stado) massively parallel processing (MPP) architecture aplikace používající db backend PostgreSQL Plánování složitých dotazů použití GEQE zpracování velkého množství jednoduchých příkazů (ORM) Pozor na partitioning partition ~ tabulka

RAM Zpracování paměťově náročných úloh sort, hash join (work_mem) ~ 10MB create index (maintenance_work_mem) ~ 200MB external sort, merge join ~ 10x pomalejší Cache cache datových stránek (shadow_bufers) ~ 2.. 20GB cache celkem hint (efective_cache_size) ~ 2/3RAM Použití jako pracovní paměti při optimalizaci dotazu (zřetelné pouze při masivním použití partitioningu (používat max. 100 partitions)) Databázový server nesmí aktivně používat SWAP Výchozí konfigurace v PostigreSQL je zbytečně skromná. Pozor na windows!

I/O Rychlost čtení/zápisu RAID, SSD cena/iops nebo cena/kapacita rychlost zápisu/čtení sekvenční čtení/náhodný přístup random_page_cost a seq_page_cost Čtení a zápis dat stránek (bgwriter, checkpoint) fsync transakčního logu při commitu Zápis do transakčního logu (commit) synchronous_commit Čtení a zápis dočasných souborů (external sort) Zálohování throtling např. zapnutím komprimace kontinuální zálohování, zálohování slavea Logování

NETWORK Navazování spojení (ještě výrazně pomalejší je navazování SSL) šetrnější poolování spojení (keep-alive) Přenos SQL příkazů minimalizují uložené procedury pozor na ORM pro klasickou SQL db jsou výhodnější hromadné operace Přenos dat latence TCP/IP, latence klienta spočítaný záznam se okamžitě posílá na klienta (libpq ukládá result na klientské straně) řešením problémů se zahlcením klienta může být použití explicitního kurzoru (příkaz FETCH) případně opět uložené procedury (v pg inprocess) pokud možno vše spočítat na serveru klient dostává pouze výsledek Synchronizace klient/server

Testování hardware výkon, spolehlivost IO Bonnie++, Hdparm čtení/zápis, random IO MEM Cachebench, Memtest86 čtení/zápis NET Netperf, ping, Ttcp Aplikační TPC-B (OLTP) pgbench

Počáteční konfigurace PostgreSQL work_mem 10..100MB maintenance_work_mem 100..500MB shadow_buffers 2..20GB max_connection 10 * CPU effective_cache_size random_page_cost ~ dostatek RAM SB + WorkMem * 2 * MaxCn + FileSys + OSys RAM

Identifikace hrdel IO/CPU ~ top, iotop Analýza logu pomalých dotazů Nízká hodnota work_mem Nepoužívá se quck sort, používá se external sort Nepoužívá se hashjoin, hashagg, použije se external sort Nízká hodnota shared_bufers Data se neudrží dostatečně dlouho v cache - pg_bufercache Zámky Chybějící indexy Nevhodně napsané nebo chybné dotazy log_lock_waits

Cache Cílem je neopakovat 2x tentýž výpočet Nasazení cache v závislosti na počtu uživatelů vnitropodniková aplikace možná zbytečné silně navštěvovaná www aplikace nutnost Cache průběžně udržovaná (náročnější) periodicky udržovaná (jednoduchá na implementaci) PostgreSQL nerado častý update jednoho a téhož záznamu (řešením je cache a do Pg se ukládají fnální data) z důvodu implemetace MVCC. Některá data jsou z povahy netransakční a proto nemají, co dělat v databázi. ACID představuje zbytečnou režii. Řešením je použití např. Memcached případně UNLOGGED tables v Postgresu (úspora zápisu do logu, stále režie MVCC) pokud není zbytí.

Materializované pohledy Představují cache na databázové úrovni vestavěná podpora aplikační (vlastní implementace) průběžně udržované / periodicky udržované Při agregacích velkých dat PostigreSQL nevyužívá umělou inteliigenci a pokaždé opakuje stejný výpočet. Jednoduchá optimalizace materializace výsledku nad archivními daty plus opakované přičtení výsledku nad denním nebo týdenním přírůstku.

Indexy v PostgreSQL Uspořádáné dvojice klíč/adresa Filtrování, agregace, JOIN (mergejoin), řazení Nečte se balast Neprovádí se masivní external sort Používá se random IO, Odkazovaná data mohou být v nehodném pořadí Přeuspořádání haldy příkaz CLUSTER Jednoduché, složené, podmíněné (částečné), funkcionální, vzestupně, sestupně řazené B-Tree, GiST, GIN, pg_trgm agregace re, LIKE,.. Údržba indexu není zadarmo (+ REINDEX) maintenance_work_mem

Vyhledávání index (planner) friendly predikáty substring(d, 1, 4)::int = 2014 and substring(d, 6, 2)::int = 12 d::text LIKE '2014-12-%' EXTRACT (year FROM d) = 2014 and EXTRACT(month FROM d) = 12 d BETWEEN '2014-12-01'::date AND '2014-12-31'::date t >= '2014-12-01'::timestamp AND t < '2015-01-01'::timestamp Vždy používat čisté predikáty tj sloupec = konstanta V pg lze použít funkcionální indexy fce(sloupec) = konstanta Chybí statistiky ~ použije se konstantní odhad 0.5%

Stránkování index friendly Relace není pole, nelze jednoduše získat Ntý řádek Záznamy v heapu jsou nejsou uspořádané (pořadí se neustále mění) Nepoužívat samotný OFFSET n+1 LIMIT m WHERE pk > last_pk LIMIT m Stále vyžaduje dotaz na počet záznamu ve výběru Limitovaný count ~ přesný do 10K řádků/více než 10K Fake count Kontinuální zobrazení (facebook, linkedin,..) Ušetří 1x COUNT Generuje index friendly dotazy Odpadá mapování číslo stránky => pk

Životní cyklus databázové aplikace Vývoj [ + migrace (čištění) stávajících dat ] Testovací data/testovací provoz Testovací databázi dimenzovaná jakoby po 5-7 let provozu Startup (první 3 21 dní provozu) Kritické pro úspěch aplikace (i dodavatele) Důležitá dostatečná rezerva, diagnostika a monitoring Provoz Průběžná údržba VACUUM, REINDEX Archivace dat Opakované doladění vycházející ze skutečné zátěže Možné fnální doladění 80/20 díky skutečným datům a skutečné zátěži Změny v zátěži, změny v databázi nárůst velikosti dat

Použití polí pro časové řady Každá verze záznamu v PostgreSQL obsahuje 27 bajtů v neviditelných (příp. nedostupných sloupcích: xmin, xmax, cmax, ctid,..) Dlouhé úzké tabulky (typické pro časové řady v rel. db) jsou neekonomické (27/12) Někdy nutné vazební tabulky m:n zde se nedoporučuje použití polí z důvodu optimalizace planneru. Řešením je zabalení hodnot do bloků (60, 1440, 3600,..) s použitím polí. Zanedbatelná režie Transparentní komprimace

E-A-V tables? hstore Struktura uložení dat v relační databázi Normalizovaná data Denormalizovaná data široké tabulky Entity - Class ~ Relation mapping Komplikovaný přístup k entitám Větší množství JOINů dematerializace (náročnější údržba dat, duplicitní data) Strukturovaná data XML, JSON, hstore Entity - Atribute - Value (Open Schema) Nepoužívat pro větší data a často využívané atributy

hstore Polymorfní, stále kompaktní Podpora GiST, GIN indexů Podpora statistik Extenze z contrib balíku 'a=>1,b=>foo'::hstore -> 'a' 'a=>1,b=>foo'::hstore -> ARRAY['a','b'] 'a=>1, b=>foo'::hstore? 'a' 'a=>1, b=>foo'::hstore @> 'a=1' %# 'a=>1, b=>foo'::hstore = {{a,1},{b,foo}} hstore_to_json('a=>1, b=>foo') CREATE INDEX ON table USING GIST (h)

Zamykání MVCC UPDATE neblokuje SELECT UPDATE blokuje UPDATE Skryté zamykání implementace referenční integrity pomocí triggerů SELECT * FROM ft WHERE key=x FOR SHARE SELECT * FROM ft WHERE key=x FOR KEY SHARE (9.3+) log_lock_waits

Čtení prováděcích plánů EXPLAIN EXPLAIN (ANALYZE, TIMING OFF) postgres=# EXPLAIN ANALYZE SELECT * FROM foo WHERE a BETWEEN 10 AND 10 LIMIT 10; QUERY PLAN ------------------------------------------------------------------------ Limit (cost=0.00..9.70 rows=10 width=8) (actual time=0.024..0.150 rows=10 loops=1) -> Seq Scan on foo (cost=0.00..194248.00 rows=200333 width=8) (actual time=0.023..0.146 rows=10 loops=1) Filter: ((a >= 10) AND (a <= 10)) Total runtime: 0.173 ms (4 rows)

Možné problémy s předpřipravenými dotazy Prepared statements (server side) Ochrana před SQL injection Čitelnější zápis SQL parametrického SQL příkazu Znovupoužití prováděcího plánu Starší CPU Intenzivně opakované příkazy INSERT Opakované komplexní dotazy (velký počet JOINů) Uložené v paměti session Optimalizované bez znalosti parametrů (slepá optimalizace) Optimalizace na nejčastěji se vyskytující hodnotu Optimalizace na první použitou hodnotu použito v 9.3 (5 pokusů pro rozhodnutí o volbě optimalizace)

SQL injection!

Fast upload - COPY Etapy SQL příkazu PREPARE, { BIND vector (row), EXEC }, COMMIT Pozor na autocommit! synchronous_commit off asynchronní fsync Etapy příkazu COPY PARSE, EXEC stream, COMMIT COPY tablename FROM stdin CSV

Cost based optimizer Minimalizuje IO operace Základem je odhad účinnosti fltrů a převod na cenu Volba metody přístupu k datům Seqscan, indexscan, seqscan + qsort, Voba metody agregace Ordered, hashagg Volba metody slučování Nestedloop, mergejoin, hashjoin,..

Chyby v odhadech Chybějící statistiky Chybí podpora pro použitý datový typ Odtržení od statistik Použití výrazu v predikátu Filtrování výsledku další operace s daty Zastaralé statistiky Nedostatečné statistiky ~ hrubý histogram Korelace v datech Výsledkem chyby může být nižší nebo vyšší odhad, u složitějších dotazů se chyby mohou násobit (ale také neutralizovat)

Řešení chyb v odhadu Zvýšení přesnosti histogramu default_statistic_target Vylepšuje odhady, zpomaluje plánování Zavření očí Pokud je suboptimální plán dostatečně rychlý Rozbití dotazu + dočasné tabulky + ANALYZE Použití CTE V PostgreSQL implementováno jako optimizer fence Použíjí se fxní 0.5% odhady

Neoptimalizovatelné konstrukce Záměrně neoptimalizované CTE Nepodporované optimalizace push group by Minimální rozdíly v semantice umožňují výraznou optimalizace NOT IN / NOT EXISTS Pozor na pohledy JOIN removal odstraní pouze nadbytečné slučované relace UNION, korelované poddotazy zůstávají Optimalizátor se s každou verzí mění

Co monitorovat? Pomalé dotazy (50, 200, 5000ms) analyzátory logu pgbadger, pgfouine log_min_duration_statement CPU load, IO waits (munin, top) IO utilization (munin, iotop) Bufer hit Transaction per sec Jednorázově četnost všech typů dotazů Počet otevřených spojení Pozor na aplikace neuzavírající spojení (connection leaks) Pozor na <IDLE> in transaction (v PostgreSQL) Dostatek místa na disku!

Co monitorovat? SELECT last_vacuum, last_autovacuum, last_analyze, last_autoanalyze FROM pg_stat_user_tables; SELECT blks_read, blks_hit, xact_commit, xact_rollback, deadlocks, temp_bytes FROM pg_stat_database; SELECT * FROM pg_stat_activity; SELECT * FROM pg_prepared_xacts;

Co monitorovat? Stav indexů a tabulek extenze pg_stat_tuple ~ je pracné najít hledanou informaci (příliš úrovní, příliš prvků v seznamu) Bobtnání tabulek a indexů nízká hustota dat ~ čte se balast viz htp://wiki.postgresql.org/wiki/show_database_bloat

Použití specializovaných problémově orientovaných db PostgreSQL / MySQL / Firebird / SQLite OLAP / OLTP ACID / CAP nosql / SQL Relační / Grafové (síťové) / key-value Relační / Stream / Array Row oriented (OLTP) / Column oriented (OLTP) Klasické / Memory / Only memory Relační / Map-Reduce

Architektura - doporučení Při návrhu myslet na možnost shardingu horizontálního partitioningu PL/Proxy nebo vlastní řešení Při návrhu myslet na obnovu a migraci Oddělit kritické a nekritické části databáze logy, archivní data kritická data pro kritické části aplikace Při návrhu myslet na cache do PG neukládat krátkodobá data, ale i zbytečně nepřistupovat do databáze. Při návrhu myslet na limitované IO nekritické pomalé dotazy počítat mimo pracovní dobu nebo na dedikovaných serverech. Snažit se o index friendly dotazy.

Doporučení Nepoužívejte ORM u datově náročných aplikací! Ladění ORM může zabrat výrazně víc času než ušetří Ladění ORM je větší magie než ladění databáze Napsat rychlou aplikaci není zas až tak obtížné, pokud znáte základy a základní charakteristiky databází Je zásadní znát parametry aplikace, parametry databáze, u existujících aplikací znát úzká hrdla Výkon testujte průběžně! Neodkládejte testování na dokončení produktu.

Dotazy? uvidíme se na P2D2 únor 2014

konfigurace terminálu export PAGER=less export LESS="-iMSx4 -FX"