Hector "marcan" Martin z Asahi Linuxu skončil jako upstream vývojář linuxového jádra. Štafetu po něm převzal Janne Grunau z Asahi Linuxu.
PlayStation Network (PSN) má již několik hodin, vlastně celou sobotu, masivní výpadek (Stav služby PSN, X).
Vývojáři open source storage platformy TrueNAS oznámili, že s verzí 25.04 s kódovým názvem Fangtooth končí TrueNAS CORE postavený na FreeBSD a TrueNAS SCALE postavený na Linuxu. Jejich společným pokračováním bude TrueNAS Community Edition postavený na Linuxu.
Mapy Google dnes slaví 20 let. Spuštěny byly 8. února 2005. Svět se přesunul od papírových map k digitálním. A ke Street View, Live View, Immersive View, …
Hector "marcan" Martin, vedoucí projektu Asahi Linux aneb Linux na Apple Siliconu, skončil jako upstream vývojář linuxového jádra. Se slovy "už nemám žádnou důvěru v proces vývoje jádra … další vývoj Apple/ARM bude pokračovat downstream" odstranil své jméno ze souboru MAINTAINERS. Důvodem jsou neshody kolem Rustu v linuxovém jádru [Hacker News, No rust code in kernel/dma, please.].
Mistral AI včera představil nový vylepšený Le Chat. Nově také jako aplikace pro iOS a Android.
Britské bezpečnostní orgány nařídily americké firmě Apple, aby vytvořila takzvaná "zadní vrátka", která by umožnila dostat se k šifrovanému obsahu uživatelů uloženému v cloudu. Tajné nařízení, vydané v lednu, vyžaduje plošný přístup k šifrovanému účtu jakéhokoliv uživatele přístrojů Apple kdekoliv na světě. Britské úřady tedy Apple nežádají pouze o asistenci s přístupem k účtu konkrétního uživatele, ale rovnou chtějí mít přístup ke všem účtům, kdykoliv budou chtít.
Byla vydána (𝕏) lednová aktualizace aneb nová verze 1.97 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.97 vyšlo také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Nedávno se povedlo do pdf souborů vložit Tetris a DOOM a po otevření příslušného pdf souboru v na Chromiu založeném webovém prohlížeči vybranou hru přímo v pdf spustit. LinuxPDF ukazuje, že do pdf lze vložit také RISC-V emulátor a rozběhnout Linux.
/** 1 **/ select budovy.id, coalesce(casti_budov.cislo_domovni,budovy.cislo_domovni) cislo_domovni, t_budov.typ from budovy left join casti_budov on casti_budov.bud_id = budovy.id left join t_budov on t_budov.kod = coalesce(casti_budov.typbud_kod, budovy.typbud_kod) ------------------------------------------------
/** 2 **/ Select bud.id, bud.cislo_domovni, t_budov.typ from ( Select budovy.id, coalesce(casti_budov.cislo_domovni, budovy.cislo_domovni) cislo_domovni, coalesce(casti_budov.typbud_kod, budovy.typbud_kod) typbud_kod from budovy left join casti_budov on casti_budov.bud_id = budovy.id ) bud left join t_budov on bud.typbud_kod = t_budov.kod --------------------------------------------------------
/** 3 **/ Select budovy.id, coalesce(casti_budov.cislo_domovni, budovy.cislo_domovni) cislo domovni, coalesce(t_bud_ii.typ, t_budov.typ) typ_budovy from budovy left join casti_budov on casti_budov.bud_id = budovy.id left join t_budov on budovy.typbud_kod = t_budov.kod left join t_budov t_bud_ii on budovy.typbud_kod = t_bud_ii.kodale všechno je to zatraceně pomalý, už si nevím rady, jde to napsat nějak efektivnějc?? Mam vyjetý EXPLAIN ANALYZE, ale nějak mě neni jasný, co bych tam měl vidět..
Řešení dotazu:
"Nested Loop Left Join (cost=4039.55..12009.39 rows=1 width=261) (actual time=59041.378..59041.415 rows=1 loops=1)" " Join Filter: (bud.id = parcely.bud_id)" " -> Nested Loop Left Join (cost=0.00..19.49 rows=1 width=138) (actual time=4.920..4.954 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..11.19 rows=1 width=134) (actual time=4.915..4.948 rows=1 loops=1)" " Join Filter: (d_pozemku.kod = parcely.drupoz_kod)" " -> Nested Loop Left Join (cost=0.00..9.94 rows=1 width=129) (actual time=4.902..4.910 rows=1 loops=1)" " Join Filter: (zp_vyuziti_poz.kod = parcely.zpvypa_kod)" " -> Index Scan using par_pk on parcely (cost=0.00..8.31 rows=1 width=73) (actual time=4.838..4.845 rows=1 loops=1)" " Index Cond: (id = 2990212209::numeric)" " -> Seq Scan on zp_vyuziti_poz (cost=0.00..1.28 rows=28 width=70) (actual time=0.004..0.019 rows=28 loops=1)" " -> Seq Scan on d_pozemku (cost=0.00..1.11 rows=11 width=19) (actual time=0.002..0.019 rows=11 loops=1)" " -> Index Scan using tel_pk on telesa (cost=0.00..8.28 rows=1 width=15) (actual time=0.001..0.001 rows=0 loops=1)" " Index Cond: (parcely.tel_id = public.telesa.id)" " -> Hash Left Join (cost=4039.55..11027.73 rows=76968 width=134) (actual time=26464.128..58984.575 rows=77117 loops=1)" " Hash Cond: (COALESCE(cabu.typbud_kod, bud.typbud_kod) = t_budov.kod)" " -> Hash Left Join (cost=4038.41..10714.87 rows=76968 width=138) (actual time=26464.079..58856.645 rows=77117 loops=1)" " Hash Cond: (bud.id = cabu.bud_id)" " -> Hash Left Join (cost=4030.06..9742.04 rows=76968 width=128) (actual time=26463.614..58743.768 rows=76968 loops=1)" " Hash Cond: (bud.caobce_kod = casti_obci.kod)" " -> Hash Left Join (cost=4015.38..8848.03 rows=76968 width=33) (actual time=26462.677..58630.096 rows=76968 loops=1)" " Hash Cond: (bud.tel_id = public.telesa.id)" " -> Seq Scan on budovy bud (cost=0.00..1903.68 rows=76968 width=40) (actual time=0.018..85.580 rows=76968 loops=1)" " -> Hash (cost=2214.17..2214.17 rows=103617 width=15) (actual time=26262.120..26262.120 rows=103617 loops=1)" " -> Seq Scan on telesa (cost=0.00..2214.17 rows=103617 width=15) (actual time=0.017..98.825 rows=103617 loops=1)" " -> Hash (cost=12.20..12.20 rows=198 width=103) (actual time=0.885..0.885 rows=198 loops=1)" " -> Hash Left Join (cost=4.50..12.20 rows=198 width=103) (actual time=0.226..0.664 rows=198 loops=1)" " Hash Cond: (casti_obci.obce_kod = obce.kod)" " -> Seq Scan on casti_obci (cost=0.00..4.98 rows=198 width=58) (actual time=0.012..0.147 rows=198 loops=1)" " -> Hash (cost=3.11..3.11 rows=111 width=53) (actual time=0.196..0.196 rows=111 loops=1)" " -> Seq Scan on obce (cost=0.00..3.11 rows=111 width=53) (actual time=0.005..0.099 rows=111 loops=1)" " -> Hash (cost=5.38..5.38 rows=238 width=25) (actual time=0.433..0.433 rows=238 loops=1)" " -> Seq Scan on casti_budov cabu (cost=0.00..5.38 rows=238 width=25) (actual time=0.005..0.211 rows=238 loops=1)" " -> Hash (cost=1.06..1.06 rows=6 width=17) (actual time=0.022..0.022 rows=6 loops=1)" " -> Seq Scan on t_budov (cost=0.00..1.06 rows=6 width=17) (actual time=0.004..0.010 rows=6 loops=1)" "Total runtime: 59041.642 ms"
set work_mem to '10MB';případně jestli pomůže zablokovat hash_join
set enable_hashjoin to off;pro work_mem musí platit
work_mem * max_connection + shared_buffers + pamet pro zbytek systemu < RAM
set work_mem to '10MB'; set enable_hashjoin to off;Čímž jsem dosáhl zrychlení z necelé minuty na sekundu a malej kousek
"Nested Loop Left Join (cost=32884.48..34848.96 rows=1 width=291) (actual time=1364.306..1364.348 rows=1 loops=1)" " Join Filter: (budovy.id = parcely.bud_id)" " -> Nested Loop Left Join (cost=0.00..19.49 rows=1 width=138) (actual time=0.089..0.130 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..11.19 rows=1 width=134) (actual time=0.075..0.104 rows=1 loops=1)" " Join Filter: (d_pozemku.kod = parcely.drupoz_kod)" " -> Nested Loop Left Join (cost=0.00..9.94 rows=1 width=129) (actual time=0.068..0.072 rows=1 loops=1)" " Join Filter: (zp_vyuziti_poz.kod = parcely.zpvypa_kod)" " -> Index Scan using par_pk on parcely (cost=0.00..8.31 rows=1 width=73) (actual time=0.015..0.018 rows=1 loops=1)" " Index Cond: (id = 1397038206::numeric)" " -> Seq Scan on zp_vyuziti_poz (cost=0.00..1.28 rows=28 width=70) (actual time=0.004..0.022 rows=28 loops=1)" " -> Seq Scan on d_pozemku (cost=0.00..1.11 rows=11 width=19) (actual time=0.003..0.015 rows=11 loops=1)" " -> Index Scan using tel_pk on telesa (cost=0.00..8.28 rows=1 width=15) (actual time=0.009..0.017 rows=1 loops=1)" " Index Cond: (parcely.tel_id = public.telesa.id)" " -> Merge Right Join (cost=32884.48..33867.30 rows=76968 width=164) (actual time=1147.807..1315.173 rows=77117 loops=1)" " Merge Cond: (casti_obci.kod = budovy.caobce_kod)" " -> Sort (cost=30.49..30.99 rows=198 width=103) (actual time=1.468..1.614 rows=198 loops=1)" " Sort Key: casti_obci.kod" " Sort Method: quicksort Memory: 53kB" " -> Merge Right Join (cost=19.41..22.94 rows=198 width=103) (actual time=0.583..1.163 rows=198 loops=1)" " Merge Cond: (obce.kod = casti_obci.obce_kod)" " -> Sort (cost=6.88..7.16 rows=111 width=53) (actual time=0.186..0.259 rows=111 loops=1)" " Sort Key: obce.kod" " Sort Method: quicksort Memory: 40kB" " -> Seq Scan on obce (cost=0.00..3.11 rows=111 width=53) (actual time=0.003..0.086 rows=111 loops=1)" " -> Sort (cost=12.53..13.03 rows=198 width=58) (actual time=0.392..0.531 rows=198 loops=1)" " Sort Key: casti_obci.obce_kod" " Sort Method: quicksort Memory: 52kB" " -> Seq Scan on casti_obci (cost=0.00..4.98 rows=198 width=58) (actual time=0.006..0.184 rows=198 loops=1)" " -> Sort (cost=32853.99..33046.41 rows=76968 width=69) (actual time=1146.323..1207.363 rows=77117 loops=1)" " Sort Key: budovy.caobce_kod" " Sort Method: quicksort Memory: 9097kB" " -> Merge Right Join (cost=17404.01..26607.28 rows=76968 width=69) (actual time=675.313..1058.389 rows=77117 loops=1)" " Merge Cond: (public.telesa.id = budovy.tel_id)" " -> Index Scan using tel_pk on telesa (cost=0.00..7819.74 rows=103617 width=15) (actual time=0.027..109.818 rows=103608 loops=1)" " -> Sort (cost=17403.23..17595.65 rows=76968 width=76) (actual time=675.268..730.793 rows=77117 loops=1)" " Sort Key: budovy.tel_id" " Sort Method: quicksort Memory: 9097kB" " -> Merge Right Join (cost=10001.97..11156.52 rows=76968 width=76) (actual time=307.027..473.833 rows=77117 loops=1)" " Merge Cond: (t_budov.kod = budovy.typbud_kod)" " -> Sort (cost=1.14..1.15 rows=6 width=17) (actual time=0.043..0.051 rows=6 loops=1)" " Sort Key: t_budov.kod" " Sort Method: quicksort Memory: 25kB" " -> Seq Scan on t_budov (cost=0.00..1.06 rows=6 width=17) (actual time=0.007..0.012 rows=6 loops=1)" " -> Sort (cost=10000.83..10193.25 rows=76968 width=53) (actual time=306.967..358.000 rows=77117 loops=1)" " Sort Key: budovy.typbud_kod" " Sort Method: quicksort Memory: 9112kB" " -> Merge Left Join (cost=1.07..3754.12 rows=76968 width=53) (actual time=0.216..211.649 rows=77117 loops=1)" " Merge Cond: (budovy.id = casti_budov.bud_id)" " -> Index Scan using bud_pk on budovy (cost=0.00..3500.36 rows=76968 width=40) (actual time=0.130..82.669 rows=76968 loops=1)" " -> Materialize (cost=1.07..58.37 rows=238 width=28) (actual time=0.073..3.458 rows=238 loops=1)" " -> Nested Loop Left Join (cost=1.07..55.99 rows=238 width=28) (actual time=0.068..3.113 rows=238 loops=1)" " Join Filter: (t_bud_ii.kod = casti_budov.typbud_kod)" " -> Index Scan using i_casti_budov_budid on casti_budov (cost=0.00..22.79 rows=238 width=25) (actual time=0.051..0.323 rows=238 loops=1)" " -> Materialize (cost=1.07..1.13 rows=6 width=17) (actual time=0.001..0.004 rows=6 loops=238)" " -> Seq Scan on t_budov t_bud_ii (cost=0.00..1.06 rows=6 width=17) (actual time=0.003..0.013 rows=6 loops=1)" "Total runtime: 1372.410 ms"což bych pokládal za dostatečné, nicméně jsem chtěl vyzkoušet i optimalizaci (nerad bych svůj nepořádek zametal pod koberec neustálým navyšováním výkonu) dotazu, jak radí kolega níže. V pohledu je použitej jinej pohled, což jak jsem pochopil z vyjádření dalšího pana kolegy by mohlo dělat paseku, takže jsem oba pohledy přepsal do jednoho. Tím jsem se dostal na půl sekundy bez ohledu na nastavení work_mem a hash_join..
"Nested Loop Left Join (cost=0.00..42.69 rows=1 width=275) (actual time=0.302..0.334 rows=1 loops=1)" " Join Filter: (casti_obci.obce_kod = obce.kod)" " -> Nested Loop Left Join (cost=0.00..38.11 rows=1 width=230) (actual time=0.131..0.162 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..29.81 rows=1 width=237) (actual time=0.127..0.156 rows=1 loops=1)" " Join Filter: (t_bud_ii.kod = casti_budov.typbud_kod)" " -> Nested Loop Left Join (cost=0.00..28.68 rows=1 width=234) (actual time=0.113..0.141 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..20.38 rows=1 width=230) (actual time=0.099..0.124 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..20.04 rows=1 width=216) (actual time=0.096..0.119 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..19.76 rows=1 width=213) (actual time=0.094..0.116 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..19.48 rows=1 width=163) (actual time=0.091..0.112 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..11.19 rows=1 width=134) (actual time=0.087..0.107 rows=1 loops=1)" " Join Filter: (d_pozemku.kod = parcely.drupoz_kod)" " -> Nested Loop Left Join (cost=0.00..9.94 rows=1 width=129) (actual time=0.080..0.082 rows=1 loops=1)" " Join Filter: (zp_vyuziti_poz.kod = parcely.zpvypa_kod)" " -> Index Scan using par_pk on parcely (cost=0.00..8.31 rows=1 width=73) (actual time=0.028..0.029 rows=1 loops=1)" " Index Cond: (id = 1397038206::numeric)" " -> Seq Scan on zp_vyuziti_poz (cost=0.00..1.28 rows=28 width=70) (actual time=0.004..0.021 rows=28 loops=1)" " -> Seq Scan on d_pozemku (cost=0.00..1.11 rows=11 width=19) (actual time=0.003..0.010 rows=11 loops=1)" " -> Index Scan using bud_pk on budovy (cost=0.00..8.28 rows=1 width=40) (actual time=0.001..0.001 rows=0 loops=1)" " Index Cond: (budovy.id = parcely.bud_id)" " -> Index Scan using caob_pk on casti_obci (cost=0.00..0.27 rows=1 width=58) (actual time=0.000..0.000 rows=0 loops=1)" " Index Cond: (casti_obci.kod = budovy.caobce_kod)" " -> Index Scan using tbud_pk on t_budov (cost=0.00..0.27 rows=1 width=17) (actual time=0.000..0.000 rows=0 loops=1)" " Index Cond: (t_budov.kod = budovy.typbud_kod)" " -> Index Scan using i_casti_budov_budid on casti_budov (cost=0.00..0.30 rows=3 width=25) (actual time=0.001..0.001 rows=0 loops=1)" " Index Cond: (casti_budov.bud_id = budovy.id)" " -> Index Scan using tel_pk on telesa (cost=0.00..8.28 rows=1 width=15) (actual time=0.011..0.013 rows=1 loops=1)" " Index Cond: (parcely.tel_id = telesa.id)" " -> Seq Scan on t_budov t_bud_ii (cost=0.00..1.06 rows=6 width=17) (actual time=0.002..0.006 rows=6 loops=1)" " -> Index Scan using tel_pk on telesa tel_bud (cost=0.00..8.28 rows=1 width=15) (actual time=0.001..0.001 rows=0 loops=1)" " Index Cond: (budovy.tel_id = tel_bud.id)" " -> Seq Scan on obce (cost=0.00..3.11 rows=111 width=53) (actual time=0.002..0.070 rows=111 loops=1)" "Total runtime: 0.527 ms"Tudíž mám dvě dobrá řešení, která hodlám zkombinovat, změna nastavení jistě prospěje i dalším dotazům a píšu si za uši, že při volání pohledu v pohledu nefungujou indexy jak by měly. Všem děkuju za ochotu a dobré rady. Omlouvám se, že jsem nepřiložil i SQL pohledu, ale nejsou to moje data, pokud by ho někdo moc chtěl, tak ho nějak zobecním..
create viev v_parcely as Select ... from parcely left join typy on .. left join telesa on .. . . left join v_budovy on .. ------------------------- create viev v_bud as select ...... from budovy left join casti_budov on .. left join typy budov on ... . . .a já z toho udelal
create viev v_parcely as Select ... from parcely left join typy on .. left join telesa on .. . . left join budovy left join casti_budov on .. left join typy budov on ... . . .
set enable_hashjoin to on; set work_mem to '1MB'; set JOIN_COLLAPSE_LIMIT to 12; set geqo_threshold to 12; explain analyze select * from v_vypis_parcel_puvodni where par_id = 1396907206 "Nested Loop Left Join (cost=13.90..4930.90 rows=1 width=415) (actual time=298.456..365.421 rows=1 loops=1)" " Join Filter: (katastr_uzemi.kod = parcely.katuze_kod)" " -> Nested Loop Left Join (cost=13.90..4923.96 rows=1 width=365) (actual time=298.408..365.142 rows=1 loops=1)" " -> Nested Loop Left Join (cost=13.90..4923.68 rows=1 width=320) (actual time=298.402..365.134 rows=1 loops=1)" " -> Nested Loop Left Join (cost=13.90..4923.40 rows=1 width=270) (actual time=298.396..365.127 rows=1 loops=1)" " -> Nested Loop Left Join (cost=13.90..4923.02 rows=1 width=277) (actual time=298.364..365.091 rows=1 loops=1)" " Join Filter: (d_pozemku.kod = parcely.drupoz_kod)" " -> Nested Loop Left Join (cost=13.90..4921.77 rows=1 width=272) (actual time=298.341..365.063 rows=1 loops=1)" " Join Filter: (zp_vyuziti_poz.kod = parcely.zpvypa_kod)" " -> Nested Loop Left Join (cost=13.90..4920.14 rows=1 width=216) (actual time=298.291..365.011 rows=1 loops=1)" " -> Nested Loop Left Join (cost=13.90..4911.85 rows=1 width=212) (actual time=298.260..364.977 rows=1 loops=1)" " Join Filter: (parcely.zdpaze_kod = zdroje_parcel_ze.kod)" " -> Nested Loop Left Join (cost=13.90..4910.78 rows=1 width=149) (actual time=298.236..364.953 rows=1 loops=1)" " Join Filter: (budovy.id = parcely.bud_id)" " -> Index Scan using par_pk on parcely (cost=0.00..8.31 rows=1 width=84) (actual time=0.027..0.031 rows=1 loops=1)" " Index Cond: (id = 1396907206::numeric)" " -> Hash Left Join (cost=13.90..3940.37 rows=76968 width=76) (actual time=0.873..307.146 rows=77117 loops=1)" " Hash Cond: (budovy.typbud_kod = t_budov.kod)" " -> Hash Left Join (cost=12.76..2880.92 rows=76968 width=53) (actual time=0.852..183.112 rows=77117 loops=1)" " Hash Cond: (budovy.id = casti_budov.bud_id)" " -> Seq Scan on budovy (cost=0.00..1903.68 rows=76968 width=40) (actual time=0.033..53.484 rows=76968 loops=1)" " -> Hash (cost=9.79..9.79 rows=238 width=28) (actual time=0.806..0.806 rows=238 loops=1)" " -> Hash Left Join (cost=1.14..9.79 rows=238 width=28) (actual time=0.036..0.612 rows=238 loops=1)" " Hash Cond: (casti_budov.typbud_kod = t_bud_ii.kod)" " -> Seq Scan on casti_budov (cost=0.00..5.38 rows=238 width=25) (actual time=0.002..0.159 rows=238 loops=1)" " -> Hash (cost=1.06..1.06 rows=6 width=17) (actual time=0.020..0.020 rows=6 loops=1)" " -> Seq Scan on t_budov t_bud_ii (cost=0.00..1.06 rows=6 width=17) (actual time=0.004..0.010 rows=6 loops=1)" " -> Hash (cost=1.06..1.06 rows=6 width=17) (actual time=0.013..0.013 rows=6 loops=1)" " -> Seq Scan on t_budov (cost=0.00..1.06 rows=6 width=17) (actual time=0.001..0.005 rows=6 loops=1)" " -> Seq Scan on zdroje_parcel_ze (cost=0.00..1.03 rows=3 width=70) (actual time=0.002..0.004 rows=3 loops=1)" " -> Index Scan using tel_pk on telesa (cost=0.00..8.28 rows=1 width=15) (actual time=0.021..0.022 rows=1 loops=1)" " Index Cond: (parcely.tel_id = public.telesa.id)" " -> Seq Scan on zp_vyuziti_poz (cost=0.00..1.28 rows=28 width=70) (actual time=0.003..0.020 rows=28 loops=1)" " -> Seq Scan on d_pozemku (cost=0.00..1.11 rows=11 width=19) (actual time=0.002..0.007 rows=11 loops=1)" " -> Index Scan using tel_pk on telesa (cost=0.00..0.37 rows=1 width=15) (actual time=0.026..0.028 rows=1 loops=1)" " Index Cond: (budovy.tel_id = public.telesa.id)" " -> Index Scan using caob_pk on casti_obci (cost=0.00..0.27 rows=1 width=58) (actual time=0.002..0.002 rows=0 loops=1)" " Index Cond: (casti_obci.kod = budovy.caobce_kod)" " -> Index Scan using ob_pk on obce (cost=0.00..0.27 rows=1 width=53) (actual time=0.002..0.002 rows=0 loops=1)" " Index Cond: (casti_obci.obce_kod = obce.kod)" " -> Seq Scan on katastr_uzemi (cost=0.00..4.72 rows=172 width=54) (actual time=0.003..0.104 rows=172 loops=1)" "Total runtime: 365.709 ms"
" Hash Cond: (bud.tel_id = public.telesa.id)" " -> Seq Scan on budovy bud (cost=0.00..1903.68 rows=76968 width=40) (actual time=0.018..85.580 rows=76968 loops=1)" " -> Hash (cost=2214.17..2214.17 rows=103617 width=15) (actual time=26262.120..26262.120 rows=103617 loops=1)" " -> Seq Scan on telesa (cost=0.00..2214.17 rows=103617 width=15) (actual time=0.017..98.825 rows=103617 loops=1)"Vypadá to ale že ten scan je tam na místě protože celou cestu až do toho nejvnějšího joinu putuje cca 70K řádků což je celý obsah tabulky budovy (plus přijoinované sloupce). Možná zkuste přeformulovat dotaz tak, aby se z budovy nejprve vybralo méně řádků?
"Nested Loop Left Join (cost=4039.55..12009.39 rows=1 width=261) (actual time=59041.378..59041.415 rows=1 loops=1)" " Join Filter: (bud.id = parcely.bud_id)" " -> Nested Loop Left Join (cost=0.00..19.49 rows=1 width=138) (actual time=4.920..4.954 rows=1 loops=1)" [...] " -> Hash Left Join (cost=4039.55..11027.73 rows=76968 width=134) (actual time=26464.128..58984.575 rows=77117 loops=1)"A těch 77k se v druhé větvi táhne poměrně dlouho přes několik dalších joinů. Tak je prostě otázka jestli nechcete dotaz přeformulovat tak, aby se těch 77k řádků omezilo již v nějakém pod-dotazu dříve a neputovaly celou cestu až k tomu největšímu joinu. Když sem dáte formulaci toho dotazu který odpovídá přesně tomu explainu tak to můžeme zkusit nějak vymyslet.
Kdybych ty budovy teda vyndal z toho pohledu v pohledu, mohlo by to pomoct???Zkuste.
"Nested Loop Left Join (cost=0.00..42.69 rows=1 width=275) (actual time=0.308..0.340 rows=1 loops=1)" " Join Filter: (casti_obci.obce_kod = obce.kod)" " -> Nested Loop Left Join (cost=0.00..38.11 rows=1 width=230) (actual time=0.124..0.155 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..29.81 rows=1 width=237) (actual time=0.121..0.150 rows=1 loops=1)" " Join Filter: (t_bud_ii.kod = casti_budov.typbud_kod)" " -> Nested Loop Left Join (cost=0.00..28.68 rows=1 width=234) (actual time=0.107..0.136 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..20.38 rows=1 width=230) (actual time=0.095..0.120 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..20.04 rows=1 width=216) (actual time=0.091..0.114 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..19.76 rows=1 width=213) (actual time=0.089..0.111 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..19.48 rows=1 width=163) (actual time=0.086..0.107 rows=1 loops=1)" " -> Nested Loop Left Join (cost=0.00..11.19 rows=1 width=134) (actual time=0.082..0.102 rows=1 loops=1)" " Join Filter: (d_pozemku.kod = parcely.drupoz_kod)" " -> Nested Loop Left Join (cost=0.00..9.94 rows=1 width=129) (actual time=0.075..0.077 rows=1 loops=1)" " Join Filter: (zp_vyuziti_poz.kod = parcely.zpvypa_kod)" " -> Index Scan using par_pk on parcely (cost=0.00..8.31 rows=1 width=73) (actual time=0.025..0.025 rows=1 loops=1)" " Index Cond: (id = 1397038206::numeric)" " -> Seq Scan on zp_vyuziti_poz (cost=0.00..1.28 rows=28 width=70) (actual time=0.004..0.022 rows=28 loops=1)" " -> Seq Scan on d_pozemku (cost=0.00..1.11 rows=11 width=19) (actual time=0.002..0.008 rows=11 loops=1)" " -> Index Scan using bud_pk on budovy (cost=0.00..8.28 rows=1 width=40) (actual time=0.001..0.001 rows=0 loops=1)" " Index Cond: (budovy.id = parcely.bud_id)" " -> Index Scan using caob_pk on casti_obci (cost=0.00..0.27 rows=1 width=58) (actual time=0.000..0.000 rows=0 loops=1)" " Index Cond: (casti_obci.kod = budovy.caobce_kod)" " -> Index Scan using tbud_pk on t_budov (cost=0.00..0.27 rows=1 width=17) (actual time=0.001..0.001 rows=0 loops=1)" " Index Cond: (t_budov.kod = budovy.typbud_kod)" " -> Index Scan using i_casti_budov_budid on casti_budov (cost=0.00..0.30 rows=3 width=25) (actual time=0.001..0.001 rows=0 loops=1)" " Index Cond: (casti_budov.bud_id = budovy.id)" " -> Index Scan using tel_pk on telesa (cost=0.00..8.28 rows=1 width=15) (actual time=0.010..0.012 rows=1 loops=1)" " Index Cond: (parcely.tel_id = telesa.id)" " -> Seq Scan on t_budov t_bud_ii (cost=0.00..1.06 rows=6 width=17) (actual time=0.002..0.005 rows=6 loops=1)" " -> Index Scan using tel_pk on telesa tel_bud (cost=0.00..8.28 rows=1 width=15) (actual time=0.001..0.001 rows=0 loops=1)" " Index Cond: (budovy.tel_id = tel_bud.id)" " -> Seq Scan on obce (cost=0.00..3.11 rows=111 width=53) (actual time=0.002..0.071 rows=111 loops=1)" "Total runtime: 0.559 ms"
Nebo pokud nechceš hejbat se strukturou databáze, tak mě napadlo todle. Nevím, jestli to bude rychlejší, ale za pokus nic nedáš....
WITH vsebudovy(id, cislo_domovni) (
SELECT bud_id, cislo_domovni, kod, 1 FROM casti_budov
UNION
SELECT id, cislo_domovni, kod, 2 FROM budovy WHERE id NOT in (select bud_id FROM casti_budov)
)
SELECT
vsebudovy.*, t_budov.typ
FROM
vsebudovy INNER/LEFT JOIN typ_budov ON (vsebudovy.kod = typ%budov.kod)
Ale imho nejlepší by opravdu mít budovy a části budov v jedný tabulce: v podstatě to, co počítám jako vsebudovy. Nemusíš kvůli tomu překopávat db, stačí si udělat materializovanej view a dotaz tím urychlíš hodně. Pomocí rules to je pár řádek SQL a vyřešíš si tim problém a navíc zpřehledníš kód...
CREATE TABLE asdasd AS SELECT blablbabla
a doplnit triggery nebo rules zajišťující update tý tabulky.
CREATE RULE budovy insert AS ON INSERT TO budovy DO ALSO
INSERT TO nazev_pohledu (cast_budovy, id, kod, ...)
VALUES (false, new.id, new.kod, ...)
on update to budovy update view
(když tam záznam nebude, neoupdatuje se nic, dotaz už vymyslíš sám...)
on delete to budovy delete view (část budovy nemůže existovat bez budovy)
on insert to casti insert to view, jestli je tam cela budova vymaz
CREATE RULE budovy insert AS ON INSERT TO budovy DO ALSO
(
INSERT TO nazev_pohledu (cast_budovy, id, kod, ...) VALUES (true, new.id, new.kod, ...);
DELETE FROM nazev_pohledu WHERE id = new.budova_id AND cast_budovy = false;
)
on update to casti update view
on delete to casti delete view
a pořádek bude udržovat sama postgresql....
Tiskni
Sdílej: