<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Performance on Ivan Luminaria</title><link>https://ivanluminaria.com/ro/tags/performance/</link><description>Recent content in Performance on Ivan Luminaria</description><generator>Hugo</generator><language>ro</language><lastBuildDate>Tue, 24 Mar 2026 08:03:00 +0100</lastBuildDate><atom:link href="https://ivanluminaria.com/ro/tags/performance/index.xml" rel="self" type="application/rss+xml"/><item><title>VACUUM și autovacuum: de ce PostgreSQL are nevoie ca cineva să facă curățenie</title><link>https://ivanluminaria.com/ro/posts/postgresql/vacuum-autovacuum-postgresql/</link><pubDate>Tue, 24 Mar 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/ro/posts/postgresql/vacuum-autovacuum-postgresql/</guid><description>&lt;p&gt;Acum câțiva ani mi s-a cerut să verific un PostgreSQL în producție care
&amp;ldquo;se încetinește în fiecare săptămână&amp;rdquo;. Mereu același tipar: luni merge
bine, vineri e dezastru. În weekend cineva repornește serviciul și se
începe de la capăt.&lt;/p&gt;
&lt;p&gt;Baza de date de aproximativ 200 GB. Tabelele principale ocupau aproape
triplul spațiului efectiv al datelor. Query-uri care cădeau în
sequential scan acolo unde nu ar fi trebuit. Timpii de răspuns creșteau
zi de zi.&lt;/p&gt;</description></item><item><title>Oracle pe Linux: parametrii kernel pe care nimeni nu-i configurează</title><link>https://ivanluminaria.com/ro/posts/oracle/oracle-linux-kernel/</link><pubDate>Tue, 24 Feb 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/ro/posts/oracle/oracle-linux-kernel/</guid><description>&lt;p&gt;Clientul era o companie de logistică cu Oracle 19c Enterprise Edition pe Oracle Linux 8. Șaizeci de utilizatori concurenți, o aplicație ERP personalizată, circa 400 GB de date. Serverul era un Dell PowerEdge cu 128 GB de RAM și 32 de core-uri.&lt;/p&gt;
&lt;p&gt;Plângerile erau vagi dar persistente: &amp;ldquo;Sistemul e lent.&amp;rdquo; &amp;ldquo;Query-urile de dimineață durează dublu față de acum două luni.&amp;rdquo; &amp;ldquo;Din când în când se blochează totul câteva secunde.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Când m-am conectat pe server, primul lucru pe care l-am verificat nu a fost baza de date. A fost sistemul de operare.&lt;/p&gt;</description></item><item><title>AWR, ASH și cele 10 minute care au salvat un go-live</title><link>https://ivanluminaria.com/ro/posts/oracle/oracle-awr-ash/</link><pubDate>Tue, 10 Feb 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/ro/posts/oracle/oracle-awr-ash/</guid><description>&lt;p&gt;Vineri, ora 18:40. Aveam deja geaca pe mine, gata de plecare. Telefonul vibrează. E project managerul.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Ivan, avem o problemă. Sistemul merge foarte lent. Mâine dimineață e go-live-ul.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Nu e prima dată când primesc un astfel de apel. Dar tonul era diferit. Nu era plângerea obișnuită despre lentoare. Era panică.&lt;/p&gt;
&lt;p&gt;Mă reconectez prin VPN, deschid o sesiune pe baza de date Oracle 19c a clientului. Primul lucru pe care îl fac e o verificare rapidă:&lt;/p&gt;</description></item><item><title>Când un LIKE '%valoare%' încetinește totul: un caz real de optimizare PostgreSQL</title><link>https://ivanluminaria.com/ro/posts/postgresql/like-optimization-postgresql/</link><pubDate>Tue, 06 Jan 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/ro/posts/postgresql/like-optimization-postgresql/</guid><description>&lt;p&gt;Cu câteva săptămâni în urmă, un client m-a contactat cu o problemă
foarte comună:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Căutarea din consola administrativă este lentă. Uneori durează câteva
secunde. Am redus deja JOIN-urile, dar problema nu a dispărut.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mediu: PostgreSQL în cloud managed.&lt;br&gt;
Tabela principală: &lt;code&gt;payment_report&lt;/code&gt; (~6 milioane de rânduri, 3 GB).&lt;br&gt;
Coloana căutată: &lt;code&gt;reference_code&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Query problematic:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reporting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;payment_report&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;JOIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reporting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;payment_cart&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cart_id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1001&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reference_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;LIKE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%ABC123%&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;LIMIT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="-prima-observație-join-urile-nu-erau-problema" class="relative group"&gt;🧠 Prima observație: JOIN-urile nu erau problema &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-prima-observa%c8%9bie-join-urile-nu-erau-problema" aria-label="Link"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Am comparat:&lt;/p&gt;</description></item><item><title>Oracle Partitioning: când 2 miliarde de rânduri nu mai încap într-o interogare</title><link>https://ivanluminaria.com/ro/posts/oracle/oracle-partitioning/</link><pubDate>Tue, 23 Dec 2025 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/ro/posts/oracle/oracle-partitioning/</guid><description>&lt;p&gt;Două miliarde de rânduri. Nu este un număr la care ajungi într-o zi. Durează ani de tranzacții, mișcări, înregistrări zilnice care se acumulează. Și în tot acest timp baza de date funcționează, interogările răspund, rapoartele ies. Apoi într-o zi cineva deschide un ticket: „raportul lunar durează patru ore.&amp;quot;&lt;/p&gt;
&lt;p&gt;Patru ore. Pentru un raport care cu șase luni înainte dura douăzeci de minute.&lt;/p&gt;
&lt;p&gt;Nu este un bug. Nu este o problemă de rețea sau de stocare lentă. Este fizica datelor: când o tabelă crește peste un anumit prag, abordările care funcționau nu mai funcționează. Și dacă nu ai proiectat structura să gestioneze acea creștere, baza de date face singurul lucru pe care îl poate face: citește totul.&lt;/p&gt;</description></item><item><title>EXPLAIN ANALYZE nu e suficient: cum sa citesti cu adevarat un plan de executie PostgreSQL</title><link>https://ivanluminaria.com/ro/posts/postgresql/explain-analyze-postgresql/</link><pubDate>Tue, 28 Oct 2025 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/ro/posts/postgresql/explain-analyze-postgresql/</guid><description>&lt;p&gt;Zilele trecute un coleg imi trimite o captura de ecran pe Teams. Un query care ruleaza pe o tabela de 2 milioane de randuri, 45 de secunde timp de executie. Imi scrie:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Am facut EXPLAIN ANALYZE, dar nu inteleg ce e in neregula. Planul pare corect.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Spoiler: planul nu era deloc corect. Optimizatorul alesese un &lt;span class="glossary-tip" tabindex="0" data-glossary-desc="Nested Loop Join — strategia de join care scaneaza tabelul intern pentru fiecare rand al tabelului extern, ideala pentru seturi mici de date cu index." data-glossary-url="https://ivanluminaria.com/ro/glossary/nested-loop/" data-glossary-more="Citește mai mult →"&gt;nested loop&lt;/span&gt;
 join unde era nevoie de un &lt;span class="glossary-tip" tabindex="0" data-glossary-desc="Hash Join — strategie de join optimizata pentru volume mari de date, bazata pe o hash table construita in memorie." data-glossary-url="https://ivanluminaria.com/ro/glossary/hash-join/" data-glossary-more="Citește mai mult →"&gt;hash join&lt;/span&gt;
, iar motivul era banal — statistici neactualizate. Dar ca sa ajung acolo a trebuit sa citesc planul rand cu rand, si atunci mi-am dat seama ca majoritatea DBA-ilor pe care ii cunosc folosesc EXPLAIN ANALYZE ca pe un oracol binar: daca timpul e mare, query-ul e lent. Sfarsitul analizei.&lt;/p&gt;</description></item></channel></rss>