<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ivan Luminaria</title><link>https://ivanluminaria.com/en/</link><description>Recent content on Ivan Luminaria</description><generator>Hugo</generator><language>en</language><lastBuildDate>Tue, 31 Mar 2026 08:03:00 +0100</lastBuildDate><atom:link href="https://ivanluminaria.com/en/index.xml" rel="self" type="application/rss+xml"/><item><title>Binary logs in MySQL: what they are, how to manage them, and when you can delete them</title><link>https://ivanluminaria.com/en/posts/mysql/binary-log-mysql/</link><pubDate>Tue, 31 Mar 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/mysql/binary-log-mysql/</guid><description>&lt;p&gt;The message in the infrastructure team&amp;rsquo;s Slack channel was the kind that makes you look up from your screen: &amp;ldquo;Disk at 95% on the production db. Anyone able to look?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The server was a MySQL 8.0 on Rocky Linux, a business management system used by about a hundred users. The database itself was around 40 GB — nothing extraordinary. But in the data directory there were 180 GB of binary logs. Six months&amp;rsquo; worth of binlogs that nobody had ever thought to manage.&lt;/p&gt;</description></item><item><title>VACUUM and autovacuum: why PostgreSQL needs someone to clean up</title><link>https://ivanluminaria.com/en/posts/postgresql/vacuum-autovacuum-postgresql/</link><pubDate>Tue, 24 Mar 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/postgresql/vacuum-autovacuum-postgresql/</guid><description>&lt;p&gt;A couple of years ago I was asked to look at a production PostgreSQL
instance that &amp;ldquo;slows down every week&amp;rdquo;. Always the same pattern: Monday
is fine, Friday is a disaster. Someone restarts the service over the
weekend and the cycle starts again.&lt;/p&gt;
&lt;p&gt;Database around 200 GB. Main tables occupying nearly three times their
actual data size. Queries falling into sequential scans where they
shouldn&amp;rsquo;t have been. Response times climbing day after day.&lt;/p&gt;</description></item><item><title>AI Manager and Project Management: when artificial intelligence enters the project</title><link>https://ivanluminaria.com/en/posts/project-management/ai-manager-project-management/</link><pubDate>Tue, 17 Mar 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/project-management/ai-manager-project-management/</guid><description>&lt;p&gt;A few months ago, during a meeting with a banking client, the CTO said something that stuck with me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;We need someone who manages AI. Not someone who uses it — someone who governs it.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I nodded without speaking. Because that sentence, in seven seconds, described a role the market is looking for without yet knowing what to call it.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-the-fundamental-misunderstanding" class="relative group"&gt;🧩 The fundamental misunderstanding &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="#-the-fundamental-misunderstanding" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;There is a widespread confusion, and I see it in every project where AI enters the picture.&lt;/p&gt;</description></item><item><title>Payment at 60-90-120 days: the Italian normality that doesn't exist in Europe</title><link>https://ivanluminaria.com/en/posts/project-management/pagamenti-60-90-120-giorni/</link><pubDate>Tue, 10 Mar 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/project-management/pagamenti-60-90-120-giorni/</guid><description>&lt;p&gt;The first time I worked with an international client, something strange happened. They paid me in thirty days.&lt;/p&gt;
&lt;p&gt;Not thirty days from the end of the month. Not thirty days from the invoice receipt date stamped and countersigned by the administration manager. Thirty days from the invoice. Period.&lt;/p&gt;
&lt;p&gt;I checked my bank statement twice. I thought it was a mistake.&lt;/p&gt;
&lt;p&gt;It wasn&amp;rsquo;t a mistake. It was normality — just not Italian normality.&lt;/p&gt;</description></item><item><title>Data Warehouse Architect</title><link>https://ivanluminaria.com/en/resumes/dwh-architect/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/resumes/dwh-architect/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://ivanluminaria.com/downloads/CV_DWH_Architect_Ivan_Luminaria_202603_EN.pdf" target="_blank" rel="noreferrer"&gt;Download PDF&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://www.linkedin.com/in/ivanluminaria" target="_blank" rel="noreferrer"&gt;LinkedIn Profile&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="professional-profile" class="relative group"&gt;Professional Profile &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="#professional-profile" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Data Warehouse Architect and IT professional with nearly 30 years of experience in designing, implementing, and managing complex, high-performing DWH solutions in Oracle and PostgreSQL environments. Expert in multidimensional data modeling methodologies (Kimball, Inmon) and in optimizing ETL/ELT processes and SQL queries on datasets ranging from hundreds of millions to billions of rows. Proven ability to lead end-to-end DWH projects — from requirements analysis to production deployment — ensuring data integrity, quality, and availability to support business decisions. Technical leadership and problem-solving mindset in international and full-remote contexts.&lt;/p&gt;</description></item><item><title>Oracle DBA &amp; Performance Tuning Expert</title><link>https://ivanluminaria.com/en/resumes/oracle-dba/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/resumes/oracle-dba/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://ivanluminaria.com/downloads/CV_Oracle_DBA_Ivan_Luminaria_202603_EN.pdf" target="_blank" rel="noreferrer"&gt;Download PDF&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://www.linkedin.com/in/ivanluminaria" target="_blank" rel="noreferrer"&gt;LinkedIn Profile&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="professional-profile" class="relative group"&gt;Professional Profile &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="#professional-profile" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Highly skilled Senior Oracle DBA and Performance Tuning Expert with nearly 30 years of specialized experience in the administration, optimization, and management of complex, mission-critical Oracle databases, including Exadata, RAC, and Oracle Cloud (OCI, Autonomous Database) environments. Deep expertise in performance analysis (AWR, ADDM, ASH), tuning complex SQL queries, instance optimization, and resolving performance issues. Foundational knowledge of practices related to backup &amp;amp; recovery (RMAN), security (TDE), installation, patching, migrations, and storage management (ASM), with performance tuning remaining the primary and in-depth area of expertise, crucial for the integrity, performance, and contribution to the high availability of Oracle systems in demanding, international corporate settings.&lt;/p&gt;</description></item><item><title>Oracle PL/SQL Developer</title><link>https://ivanluminaria.com/en/resumes/oracle-plsql/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/resumes/oracle-plsql/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://ivanluminaria.com/downloads/CV_Oracle_PLSQL_Ivan_Luminaria_202603_EN.pdf" target="_blank" rel="noreferrer"&gt;Download PDF&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://www.linkedin.com/in/ivanluminaria" target="_blank" rel="noreferrer"&gt;LinkedIn Profile&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="professional-profile" class="relative group"&gt;Professional Profile &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="#professional-profile" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Senior Oracle PL/SQL Developer with nearly 30 years of experience in designing, developing, testing, and optimizing robust and efficient PL/SQL code for data-intensive applications and Data Warehouse systems. Deep expertise in creating complex packages, procedures, functions, triggers, and types, with a constant focus on performance, maintainability, and code quality. Expert in optimizing complex SQL queries and managing large volumes of data. Skilled in translating business requirements into high-performing and scalable application logic within the Oracle database. Consolidated background also as an Oracle DBA and DWH Architect, providing a comprehensive view of the data lifecycle.&lt;/p&gt;</description></item><item><title>Project Manager</title><link>https://ivanluminaria.com/en/resumes/project-manager/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/resumes/project-manager/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://ivanluminaria.com/downloads/CV_Project_Manager_Ivan_Luminaria_202603_EN.pdf" target="_blank" rel="noreferrer"&gt;Download PDF&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://www.linkedin.com/in/ivanluminaria" target="_blank" rel="noreferrer"&gt;LinkedIn Profile&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="professional-profile" class="relative group"&gt;Professional Profile &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="#professional-profile" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Project Manager with nearly 30 years of IT experience and a solid technical background in Data Warehouse and Oracle environments. Over 10 projects delivered with a strong on-time track record, managing teams of 3-7 people in multicultural, remote settings on projects valued in the €100K-€500K range. Hands-on expertise in planning, risk management, resource coordination and stakeholder engagement — developed through years of leading development, release and maintenance activities for clients in Banking, Telco, Insurance and Public Administration. Agile (Scrum) methodologies applied in day-to-day project management, backed by certified training. Deep technical background (DWH architecture, Oracle DBA, PL/SQL, ETL/ELT) that enables effective communication with development teams, realistic feasibility assessments and early identification of technical risks.&lt;/p&gt;</description></item><item><title>Bike vs Car in Rome: the morning that opened my eyes</title><link>https://ivanluminaria.com/en/posts/project-management/bici-vs-auto-roma/</link><pubDate>Tue, 03 Mar 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/project-management/bici-vs-auto-roma/</guid><description>&lt;p&gt;Monday morning. Alarm at 6:40. Shower, quick breakfast, car keys on the table. I leave the house at 7:15.&lt;/p&gt;
&lt;p&gt;I live in the Appio Latino neighbourhood. The office is on Via Crescenzio, in Prati. Eight kilometres as the crow flies. Should take fifteen minutes. In Rome, it&amp;rsquo;s a different story.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-the-morning-by-car" class="relative group"&gt;🚗 The morning by car &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="#-the-morning-by-car" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Via Appia Nuova is already a car park. Porta San Giovanni, a funnel. Lungotevere, a funeral procession with horns.&lt;/p&gt;</description></item><item><title>Oracle on Linux: the kernel parameters nobody configures</title><link>https://ivanluminaria.com/en/posts/oracle/oracle-linux-kernel/</link><pubDate>Tue, 24 Feb 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/oracle/oracle-linux-kernel/</guid><description>&lt;p&gt;The client was a logistics company running Oracle 19c Enterprise Edition on Oracle Linux 8. Sixty concurrent users, a custom ERP application, about 400 GB of data. The server was a Dell PowerEdge with 128 GB of RAM and 32 cores.&lt;/p&gt;
&lt;p&gt;The complaints were vague but persistent: &amp;ldquo;The system is slow.&amp;rdquo; &amp;ldquo;Morning queries take twice as long as two months ago.&amp;rdquo; &amp;ldquo;Every now and then everything freezes for a few seconds.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Smart working in IT consulting: the numbers nobody wants to look at</title><link>https://ivanluminaria.com/en/posts/project-management/smartworking-consulenza-it/</link><pubDate>Tue, 24 Feb 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/project-management/smartworking-consulenza-it/</guid><description>&lt;p&gt;6:47 AM on an ordinary Tuesday. I&amp;rsquo;m at the park near my house, running gear on. The air is fresh, the sun is barely rising. I&amp;rsquo;ve already done four kilometers. I feel alive.&lt;/p&gt;
&lt;p&gt;By 7:00 I&amp;rsquo;m in the shower. By 7:20 I&amp;rsquo;m having a calm breakfast. By 7:45 I&amp;rsquo;m at my desk — fresh, focused, ready to work.&lt;/p&gt;
&lt;p&gt;At that same hour, a colleague of mine is still stuck on the Pontina highway. Or on Rome&amp;rsquo;s ring road, somewhere between the Casilina and Tuscolana exits. Phone in hand — not to work, but to send the usual message: &amp;ldquo;Sorry, running late, there&amp;rsquo;s been an accident.&amp;rdquo;&lt;/p&gt;</description></item><item><title>About me</title><link>https://ivanluminaria.com/en/about/</link><pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/about/</guid><description>&lt;div class="profile-header flex flex-col sm:flex-row sm:items-center items-start"&gt;
 &lt;div class="flex-none"&gt;
 &lt;img
 src='https://ivanluminaria.com/img/ivan_luminaria_avatar.png'
 alt="Ivan Luminaria"
 class="profile-avatar rounded-full shadow-xl border-4 border-slate-100"&gt;
 &lt;/div&gt;
 &lt;div class="profile-text text-left"&gt;
 &lt;h1 class="mb-1"&gt;IVAN LUMINARIA&lt;/h1&gt;
 &lt;h3 class="mt-0 text-slate-500"&gt;
 Oracle, PostgreSQL &amp; MySQL Expert | DWH Architect | Project Manager
 &lt;/h3&gt;
 &lt;p class="mt-4"&gt;
 IT professional with approximately &lt;strong&gt;30 years of experience&lt;/strong&gt; in designing, implementing and managing database and Data Warehouse solutions across Oracle, PostgreSQL and MySQL environments.
 &lt;/p&gt;
 &lt;p class="mt-2" style="font-size: 0.9em;"&gt;
 &lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/ivanluminaria/" target="_blank" rel="noopener"&gt;ivanluminaria&lt;/a&gt;&lt;br&gt;
 &lt;strong&gt;Email:&lt;/strong&gt; ivan (dot) luminaria (at) gmail (dot) com
 &lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;I have been working with databases for about thirty years.&lt;/p&gt;</description></item><item><title>Galera Cluster with 3 nodes: how I solved a MySQL availability problem</title><link>https://ivanluminaria.com/en/posts/mysql/galera-cluster-3-nodi/</link><pubDate>Tue, 17 Feb 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/mysql/galera-cluster-3-nodi/</guid><description>&lt;p&gt;The ticket was laconic, as it often is when the problem is serious: &amp;ldquo;The database went down again. The application is stopped. Third time in two months.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The client had a MariaDB on a single Linux server — a business management application used by about two hundred internal users, with load spikes during end-of-month accounting closures. Every time the server had a problem — a disk slowing down, a system update requiring a reboot, a process consuming all the RAM — the database crashed and with it the entire business operations.&lt;/p&gt;</description></item><item><title>AWR, ASH and the 10 minutes that saved a go-live</title><link>https://ivanluminaria.com/en/posts/oracle/oracle-awr-ash/</link><pubDate>Tue, 10 Feb 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/oracle/oracle-awr-ash/</guid><description>&lt;p&gt;Friday, 6:40 PM. I already had my jacket on, ready to leave. The phone buzzes. It&amp;rsquo;s the project manager.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Ivan, we have a problem. The system is crawling. The go-live is tomorrow morning.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not the first time I&amp;rsquo;ve received a call like that. But the tone was different. This wasn&amp;rsquo;t the usual vague complaint about slowness. This was panic.&lt;/p&gt;
&lt;p&gt;I reconnect to the VPN, open a session on the client&amp;rsquo;s Oracle 19c database. First thing I do is a quick check:&lt;/p&gt;</description></item><item><title>Roles and Users in PostgreSQL: Why Everything Is (Only) a ROLE</title><link>https://ivanluminaria.com/en/posts/postgresql/postgresql_roles_and_users/</link><pubDate>Tue, 10 Feb 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/postgresql/postgresql_roles_and_users/</guid><description>&lt;p&gt;The first time I seriously worked with PostgreSQL I was coming from
years of other databases. I looked for the &lt;code&gt;CREATE USER&lt;/code&gt; command. I found it.
Then I saw &lt;code&gt;CREATE ROLE&lt;/code&gt;. Then &lt;code&gt;ALTER USER&lt;/code&gt;. Then &lt;code&gt;ALTER ROLE&lt;/code&gt;.&lt;br&gt;
For a few minutes I thought: &amp;ldquo;Alright, someone here enjoys confusing
people.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Actually, no. PostgreSQL is far more consistent than it appears.
It is just consistent in its own way.&lt;/p&gt;
&lt;h2 id="in-postgresql-there-are-no-users-there-are-roles" class="relative group"&gt;In PostgreSQL there are no users. There are roles. &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="#in-postgresql-there-are-no-users-there-are-roles" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The key is this: &lt;strong&gt;in PostgreSQL everything is a ROLE&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>When chaos becomes method: AI and GitHub to manage a project nobody wanted to touch</title><link>https://ivanluminaria.com/en/posts/project-management/ai-github-project-management/</link><pubDate>Tue, 03 Feb 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/project-management/ai-github-project-management/</guid><description>&lt;p&gt;A client calls me. Tense voice, measured words.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Ivan, we have a problem. Actually, we have &lt;strong&gt;the&lt;/strong&gt; problem.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I know that tone. It&amp;rsquo;s the tone of someone who has already tried to fix things internally, failed, and is now looking for someone to tell them the truth without beating around the bush.&lt;/p&gt;
&lt;p&gt;The problem is a management software — not a website, not an app — a critical system running important business processes. It&amp;rsquo;s a few years old. It grew fast, as always happens when business runs faster than architecture. And now everything has piled up: open bugs that nobody closes, change requests that nobody plans, developers working on different versions of the code without knowing what the others are doing.&lt;/p&gt;</description></item><item><title>Standup meetings: why they only work if they last 15 minutes</title><link>https://ivanluminaria.com/en/posts/project-management/standup-meeting-15-minuti/</link><pubDate>Tue, 27 Jan 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/project-management/standup-meeting-15-minuti/</guid><description>&lt;p&gt;First Monday of the project. New team, new methodology, new hopes. The PM proposes a daily standup. Everyone nods. &amp;ldquo;Fifteen minutes, standing up, three questions. Simple.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The first week works. At 9:15 it starts, by 9:28 everyone is back at their desk. Each person speaks for two minutes, blockers are flagged, people move on. Pure efficiency.&lt;/p&gt;
&lt;p&gt;The second week someone raises a hand mid-round: &amp;ldquo;Can I quickly explain the problem I&amp;rsquo;m having with the integration?&amp;rdquo; Five minutes of technical discussion between two people. The other six stand there listening to something that doesn&amp;rsquo;t concern them.&lt;/p&gt;</description></item><item><title>Users, Roles and Privileges in Oracle: Why GRANT ALL Is Never the Answer</title><link>https://ivanluminaria.com/en/posts/oracle/oracle-roles-privileges/</link><pubDate>Tue, 27 Jan 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/oracle/oracle-roles-privileges/</guid><description>&lt;p&gt;It has happened to me more than once: I walk into an Oracle environment and find the same situation. Every application user connected as the schema owner, with the DBA role granted. Developers, batch jobs, reporting tools — all running with the same privileges as the user that owns the tables.&lt;/p&gt;
&lt;p&gt;When you ask why, the answer is always some variation of: &amp;ldquo;This way everything works without permission issues.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Sure. Everything works. Until the day a developer runs a &lt;code&gt;DROP TABLE&lt;/code&gt; on the wrong table. Or a batch import does a &lt;code&gt;TRUNCATE&lt;/code&gt; on a production table thinking it is in the test environment. Or someone runs a &lt;code&gt;DELETE FROM customers&lt;/code&gt; without a &lt;code&gt;WHERE&lt;/code&gt; clause.&lt;/p&gt;</description></item><item><title>Ragged hierarchies: when the client has no parent and the group has no grandparent</title><link>https://ivanluminaria.com/en/posts/data-warehouse/ragged-hierarchies/</link><pubDate>Tue, 20 Jan 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/data-warehouse/ragged-hierarchies/</guid><description>&lt;p&gt;Three levels. Top Group, Group, Client. It looks like a trivial structure — the kind of hierarchy you draw on a whiteboard in five minutes and that any BI tool should handle without issues.&lt;/p&gt;
&lt;p&gt;Then you discover that not all clients belong to a group. And that not all groups belong to a top group. And that the aggregation reports the business asks for — revenue by top group, client count by group, &lt;span class="glossary-tip" tabindex="0" data-glossary-desc="Navigation in reports from an aggregated level to a detail level, typical of OLAP analysis and data warehouses." data-glossary-url="https://ivanluminaria.com/en/glossary/drill-down/" data-glossary-more="Read more →"&gt;drill-down&lt;/span&gt;
 from the top to the leaf — produce wrong or incomplete results because the hierarchy has holes.&lt;/p&gt;</description></item><item><title>MySQL Users: Why 'mario' and 'mario'@'localhost' Are Not the Same Person</title><link>https://ivanluminaria.com/en/posts/mysql/mysql-users-and-hosts/</link><pubDate>Tue, 13 Jan 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/mysql/mysql-users-and-hosts/</guid><description>&lt;p&gt;A few weeks ago a client calls me. Pragmatic tone, seemingly trivial request:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;I need to create a user on MySQL for an application that needs to access a database. Can you take care of it?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sure. &lt;code&gt;CREATE USER&lt;/code&gt;, &lt;span class="glossary-tip" tabindex="0" data-glossary-desc="SQL command to assign specific privileges to a user or role on databases, tables or columns. In MySQL 8 it no longer creates users implicitly." data-glossary-url="https://ivanluminaria.com/en/glossary/grant/" data-glossary-more="Read more →"&gt;`GRANT`&lt;/span&gt;
, next.&lt;/p&gt;</description></item><item><title>The Yes-And technique: how I defused a meeting that was about to blow up</title><link>https://ivanluminaria.com/en/posts/project-management/tecnica-si-e-yes-and/</link><pubDate>Tue, 13 Jan 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/project-management/tecnica-si-e-yes-and/</guid><description>&lt;p&gt;It was a Thursday afternoon, one of those meetings that was supposed to last an hour on paper. Seven of us, connected on a call. The agenda was straightforward: decide the migration strategy for an Oracle database from on-premise to cloud.&lt;/p&gt;
&lt;p&gt;Straightforward, sure. On paper.&lt;/p&gt;
&lt;p&gt;Twenty minutes in, the meeting had turned into a duel.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-the-spark" class="relative group"&gt;🔥 The spark &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="#-the-spark" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;On one side was the infrastructure manager. Experienced, twenty years of datacenters behind him. His position was rock-solid: &lt;strong&gt;lift-and-shift migration, zero changes to the architecture, we move everything as-is&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>When a LIKE '%value%' Slows Everything Down: A Real PostgreSQL Optimization Case</title><link>https://ivanluminaria.com/en/posts/postgresql/like-optimization-postgresql/</link><pubDate>Tue, 06 Jan 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/postgresql/like-optimization-postgresql/</guid><description>&lt;p&gt;A few weeks ago, a client contacted me with a very common issue:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Search in the admin console is slow. Sometimes it takes several
seconds. We&amp;rsquo;ve already reduced the JOINs, but the problem hasn&amp;rsquo;t
disappeared.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Environment: PostgreSQL on managed cloud.&lt;br&gt;
Main table: &lt;code&gt;payment_report&lt;/code&gt; (~6 million rows, 3 GB).&lt;br&gt;
Searched column: &lt;code&gt;reference_code&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Problematic query:&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="-first-observation-the-joins-were-not-the-problem" class="relative group"&gt;🧠 First observation: the JOINs were not the problem &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="#-first-observation-the-joins-were-not-the-problem" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I compared:&lt;/p&gt;</description></item><item><title>4 million euros, two multinationals, zero software: the true story of a failure foretold</title><link>https://ivanluminaria.com/en/posts/project-management/4-milioni-nessun-software/</link><pubDate>Tue, 30 Dec 2025 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/project-management/4-milioni-nessun-software/</guid><description>&lt;p&gt;The story I&amp;rsquo;m about to tell is true. I won&amp;rsquo;t name names — not out of diplomacy, but because names don&amp;rsquo;t matter. What matters is understanding the mechanism. Because this mechanism repeats itself, identically, in dozens of companies. And it costs millions.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-the-client-an-insurance-group-with-a-legitimate-ambition" class="relative group"&gt;🏢 The client: an insurance group with a legitimate ambition &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="#-the-client-an-insurance-group-with-a-legitimate-ambition" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A solid company in the insurance sector. Operations in Italy, France, Northern European countries, Spain. Thousands of employees, millions of policies under management, a growing business.&lt;/p&gt;</description></item><item><title>Oracle Partitioning: when 2 billion rows no longer fit in a query</title><link>https://ivanluminaria.com/en/posts/oracle/oracle-partitioning/</link><pubDate>Tue, 23 Dec 2025 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/oracle/oracle-partitioning/</guid><description>&lt;p&gt;Two billion rows. You do not reach that number in a day. It takes years of transactions, movements, daily records piling up. And for all that time the database works, queries respond, reports come out. Then one day someone opens a ticket: &amp;ldquo;the monthly report takes four hours.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Four hours. For a report that six months earlier took twenty minutes.&lt;/p&gt;
&lt;p&gt;It is not a bug. It is not a network issue or slow storage. It is the physics of data: when a table grows beyond a certain threshold, the approaches that worked stop working. And if you did not design the structure to handle that growth, the database does the only thing it can: read everything.&lt;/p&gt;</description></item><item><title>From Single Instance to Data Guard: The Day the CEO Understood DR</title><link>https://ivanluminaria.com/en/posts/oracle/oracle-data-guard/</link><pubDate>Tue, 16 Dec 2025 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/oracle/oracle-data-guard/</guid><description>&lt;p&gt;The client was a mid-sized insurance company. Three hundred employees, an in-house management application running on Oracle 19c, a single physical server in the ground-floor server room. No replica. No standby. No disaster recovery plan.&lt;/p&gt;
&lt;p&gt;For five years everything had worked. And when things work, nobody wants to spend money protecting against problems they&amp;rsquo;ve never seen.&lt;/p&gt;
&lt;h2 id="the-day-everything-stopped" class="relative group"&gt;The day everything stopped &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="#the-day-everything-stopped" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;On a Wednesday morning in November, at 8:47 AM, the primary data group&amp;rsquo;s disk suffered a hardware failure. Not a logical error, not a recoverable corruption. A physical failure. The RAID controller lost two disks simultaneously — one had been degraded for weeks without anyone noticing, the other gave out suddenly.&lt;/p&gt;</description></item><item><title>SCD Type 2: the history the business didn't know it needed</title><link>https://ivanluminaria.com/en/posts/data-warehouse/scd-tipo-2/</link><pubDate>Tue, 11 Nov 2025 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/data-warehouse/scd-tipo-2/</guid><description>&lt;p&gt;The sales director shows up at the Monday morning meeting with a simple question: &amp;ldquo;How many customers did we have in the North region last June?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The DWH&amp;rsquo;s answer: silence.&lt;/p&gt;
&lt;p&gt;Not because the system was down, or the table was missing. The data was there, technically. But it was wrong. The DWH returned the customers currently in the North region — not the ones that were there in June. Because every night, the loading process overwrote the customer master data with current values, erasing any trace of what came before.&lt;/p&gt;</description></item><item><title>MySQL Multi-Instance: A Ticket, a CSV and the secure-file-priv Wall</title><link>https://ivanluminaria.com/en/posts/mysql/mysql-multi-istanza-secure-file-priv/</link><pubDate>Tue, 04 Nov 2025 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/mysql/mysql-multi-istanza-secure-file-priv/</guid><description>&lt;p&gt;The ticket said: &amp;ldquo;We need a CSV export from the orders table in the ERP database. By 2 PM.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;It was 11 AM. Three hours for a SELECT with INTO OUTFILE — a five-minute job, I thought. Then I opened the VPN, connected to the server and realized five minutes were not going to cut it.&lt;/p&gt;
&lt;p&gt;The server was a CentOS 7 box running four MySQL instances. Four. On the same host, with four different &lt;span class="glossary-tip" tabindex="0" data-glossary-desc="Linux init system and service manager, used to manage multiple MySQL/MariaDB instances on the same server through separate unit files." data-glossary-url="https://ivanluminaria.com/en/glossary/systemd/" data-glossary-more="Read more →"&gt;systemd&lt;/span&gt;
 services, four different ports, four different Unix sockets, four different data directories. A setup someone had put together years earlier — probably to save on a second server — and that no one had touched or documented since.&lt;/p&gt;</description></item><item><title>EXPLAIN ANALYZE is not enough: how to actually read a PostgreSQL execution plan</title><link>https://ivanluminaria.com/en/posts/postgresql/explain-analyze-postgresql/</link><pubDate>Tue, 28 Oct 2025 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/postgresql/explain-analyze-postgresql/</guid><description>&lt;p&gt;The other day a colleague sends me a screenshot on Teams. A query running on a 2-million-row table, 45 seconds execution time. He writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;I ran EXPLAIN ANALYZE, but I can&amp;rsquo;t figure out what&amp;rsquo;s wrong. The plan looks fine.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Spoiler: the plan was anything but fine. The optimizer had chosen a &lt;span class="glossary-tip" tabindex="0" data-glossary-desc="Nested Loop Join — the join strategy that scans the inner table for each row of the outer table, ideal for small datasets with an index." data-glossary-url="https://ivanluminaria.com/en/glossary/nested-loop/" data-glossary-more="Read more →"&gt;nested loop&lt;/span&gt;
 join where a &lt;span class="glossary-tip" tabindex="0" data-glossary-desc="Hash Join — a join strategy optimized for large data volumes, based on a hash table built in memory." data-glossary-url="https://ivanluminaria.com/en/glossary/hash-join/" data-glossary-more="Read more →"&gt;hash join&lt;/span&gt;
 was needed, and the reason was trivial — stale statistics. But to get there I had to read the plan line by line, and that&amp;rsquo;s when I realized that most DBAs I know use EXPLAIN ANALYZE as a binary oracle: if the time is high, the query is slow. End of analysis.&lt;/p&gt;</description></item><item><title>Wrong grain: when the fact table can't answer the right questions</title><link>https://ivanluminaria.com/en/posts/data-warehouse/fatto-grana-sbagliata/</link><pubDate>Tue, 21 Oct 2025 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/data-warehouse/fatto-grana-sbagliata/</guid><description>&lt;p&gt;The meeting had started well. The sales director of an industrial distribution company — around sixty million in revenue, three thousand active customers, a catalog of twelve thousand SKUs — had opened the new data warehouse presentation with a smile. The numbers matched, the dashboards were polished, the monthly totals by agent and territory reconciled with accounting.&lt;/p&gt;
&lt;p&gt;Then someone asked the wrong question. Or rather, the right one.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Can I see what customer Bianchi purchased in March, line by line, product by product?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Full disk on a MySQL cluster: binary logs, Group Replication, and a migration that leaves no room for mistakes</title><link>https://ivanluminaria.com/en/posts/mysql/mysql-group-replication-binlog-migration/</link><pubDate>Tue, 14 Oct 2025 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/en/posts/mysql/mysql-group-replication-binlog-migration/</guid><description>&lt;p&gt;The alert came on a Monday morning, wedged between three meetings and a coffee that was still hot. &amp;ldquo;Filesystem /mysql at 85% on the primary node.&amp;rdquo; On another node it was 66%, on the third 25%. In a cluster, when the numbers don&amp;rsquo;t match across nodes, there&amp;rsquo;s always something going on underneath.&lt;/p&gt;
&lt;p&gt;The first question that comes to mind is &amp;ldquo;how much space do we need?&amp;rdquo; But that&amp;rsquo;s the wrong question. The right one is: &amp;ldquo;why is it filling up?&amp;rdquo;&lt;/p&gt;</description></item><item><title>Additive Measure</title><link>https://ivanluminaria.com/en/glossary/additive-measure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/additive-measure/</guid><description>&lt;p&gt;An &lt;strong&gt;additive measure&lt;/strong&gt; is a numeric value in a fact table that can be legitimately summed across any dimension: by customer, by product, by period, by territory.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Measures in fact tables fall into three categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Additive&lt;/strong&gt;: can be summed across all dimensions (e.g., sales amount, quantity, cost). The most common and most useful&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Semi-additive&lt;/strong&gt;: can be summed across some dimensions but not across time (e.g., account balance: summable by branch, not by month)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Non-additive&lt;/strong&gt;: cannot be summed at all (e.g., percentages, ratios, pre-calculated averages)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-its-for" class="relative group"&gt;What it&amp;rsquo;s for &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="#what-its-for" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Additive measures are the heart of every fact table because they enable the aggregations that the business requires: totals by period, by region, by product. The key rule: always store atomic values (the detail), never aggregates. From a line-level amount you can derive the monthly total; from a monthly total you cannot reconstruct the individual lines.&lt;/p&gt;</description></item><item><title>AI Manager</title><link>https://ivanluminaria.com/en/glossary/ai-manager/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/ai-manager/</guid><description>&lt;p&gt;The &lt;strong&gt;AI Manager&lt;/strong&gt; is the professional role that governs the introduction and use of artificial intelligence within a project or organization. They are not the one who uses AI — they are the one who decides where, how, and with what precautions to integrate it into existing architectures.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The AI Manager answers questions no model can answer: where does AI generate real value and where does it generate only enthusiasm? How much does it cost to maintain, not just implement? What happens when the model is wrong? How does it integrate with mission-critical architectures without compromising stability?&lt;/p&gt;</description></item><item><title>ANALYZE</title><link>https://ivanluminaria.com/en/glossary/postgresql-analyze/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/postgresql-analyze/</guid><description>&lt;p&gt;&lt;strong&gt;ANALYZE&lt;/strong&gt; is the PostgreSQL command that collects statistics about data distribution in tables and stores them in the &lt;code&gt;pg_statistic&lt;/code&gt; catalog (readable through the &lt;code&gt;pg_stats&lt;/code&gt; view). The optimizer uses these statistics to estimate cardinality — how many rows each operation will return — and choose the most efficient execution plan.&lt;/p&gt;
&lt;h2 id="what-it-collects" class="relative group"&gt;What it collects &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="#what-it-collects" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The statistics collected by ANALYZE include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Most common values&lt;/strong&gt;: the most frequent values for each column and their percentage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distribution histograms&lt;/strong&gt;: how the remaining values are distributed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Number of distinct values&lt;/strong&gt;: how many unique values each column has&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NULL percentage&lt;/strong&gt;: how many rows have NULL for each column&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The quality of these statistics depends on the number of samples collected, controlled by the &lt;code&gt;default_statistics_target&lt;/code&gt; parameter.&lt;/p&gt;</description></item><item><title>Anonymous User</title><link>https://ivanluminaria.com/en/glossary/anonymous-user/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/anonymous-user/</guid><description>&lt;p&gt;The &lt;strong&gt;Anonymous User&lt;/strong&gt; is a MySQL/MariaDB account with an empty username (&lt;code&gt;''@'localhost'&lt;/code&gt;) that is automatically created during installation. It has no name and often no password.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When a user connects, MySQL looks for the most specific match in the &lt;code&gt;mysql.user&lt;/code&gt; table. The anonymous user &lt;code&gt;''@'localhost'&lt;/code&gt; is more specific than &lt;code&gt;'mario'@'%'&lt;/code&gt; for a connection from localhost, because &lt;code&gt;'localhost'&lt;/code&gt; beats &lt;code&gt;'%'&lt;/code&gt; in the specificity hierarchy. Consequently, Mario connecting locally gets authenticated as the anonymous user and loses all his privileges.&lt;/p&gt;</description></item><item><title>ASH</title><link>https://ivanluminaria.com/en/glossary/ash/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/ash/</guid><description>&lt;p&gt;&lt;strong&gt;ASH&lt;/strong&gt; (Active Session History) is an Oracle Database component that samples the state of every active session once per second and stores the data in an in-memory circular buffer (the &lt;code&gt;V$ACTIVE_SESSION_HISTORY&lt;/code&gt; view).&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Every second Oracle records for each active session:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Currently executing SQL (&lt;code&gt;SQL_ID&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Current wait event&lt;/li&gt;
&lt;li&gt;Calling program and module&lt;/li&gt;
&lt;li&gt;Execution plan in use (&lt;code&gt;SQL_PLAN_HASH_VALUE&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Older data is automatically flushed to AWR tables (&lt;code&gt;DBA_HIST_ACTIVE_SESS_HISTORY&lt;/code&gt;) and retained for the configured period.&lt;/p&gt;</description></item><item><title>Authentication Plugin</title><link>https://ivanluminaria.com/en/glossary/authentication-plugin/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/authentication-plugin/</guid><description>&lt;p&gt;An &lt;strong&gt;Authentication Plugin&lt;/strong&gt; is the module that MySQL or MariaDB uses to verify a user&amp;rsquo;s credentials at connection time. Every user in the system is associated with a specific plugin that determines how the password is hashed, transmitted and verified.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The main plugins are: &lt;code&gt;mysql_native_password&lt;/code&gt; (default in MySQL 5.7 and MariaDB), which uses a double SHA1 hash; &lt;code&gt;caching_sha2_password&lt;/code&gt; (default in MySQL 8.0+), which uses SHA-256 with caching to improve security and performance. When a client connects, it must support the plugin of the user it&amp;rsquo;s trying to authenticate to.&lt;/p&gt;</description></item><item><title>Autovacuum</title><link>https://ivanluminaria.com/en/glossary/autovacuum/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/autovacuum/</guid><description>&lt;p&gt;&lt;strong&gt;Autovacuum&lt;/strong&gt; is a PostgreSQL daemon that automatically runs VACUUM and ANALYZE on tables when the number of dead tuples exceeds a threshold calculated as: &lt;code&gt;threshold + scale_factor × n_live_tup&lt;/code&gt;. With defaults (threshold=50, scale_factor=0.2), on a table with 10 million rows it triggers after 2 million dead tuples.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The daemon periodically checks &lt;code&gt;pg_stat_user_tables&lt;/code&gt; and launches a worker for each table exceeding the threshold. The maximum number of simultaneous workers is controlled by &lt;code&gt;autovacuum_max_workers&lt;/code&gt; (default 3). The &lt;code&gt;autovacuum_vacuum_cost_delay&lt;/code&gt; parameter controls how much vacuum throttles itself to avoid overloading I/O.&lt;/p&gt;</description></item><item><title>AWR</title><link>https://ivanluminaria.com/en/glossary/awr/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/awr/</guid><description>&lt;p&gt;&lt;strong&gt;AWR&lt;/strong&gt; (Automatic Workload Repository) is a built-in Oracle Database component that automatically collects system performance statistics at regular intervals (every 60 minutes by default) and retains them for a configurable period.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;AWR captures periodic snapshots that include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Session statistics and wait events&lt;/li&gt;
&lt;li&gt;SQL metrics (top SQL by execution time, I/O, CPU)&lt;/li&gt;
&lt;li&gt;Memory structure statistics (SGA, PGA)&lt;/li&gt;
&lt;li&gt;I/O statistics by datafile and tablespace&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-its-for" class="relative group"&gt;What it&amp;rsquo;s for &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="#what-its-for" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The AWR report is the primary tool for diagnosing performance issues in Oracle. By comparing two snapshots you can identify:&lt;/p&gt;</description></item><item><title>B-Tree</title><link>https://ivanluminaria.com/en/glossary/b-tree/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/b-tree/</guid><description>&lt;p&gt;&lt;strong&gt;B-Tree&lt;/strong&gt; (Balanced Tree) is the most common data structure for indexes in relational databases and is the default index type in PostgreSQL, MySQL and Oracle. It maintains data sorted in a balanced tree structure that guarantees logarithmic search times.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A B-Tree organises keys in sorted nodes, with each node containing pointers to child nodes. Search starts from the root and descends to the leaves, halving the search space at each level. For a table with 6 million rows, a B-Tree typically requires 3-4 levels of depth, meaning 3-4 page reads to find a value.&lt;/p&gt;</description></item><item><title>Binary log</title><link>https://ivanluminaria.com/en/glossary/binary-log/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/binary-log/</guid><description>&lt;p&gt;The &lt;strong&gt;binary log&lt;/strong&gt; (or binlog) is a sequential binary-format record where MySQL writes all events that modify data: INSERT, UPDATE, DELETE and DDL operations. Files are numbered progressively (&lt;code&gt;mysql-bin.000001&lt;/code&gt;, &lt;code&gt;mysql-bin.000002&lt;/code&gt;, etc.) and managed through an index file.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;From MySQL 8.0, binary logging is enabled by default via the &lt;code&gt;log_bin&lt;/code&gt; parameter. MySQL creates a new binlog file when the server starts, when the current file reaches &lt;code&gt;max_binlog_size&lt;/code&gt;, or when &lt;code&gt;FLUSH BINARY LOGS&lt;/code&gt; is executed. It supports three recording formats: STATEMENT (records SQL statements), ROW (records row-level changes) and MIXED (automatic choice).&lt;/p&gt;</description></item><item><title>Bloat</title><link>https://ivanluminaria.com/en/glossary/bloat/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/bloat/</guid><description>&lt;p&gt;&lt;strong&gt;Bloat&lt;/strong&gt; is the accumulation of dead space within a PostgreSQL table or index, caused by dead tuples not yet removed by VACUUM. A table with 50% bloat occupies twice the necessary space and forces sequential scans to read twice as many pages.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Bloat is measured by comparing the actual table size with the expected size based on live rows. The &lt;code&gt;pgstattuple&lt;/code&gt; extension provides the &lt;code&gt;dead_tuple_percent&lt;/code&gt; field. Bloat above 20-30% is a warning sign; above 50% is an emergency.&lt;/p&gt;</description></item><item><title>Branch</title><link>https://ivanluminaria.com/en/glossary/branch/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/branch/</guid><description>&lt;p&gt;A &lt;strong&gt;Branch&lt;/strong&gt; is an independent development line in a Git repository. Each branch contains a copy of the code that can be worked on without affecting the main branch or other developers&amp;rsquo; work.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When a developer creates a branch (e.g. &lt;code&gt;fix/issue-234-calculation-error&lt;/code&gt;), Git creates a pointer to the current code version. From that point, changes made on the branch remain isolated. When work is complete, changes are proposed to the team via Pull Request and, after approval, merged into the main branch.&lt;/p&gt;</description></item><item><title>Brompton</title><link>https://ivanluminaria.com/en/glossary/brompton/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/brompton/</guid><description>&lt;p&gt;The &lt;strong&gt;Brompton&lt;/strong&gt; is a folding bicycle made in London since 1975, considered the world reference in its category. It folds in 10-20 seconds to approximately 58×56×27 cm — compact enough to fit under a desk or in a small car&amp;rsquo;s trunk.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The patented mechanism allows folding the bike in three moves: frame, handlebars, and saddle. In the electric version (Brompton Electric), a hub motor provides pedal assist up to 25 km/h with a range of 40-70 km. The battery is removable and charges in 4 hours.&lt;/p&gt;</description></item><item><title>BYOL</title><link>https://ivanluminaria.com/en/glossary/byol/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/byol/</guid><description>&lt;p&gt;&lt;strong&gt;BYOL&lt;/strong&gt; (Bring Your Own License) is an Oracle program that allows organizations to transfer software licenses purchased for on-premises infrastructure to Oracle Cloud Infrastructure (OCI), without having to purchase new cloud licenses.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When an organization already owns Oracle licenses — typically Enterprise Edition with options like RAC, Data Guard or Partitioning — it can &amp;ldquo;bring them along&amp;rdquo; in the migration to OCI. The support contract (Software Update License &amp;amp; Support) is maintained, and the licenses are associated with cloud resources instead of physical servers.&lt;/p&gt;</description></item><item><title>Carbon Footprint</title><link>https://ivanluminaria.com/en/glossary/carbon-footprint/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/carbon-footprint/</guid><description>&lt;p&gt;The &lt;strong&gt;Carbon Footprint&lt;/strong&gt; is the total amount of greenhouse gases — primarily CO₂ — emitted directly or indirectly by an activity, product, or individual, expressed in tonnes of CO₂ equivalent.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;For urban commuting, the calculation is direct: a car stuck in Rome traffic produces an average of 120-150 g of CO₂ per kilometer. In congested traffic even more, because the engine idles consuming fuel without moving. A bicycle produces zero direct emissions.&lt;/p&gt;</description></item><item><title>CDC</title><link>https://ivanluminaria.com/en/glossary/cdc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/cdc/</guid><description>&lt;p&gt;&lt;strong&gt;CDC&lt;/strong&gt; (Change Data Capture) is a technique for intercepting data changes (INSERT, UPDATE, DELETE) as they occur and propagating them to other systems in real time or near-real time. Unlike traditional batch approaches (periodic ETL), CDC captures changes continuously and incrementally.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The most common approach is &lt;strong&gt;log-based CDC&lt;/strong&gt;: an external component reads the database&amp;rsquo;s transaction logs (binary log in MySQL, WAL in PostgreSQL, redo log in Oracle) and converts events into a data stream consumable by other systems. Tools like Debezium, Maxwell and Canal implement this approach for MySQL by reading binary logs directly.&lt;/p&gt;</description></item><item><title>Churn</title><link>https://ivanluminaria.com/en/glossary/churn/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/churn/</guid><description>&lt;p&gt;A table&amp;rsquo;s &lt;strong&gt;churn&lt;/strong&gt; is the measure of how much its data changes after insertion. A high-churn table undergoes frequent UPDATEs and DELETEs; a low-churn table is predominantly append-only (INSERT only).&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In PostgreSQL, every UPDATE creates a new row version (due to the MVCC model) and the old version becomes a dead tuple. DELETEs also create dead tuples. The higher the churn, the more work VACUUM and indexes must do to maintain performance. A GIN index on a high-churn table can significantly degrade write performance.&lt;/p&gt;</description></item><item><title>COALESCE</title><link>https://ivanluminaria.com/en/glossary/coalesce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/coalesce/</guid><description>&lt;p&gt;&lt;strong&gt;COALESCE&lt;/strong&gt; is a standard SQL function that accepts a list of expressions and returns the first one that is not NULL. If all expressions are NULL, it returns NULL.&lt;/p&gt;
&lt;h2 id="syntax" class="relative group"&gt;Syntax &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="#syntax" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&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="n"&gt;COALESCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expression1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;expression2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;expression3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &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;p&gt;It&amp;rsquo;s equivalent to a CASE WHEN chain:&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;CASE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;expression1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;expression1&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;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;expression2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;expression2&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;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;expression3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;expression3&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;ELSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;END&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;h2 id="use-in-hierarchies" class="relative group"&gt;Use in hierarchies &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="#use-in-hierarchies" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In the context of ragged hierarchies, COALESCE is often used to fill missing levels:&lt;/p&gt;</description></item><item><title>Code Review</title><link>https://ivanluminaria.com/en/glossary/code-review/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/code-review/</guid><description>&lt;p&gt;&lt;strong&gt;Code Review&lt;/strong&gt; is the practice where a colleague examines code written by another developer before it is incorporated into the main branch. On GitHub it happens inside Pull Requests.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The developer opens a Pull Request with their changes. An assigned reviewer examines the code diff, leaves comments, suggests improvements and eventually approves or requests changes. The process is asynchronous: no meetings needed, the review happens on the tool. Only after approval is the code merged into the main branch.&lt;/p&gt;</description></item><item><title>Commuting</title><link>https://ivanluminaria.com/en/glossary/pendolarismo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/pendolarismo/</guid><description>&lt;p&gt;&lt;strong&gt;Commuting&lt;/strong&gt; is the daily travel between home and workplace. In large Italian cities like Rome, the average commute absorbs 2-4 hours per day, with direct costs (fuel, parking, public transport) and indirect costs (stress, fatigue, lost productivity).&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;An IT consultant living 30 km from the office in Rome may spend 1h15-2h30 just for the one-way trip. Over 220 working days, that is 47-89 hours lost per month — up to two working weeks spent in the car producing nothing.&lt;/p&gt;</description></item><item><title>Compliance</title><link>https://ivanluminaria.com/en/glossary/compliance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/compliance/</guid><description>&lt;p&gt;&lt;strong&gt;Compliance&lt;/strong&gt; (regulatory compliance) is an organization&amp;rsquo;s adherence to the laws, regulations, and industry standards applicable to its activity. In the AI context, it includes GDPR, banking regulations (SOX, PCI-DSS), healthcare regulations, and internal policies on data usage.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Compliance is verified through audits, document reviews, and continuous monitoring. For AI projects, it requires traceability of data used for training, documentation of automated decisions, and the ability to explain how the model arrived at a given output (explainability).&lt;/p&gt;</description></item><item><title>CTAS</title><link>https://ivanluminaria.com/en/glossary/ctas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/ctas/</guid><description>&lt;p&gt;&lt;strong&gt;CTAS&lt;/strong&gt; (Create Table As Select) is an Oracle SQL command that creates a new table and populates it in a single operation with the results of a SELECT. It is the standard technique for migrating data from one structure to another on large tables.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The command combines DDL and DML: it creates the table with the structure derived from the SELECT and inserts the data in a single pass. With the &lt;code&gt;PARALLEL&lt;/code&gt; hint and &lt;code&gt;NOLOGGING&lt;/code&gt; mode, copying hundreds of GB can complete in a few hours. After the copy, the original table is renamed, the new one takes its place, and downtime is limited to the few seconds of the rename.&lt;/p&gt;</description></item><item><title>Cutover</title><link>https://ivanluminaria.com/en/glossary/cutover/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/cutover/</guid><description>&lt;p&gt;The &lt;strong&gt;cutover&lt;/strong&gt; is the moment when a production system is moved from the old infrastructure to the new one. It&amp;rsquo;s the most visible phase of a migration — the one everyone remembers, for better or worse.&lt;/p&gt;
&lt;h2 id="anatomy-of-a-cutover" class="relative group"&gt;Anatomy of a cutover &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="#anatomy-of-a-cutover" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A well-planned cutover follows a detailed runbook with numbered steps, estimated times, success criteria and rollback procedures for each step. Typical components:&lt;/p&gt;</description></item><item><title>Daily Standup</title><link>https://ivanluminaria.com/en/glossary/daily-standup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/daily-standup/</guid><description>&lt;p&gt;The &lt;strong&gt;Daily Standup&lt;/strong&gt; is a brief daily meeting (maximum 15 minutes) where each team member answers three questions: what I did yesterday, what I will do today, is anything blocking me. The purpose is to synchronize the team, not to solve problems.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Each person has about two minutes for their update. Problems are flagged but not discussed: resolution happens afterwards, between the people involved. The time constraint is what makes the standup effective — without it, it degenerates into a 45-minute status meeting.&lt;/p&gt;</description></item><item><title>Data Governance</title><link>https://ivanluminaria.com/en/glossary/data-governance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/data-governance/</guid><description>&lt;p&gt;&lt;strong&gt;Data Governance&lt;/strong&gt; is the set of policies, processes, roles, and standards an organization adopts to ensure its data is accurate, secure, compliant with regulations, and used consistently.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;It defines who is responsible for data (data owner, data steward), what quality rules to apply, how to classify data by sensitivity, and how to trace its provenance (data lineage). In an AI context, it also includes verifying the provenance and quality of data used for model training.&lt;/p&gt;</description></item><item><title>Data Guard</title><link>https://ivanluminaria.com/en/glossary/data-guard/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/data-guard/</guid><description>&lt;p&gt;&lt;strong&gt;Data Guard&lt;/strong&gt; is Oracle&amp;rsquo;s technology for maintaining one or more synchronized copies (standby) of a production database (primary). The standby continuously receives and applies redo logs generated by the primary, staying aligned in real time or near-real time.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The primary generates redo logs with every transaction. These logs are transmitted to the standby over the network, where they are applied in one of two ways:&lt;/p&gt;</description></item><item><title>Data Warehouse</title><link>https://ivanluminaria.com/en/glossary/data-warehouse/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/data-warehouse/</guid><description>&lt;p&gt;A &lt;strong&gt;Data Warehouse&lt;/strong&gt; (DWH) is a data storage system specifically designed for analysis, reporting and business decision support. Unlike operational databases (OLTP), a DWH collects data from multiple sources, transforms it and organises it into structures optimised for analytical queries.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Data is extracted from source systems (ERPs, CRMs, business applications), transformed through ETL processes that clean, normalise and enrich it, and finally loaded into the DWH. The typical data model is the star schema: a central fact table with numerical measures linked to dimension tables that describe context (time, customer, product, geography).&lt;/p&gt;</description></item><item><title>Dead Tuple</title><link>https://ivanluminaria.com/en/glossary/dead-tuple/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/dead-tuple/</guid><description>&lt;p&gt;A &lt;strong&gt;Dead Tuple&lt;/strong&gt; is a row in a PostgreSQL table that has been updated (UPDATE) or deleted (DELETE) but has not yet been physically removed. It remains in the data pages, occupying disk space and slowing down scans.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When PostgreSQL executes an UPDATE, it does not overwrite the original row: it creates a new version and marks the old one as &amp;ldquo;dead.&amp;rdquo; The old row remains physically in the data page until VACUUM cleans it up. Dead tuples are the price of the MVCC model — necessary to guarantee transactional isolation.&lt;/p&gt;</description></item><item><title>DEFAULT PRIVILEGES</title><link>https://ivanluminaria.com/en/glossary/default-privileges/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/default-privileges/</guid><description>&lt;p&gt;&lt;strong&gt;DEFAULT PRIVILEGES&lt;/strong&gt; is a PostgreSQL mechanism that allows defining in advance the privileges that will be automatically assigned to all future objects created in a schema. It is configured with the &lt;code&gt;ALTER DEFAULT PRIVILEGES&lt;/code&gt; command.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The command &lt;code&gt;ALTER DEFAULT PRIVILEGES IN SCHEMA schema1 GRANT SELECT ON TABLES TO srv_monitoring&lt;/code&gt; ensures that every new table created in &lt;code&gt;schema1&lt;/code&gt; is automatically readable by &lt;code&gt;srv_monitoring&lt;/code&gt;. Without this configuration, future tables would require a manual GRANT each time.&lt;/p&gt;</description></item><item><title>default_statistics_target</title><link>https://ivanluminaria.com/en/glossary/postgresql-default-statistics-target/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/postgresql-default-statistics-target/</guid><description>&lt;p&gt;&lt;strong&gt;default_statistics_target&lt;/strong&gt; is the PostgreSQL parameter that defines the number of samples collected by the &lt;code&gt;ANALYZE&lt;/code&gt; command to build statistics for each column. The default value is 100.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;PostgreSQL samples a certain number of values for each column and uses them to build two structures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Most common values (MCV)&lt;/strong&gt;: the list of the most frequent values, with their respective frequencies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Histogram&lt;/strong&gt;: the distribution of the remaining values, divided into equal-population buckets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;default_statistics_target&lt;/code&gt; parameter determines how many elements these structures will have. With the default value of 100, the histogram will have 100 buckets and the MCV list will contain up to 100 values.&lt;/p&gt;</description></item><item><title>Directive 2011/7/EU</title><link>https://ivanluminaria.com/en/glossary/direttiva-2011-7-ue/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/direttiva-2011-7-ue/</guid><description>&lt;p&gt;&lt;strong&gt;Directive 2011/7/EU&lt;/strong&gt; is the European regulation on late payment in commercial transactions. It establishes clear rules: standard term of 30 days, maximum 60 between businesses (with explicit agreement), 30 for public administration, and automatic late interest at the ECB rate + 8%.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The directive was transposed into Italian law through Legislative Decree 231/2002 (amended in 2012). On paper the rules exist: 30 days standard, automatic interest, flat compensation of €40 per late-paid invoice. In Italian practice it is as if they don&amp;rsquo;t exist — the average Italian DSO is 80 days, well beyond the 60-day maximum.&lt;/p&gt;</description></item><item><title>Drill-down</title><link>https://ivanluminaria.com/en/glossary/drill-down/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/drill-down/</guid><description>&lt;p&gt;&lt;strong&gt;Drill-down&lt;/strong&gt; is a report navigation operation that allows moving from an aggregated level to a more detailed level, descending through a hierarchy.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In a Top Group → Group → Client hierarchy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start at the highest level: total revenue by Top Group&lt;/li&gt;
&lt;li&gt;Click on a Top Group to see its Groups (first-level drill-down)&lt;/li&gt;
&lt;li&gt;Click on a Group to see individual Clients (second-level drill-down)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The reverse operation — going back up from detail to aggregate — is called &lt;strong&gt;drill-up&lt;/strong&gt; (or roll-up).&lt;/p&gt;</description></item><item><title>DSO</title><link>https://ivanluminaria.com/en/glossary/dso/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/dso/</guid><description>&lt;p&gt;&lt;strong&gt;DSO&lt;/strong&gt; (Days Sales Outstanding) is the metric that measures the average number of days a company takes to collect its receivables after invoicing. It is the primary indicator of payment speed in a market.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;It is calculated as: &lt;code&gt;(Trade Receivables / Revenue) × Days in Period&lt;/code&gt;. A DSO of 30 means clients pay within a month on average. In Italy the average DSO is 80 days according to the European Payment Report — nearly three times the northern European average (24-27 days).&lt;/p&gt;</description></item><item><title>ETL</title><link>https://ivanluminaria.com/en/glossary/etl/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/etl/</guid><description>&lt;p&gt;&lt;strong&gt;ETL&lt;/strong&gt; (Extract, Transform, Load) is the fundamental process through which data is moved from source systems (operational databases, files, APIs) into the data warehouse.&lt;/p&gt;
&lt;h2 id="the-three-phases" class="relative group"&gt;The three phases &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="#the-three-phases" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Extract&lt;/strong&gt;: pulling data from source systems. Can be full (complete load) or incremental (only new or changed data)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transform&lt;/strong&gt;: cleaning, validating, standardizing and enriching the data. This is where business rules are applied, dimension lookups performed, derived calculations computed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Load&lt;/strong&gt;: loading the transformed data into the data warehouse tables (fact and dimension)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="why-it-matters" class="relative group"&gt;Why it matters &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="#why-it-matters" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;ETL is the least visible but most critical part of a data warehouse. If data is extracted incompletely, transformed with incorrect rules, or loaded without checks, everything built on top — reports, dashboards, decisions — will be wrong.&lt;/p&gt;</description></item><item><title>Exchange Partition</title><link>https://ivanluminaria.com/en/glossary/exchange-partition/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/exchange-partition/</guid><description>&lt;p&gt;&lt;strong&gt;Exchange Partition&lt;/strong&gt; is an Oracle DDL operation that allows you to instantly swap the contents of a partition with those of a non-partitioned table. Not a single byte of data is moved — the operation only modifies pointers in the data dictionary.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;ALTER TABLE ... EXCHANGE PARTITION ... WITH TABLE ...&lt;/code&gt; command modifies metadata in the data dictionary so that the physical segments of the partition and the staging table swap ownership. The staging table becomes the partition and vice versa. The operation takes less than a second regardless of data volume, because it involves no physical data movement.&lt;/p&gt;</description></item><item><title>Execution Plan</title><link>https://ivanluminaria.com/en/glossary/execution-plan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/execution-plan/</guid><description>&lt;p&gt;An &lt;strong&gt;execution plan&lt;/strong&gt; is the sequence of operations the database chooses to resolve a SQL query. When you write a SELECT with JOINs, WHERE filters, and sorts, the optimizer evaluates dozens of possible strategies and picks one based on available statistics.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The plan is represented as a tree of nodes: each node is an operation (scan, join, sort, aggregate) that receives data from its child nodes and passes it to its parent. In PostgreSQL you view it with &lt;code&gt;EXPLAIN&lt;/code&gt; (estimated plan) or &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; (actual plan with real timings and row counts).&lt;/p&gt;</description></item><item><title>Facilitator</title><link>https://ivanluminaria.com/en/glossary/facilitatore/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/facilitatore/</guid><description>&lt;p&gt;The &lt;strong&gt;Facilitator&lt;/strong&gt; is the person tasked with guiding the flow of a meeting. They are not the decision-maker — they ensure that decisions get made in an orderly manner, within the allotted time, and with input from all participants.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The facilitator keeps time, manages speaking turns, cuts off-topic discussions (&amp;ldquo;I&amp;rsquo;ll note it in the parking lot, we&amp;rsquo;ll discuss it after&amp;rdquo;), and ensures the standup does not exceed 15 minutes. The role can be fixed or rotated within the team.&lt;/p&gt;</description></item><item><title>Fact table</title><link>https://ivanluminaria.com/en/glossary/fact-table/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/fact-table/</guid><description>&lt;p&gt;A &lt;strong&gt;fact table&lt;/strong&gt; is the central table of a star schema in a data warehouse. It contains numeric measures — amounts, quantities, counts, durations — and the foreign keys that connect it to dimension tables.&lt;/p&gt;
&lt;h2 id="structure" class="relative group"&gt;Structure &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="#structure" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Each row in a fact table represents a business event or transaction: a sale, a claim, a shipment, a login. Columns fall into two categories:&lt;/p&gt;</description></item><item><title>Financial Float</title><link>https://ivanluminaria.com/en/glossary/float-finanziario/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/float-finanziario/</guid><description>&lt;p&gt;The &lt;strong&gt;Financial Float&lt;/strong&gt; is the liquidity a company generates from the difference between collection times from its clients (shorter) and payment times to its suppliers (longer). It is effectively a zero-cost loan obtained at the suppliers&amp;rsquo; expense.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A consulting firm collects from the end client at 30 days but pays its consultants at 90 days. The 60-day difference generates a float: for every €100,000 in monthly revenue, the company has ~€200,000 of free liquidity it can invest or use as working capital.&lt;/p&gt;</description></item><item><title>FLUSH PRIVILEGES</title><link>https://ivanluminaria.com/en/glossary/flush-privileges/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/flush-privileges/</guid><description>&lt;p&gt;&lt;strong&gt;FLUSH PRIVILEGES&lt;/strong&gt; is a MySQL/MariaDB command that forces the server to reload the privilege tables from the &lt;code&gt;mysql&lt;/code&gt; database into memory. It makes permission changes immediately effective.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;MySQL keeps an in-memory cache of the grant tables (&lt;code&gt;mysql.user&lt;/code&gt;, &lt;code&gt;mysql.db&lt;/code&gt;, &lt;code&gt;mysql.tables_priv&lt;/code&gt;). When using &lt;code&gt;CREATE USER&lt;/code&gt; and &lt;code&gt;GRANT&lt;/code&gt;, MySQL updates both the tables and the cache automatically. But if grant tables are modified directly with &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt; or &lt;code&gt;DELETE&lt;/code&gt;, the cache is not updated. &lt;code&gt;FLUSH PRIVILEGES&lt;/code&gt; forces a cache reload from the tables.&lt;/p&gt;</description></item><item><title>Folding Bike</title><link>https://ivanluminaria.com/en/glossary/bicicletta-pieghevole/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/bicicletta-pieghevole/</guid><description>&lt;p&gt;A &lt;strong&gt;Folding Bike&lt;/strong&gt; is a bicycle designed to fold into compact dimensions (typically 60×55×25 cm) in seconds, becoming transportable as luggage. The Brompton is the best-known model, with a folding mechanism that takes 10-20 seconds.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A system of hinges and quick releases allows folding the frame, handlebars, and pedals into a compact package. Once folded, it goes into the office under the desk, onto the metro, or into a car trunk. In the electric version, it combines the advantages of pedal assist with total portability.&lt;/p&gt;</description></item><item><title>Full Table Scan</title><link>https://ivanluminaria.com/en/glossary/full-table-scan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/full-table-scan/</guid><description>&lt;p&gt;&lt;strong&gt;Full Table Scan&lt;/strong&gt; (or TABLE ACCESS FULL) is an operation where the database reads every data block of a table, from start to finish, without going through any index.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Oracle requests blocks from disk (or cache) sequentially, using multi-block reads (&lt;code&gt;db file scattered read&lt;/code&gt;). Every row in the table is examined, regardless of whether it matches the query criteria.&lt;/p&gt;</description></item><item><title>GIN Index</title><link>https://ivanluminaria.com/en/glossary/gin-index/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/gin-index/</guid><description>&lt;p&gt;A &lt;strong&gt;GIN Index&lt;/strong&gt; (Generalized Inverted Index) is a PostgreSQL index type designed for indexing composite values: arrays, JSONB documents, text with trigrams and full-text searches. Unlike B-Tree, a GIN creates an inverted mapping: from each element (word, trigram, JSON key) to the records containing it.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;For each distinct value in the indexed data, GIN maintains a list of pointers to the rows containing that value. In the case of &lt;code&gt;pg_trgm&lt;/code&gt;, text is decomposed into trigrams (3-character sequences) and each trigram is indexed. A &lt;code&gt;LIKE '%ABC%'&lt;/code&gt; search is translated into a trigram intersection, avoiding sequential scanning.&lt;/p&gt;</description></item><item><title>Grain</title><link>https://ivanluminaria.com/en/glossary/grain/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/grain/</guid><description>&lt;p&gt;The &lt;strong&gt;grain&lt;/strong&gt; (granularity) is the level of detail of a fact table in a data warehouse. It defines what a single row represents: a transaction, a daily summary, a monthly total, an invoice line.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Choosing the grain is the first decision when designing a fact table. Every other choice — measures, dimensions, ETL — follows from it:&lt;/p&gt;</description></item><item><title>GRANT</title><link>https://ivanluminaria.com/en/glossary/grant/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/grant/</guid><description>&lt;p&gt;&lt;strong&gt;GRANT&lt;/strong&gt; is the SQL command used to assign privileges to a user or role on specific database objects. In MySQL and MariaDB, privileges are assigned to the &lt;code&gt;'user'@'host'&lt;/code&gt; pair, not just the username.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The basic syntax is &lt;code&gt;GRANT &amp;lt;privileges&amp;gt; ON &amp;lt;database&amp;gt;.&amp;lt;table&amp;gt; TO 'user'@'host'&lt;/code&gt;. Privileges can be granular (SELECT, INSERT, UPDATE, DELETE) or global (ALL PRIVILEGES). In MySQL 8, GRANT no longer creates users implicitly: an explicit &lt;code&gt;CREATE USER&lt;/code&gt; is needed first, then GRANT. In MySQL 5.7 and MariaDB, GRANT with &lt;code&gt;IDENTIFIED BY&lt;/code&gt; creates the user and assigns privileges in a single command.&lt;/p&gt;</description></item><item><title>Group Replication</title><link>https://ivanluminaria.com/en/glossary/group-replication/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/group-replication/</guid><description>&lt;p&gt;&lt;strong&gt;Group Replication&lt;/strong&gt; is MySQL&amp;rsquo;s native mechanism for creating high-availability clusters with synchronous replication across multiple nodes. Unlike classic replication (asynchronous, master-slave), Group Replication ensures every transaction is confirmed by a majority of nodes before being considered committed.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Nodes communicate via a group protocol (GCS — Group Communication System) that handles distributed consensus. Each node maintains a full copy of the data. Transactions are certified by the group: if there are no conflicts, they are applied on all nodes. If a conflict arises, the transaction is rolled back on the originating node.&lt;/p&gt;</description></item><item><title>GTID</title><link>https://ivanluminaria.com/en/glossary/gtid/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/gtid/</guid><description>&lt;p&gt;&lt;strong&gt;GTID&lt;/strong&gt; (Global Transaction Identifier) is a unique identifier automatically assigned to every committed transaction on a MySQL server. The format is &lt;code&gt;server_uuid:transaction_id&lt;/code&gt; — for example &lt;code&gt;3E11FA47-71CA-11E1-9E33-C80AA9429562:23&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When GTID is enabled (&lt;code&gt;gtid_mode = ON&lt;/code&gt;), every transaction receives an identifier that makes it traceable across any server in the replication cluster. The replica knows exactly which transactions it has already executed and which ones it still needs, without having to manually specify binlog positions (file + offset).&lt;/p&gt;</description></item><item><title>Hash Join</title><link>https://ivanluminaria.com/en/glossary/hash-join/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/hash-join/</guid><description>&lt;p&gt;&lt;strong&gt;Hash join&lt;/strong&gt; is a join strategy designed for large data volumes. It works in two phases: first it builds a data structure in memory, then uses it to find matches efficiently.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The database reads the smaller table (build side) and builds a hash table in memory, indexing rows by the join column. Then it scans the larger table (probe side) and for each row looks up the match in the hash table with an O(1) lookup.&lt;/p&gt;</description></item><item><title>Hot Desk</title><link>https://ivanluminaria.com/en/glossary/hot-desk/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/hot-desk/</guid><description>&lt;p&gt;&lt;strong&gt;Hot Desk&lt;/strong&gt; (hot desking) is a workspace organization model where desks are not assigned to individual employees. Whoever comes to the office takes an available workstation, typically bookable through a digital system.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Instead of 50 fixed workstations for 50 employees, the company sets up 15-20 shared workstations (hot desks) equipped with monitors, docking stations, and connectivity. Employees book a workstation on the days they need to be in the office, using the other days for remote work.&lt;/p&gt;</description></item><item><title>Huge Pages</title><link>https://ivanluminaria.com/en/glossary/huge-pages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/huge-pages/</guid><description>&lt;p&gt;&lt;strong&gt;Huge Pages&lt;/strong&gt; are 2 MB memory pages, compared to Linux&amp;rsquo;s standard 4 KB. For a 64 GB Oracle SGA, switching from 4 KB pages (16.7 million pages) to 2 MB Huge Pages (32,768 pages) reduces the number of Page Table entries by a factor of 500.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;They are configured via the kernel parameter &lt;code&gt;vm.nr_hugepages&lt;/code&gt; in &lt;code&gt;/etc/sysctl.d/&lt;/code&gt;. The required number is calculated by dividing the SGA size by 2 MB and adding a 1.5% margin. After restarting the Oracle instance, the SGA is allocated in Huge Pages, verifiable from &lt;code&gt;/proc/meminfo&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>I/O Scheduler</title><link>https://ivanluminaria.com/en/glossary/io-scheduler/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/io-scheduler/</guid><description>&lt;p&gt;The &lt;strong&gt;I/O Scheduler&lt;/strong&gt; is the Linux kernel component that manages the queue of read and write requests to block devices (disks). It decides the execution order of requests to optimize throughput and minimize latency.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Linux offers several schedulers: &lt;code&gt;cfq&lt;/code&gt; (Completely Fair Queuing, for desktops), &lt;code&gt;deadline&lt;/code&gt;/&lt;code&gt;mq-deadline&lt;/code&gt; (for servers and databases), &lt;code&gt;noop&lt;/code&gt;/&lt;code&gt;none&lt;/code&gt; (for SSD/NVMe). For Oracle the recommendation is &lt;code&gt;deadline&lt;/code&gt;, which serves requests minimizing disk seeks. It is configured via &lt;code&gt;/sys/block/sdX/queue/scheduler&lt;/code&gt; and made permanent via GRUB.&lt;/p&gt;</description></item><item><title>INTO OUTFILE</title><link>https://ivanluminaria.com/en/glossary/into-outfile/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/into-outfile/</guid><description>&lt;p&gt;&lt;strong&gt;INTO OUTFILE&lt;/strong&gt; is a MySQL SQL clause that allows exporting the result of a query directly to a file on the database server&amp;rsquo;s filesystem. It is the native method for generating CSV, TSV or custom-delimited files.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The clause is appended to a &lt;code&gt;SELECT&lt;/code&gt; statement and specifies the destination file path. The &lt;code&gt;FIELDS TERMINATED BY&lt;/code&gt;, &lt;code&gt;ENCLOSED BY&lt;/code&gt; and &lt;code&gt;LINES TERMINATED BY&lt;/code&gt; parameters control the output format. The file is created by the MySQL system user (not the user running the query), so it must be in a directory with the correct permissions.&lt;/p&gt;</description></item><item><title>Issue Tracker</title><link>https://ivanluminaria.com/en/glossary/issue-tracker/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/issue-tracker/</guid><description>&lt;p&gt;An &lt;strong&gt;Issue Tracker&lt;/strong&gt; is a system for recording, assigning, prioritising and monitoring bugs, feature requests and project tasks. On GitHub it is integrated directly into the code repository.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Every problem or request is created as an &amp;ldquo;issue&amp;rdquo; with a title, description, category/priority labels and assignment to a developer. Issues can be linked to branches and Pull Requests: when a PR referencing an issue is merged, the issue closes automatically. This creates complete traceability from problem to solution.&lt;/p&gt;</description></item><item><title>IST</title><link>https://ivanluminaria.com/en/glossary/ist/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/ist/</guid><description>&lt;p&gt;&lt;strong&gt;IST&lt;/strong&gt; (Incremental State Transfer) is the mechanism by which a Galera node rejoining the cluster after a brief absence receives only the missing transactions, without having to download the entire dataset.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When a node reconnects to the cluster, the donor checks whether the missing transactions are still available in its gcache (Galera cache). If the gap is covered by the gcache, an IST is performed: only the missing transactions are sent to the node, which applies them and returns to Synced state. If the gap exceeds the gcache, Galera falls back to a full SST.&lt;/p&gt;</description></item><item><title>Kimball</title><link>https://ivanluminaria.com/en/glossary/kimball/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/kimball/</guid><description>&lt;p&gt;&lt;strong&gt;Kimball&lt;/strong&gt; refers to Ralph Kimball and his data warehouse design methodology, described in &lt;em&gt;The Data Warehouse Toolkit&lt;/em&gt; (first edition 1996, third edition 2013).&lt;/p&gt;
&lt;h2 id="the-approach" class="relative group"&gt;The approach &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="#the-approach" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The Kimball methodology rests on three pillars:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dimensional modeling&lt;/strong&gt;: organizing data into star schemas with fact tables and dimension tables, optimized for analytical queries&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bottom-up&lt;/strong&gt;: building the DWH starting from individual departmental data marts, progressively integrating them through conformed dimensions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bus architecture&lt;/strong&gt;: a framework for ensuring consistency across data marts through shared dimensions and facts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="slowly-changing-dimensions" class="relative group"&gt;Slowly Changing Dimensions &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="#slowly-changing-dimensions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Kimball defined the SCD (Slowly Changing Dimension) classification into types 0 through 7, which has become the de facto industry standard. Type 2 — with surrogate keys and validity dates — is the most widely used for tracking dimension history.&lt;/p&gt;</description></item><item><title>Knowledge Transfer</title><link>https://ivanluminaria.com/en/glossary/knowledge-transfer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/knowledge-transfer/</guid><description>&lt;p&gt;&lt;strong&gt;Knowledge Transfer&lt;/strong&gt; is the process through which skills, information, and know-how are transferred from those who possess them to those who need them — between colleagues, between teams, or between people and documentation systems.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;It can be formal (documentation, training sessions, wikis) or informal (pair programming, mentoring, shadowing). AI can accelerate knowledge transfer by generating documentation from code, commits, and issues — not perfect, but sufficient to avoid losing knowledge when someone leaves the project.&lt;/p&gt;</description></item><item><title>KPI</title><link>https://ivanluminaria.com/en/glossary/kpi/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/kpi/</guid><description>&lt;p&gt;A &lt;strong&gt;KPI&lt;/strong&gt; (Key Performance Indicator) is a quantifiable metric used to evaluate the success of an activity, project, or organization against predefined objectives. In the context of remote work, KPIs replace physical presence as the indicator of productivity.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;An effective KPI is specific, measurable, and tied to a concrete objective. In IT consulting: tickets closed, code released, SLAs met, satisfied clients. Not &amp;ldquo;hours at the desk&amp;rdquo; — because hours don&amp;rsquo;t measure value produced, they only measure time spent.&lt;/p&gt;</description></item><item><title>Late Payment Interest</title><link>https://ivanluminaria.com/en/glossary/interessi-di-mora/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/interessi-di-mora/</guid><description>&lt;p&gt;&lt;strong&gt;Late Payment Interest&lt;/strong&gt; is the interest that automatically accrues on every invoice paid after the contractual due date. Under Italian Legislative Decree 231/2002 (implementing EU Directive 2011/7/EU), the rate equals the ECB rate plus 8 percentage points, without the need for formal notice.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;From the day after the invoice due date, interest accrues automatically. The creditor is also entitled to a flat compensation of €40 per late-paid invoice for recovery costs. No formal demand letter is required — the right arises from the law itself.&lt;/p&gt;</description></item><item><title>Least Privilege</title><link>https://ivanluminaria.com/en/glossary/least-privilege/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/least-privilege/</guid><description>&lt;p&gt;&lt;strong&gt;Least Privilege&lt;/strong&gt; is a fundamental information security principle: every user, process or system should have only the permissions strictly necessary to perform their function, nothing more.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In the database context, the principle is applied by assigning granular privileges: &lt;code&gt;SELECT&lt;/code&gt; if the user only needs to read, &lt;code&gt;SELECT + INSERT + UPDATE&lt;/code&gt; if they also need to write, never &lt;code&gt;ALL PRIVILEGES&lt;/code&gt; unless strictly necessary. Combined with MySQL&amp;rsquo;s &lt;code&gt;user@host&lt;/code&gt; model, the principle can also be applied based on the connection origin.&lt;/p&gt;</description></item><item><title>Lift-and-Shift</title><link>https://ivanluminaria.com/en/glossary/lift-and-shift/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/lift-and-shift/</guid><description>&lt;p&gt;&lt;strong&gt;Lift-and-Shift&lt;/strong&gt; (rehosting) is a migration strategy that consists of moving a system from one environment to another — typically from on-premises to cloud — without modifying its architecture, application code, or configuration. The system is taken as-is and &amp;ldquo;lifted and shifted.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The infrastructure is replicated in the target environment: same virtual machines, same databases, same middleware. The advantage is speed: no code rewriting, no architectural redesign. The risk is carrying over all the problems from the original environment, including inefficiencies and technical debt.&lt;/p&gt;</description></item><item><title>Local Index</title><link>https://ivanluminaria.com/en/glossary/local-index/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/local-index/</guid><description>&lt;p&gt;A &lt;strong&gt;Local Index&lt;/strong&gt; is an Oracle index created on a partitioned table, which is automatically partitioned with the same key and boundaries as the table. Each table partition has a corresponding index partition.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When an index is created with the &lt;code&gt;LOCAL&lt;/code&gt; clause, Oracle creates one index partition for each table partition. If the table has 100 monthly partitions, the index will have 100 corresponding partitions. DDL operations on a partition (DROP, TRUNCATE, SPLIT) invalidate only the corresponding index partition, not the entire index.&lt;/p&gt;</description></item><item><title>MERGE</title><link>https://ivanluminaria.com/en/glossary/merge-sql/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/merge-sql/</guid><description>&lt;p&gt;&lt;strong&gt;MERGE&lt;/strong&gt; is a SQL statement that combines INSERT and UPDATE (and optionally DELETE) operations in a single statement. If the record exists it updates it, if it doesn&amp;rsquo;t it inserts it. It&amp;rsquo;s often informally called &amp;ldquo;upsert&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="oracle-syntax" class="relative group"&gt;Oracle syntax &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="#oracle-syntax" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&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="n"&gt;MERGE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target_table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&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;USING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;source_table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&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="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;key&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;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;key&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;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MATCHED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&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="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;field&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;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;field&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;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MATCHED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;field&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;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;field&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;h2 id="use-in-data-warehousing" class="relative group"&gt;Use in data warehousing &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="#use-in-data-warehousing" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In an ETL context, MERGE is the core mechanism for loading dimension tables:&lt;/p&gt;</description></item><item><title>MVCC</title><link>https://ivanluminaria.com/en/glossary/mvcc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/mvcc/</guid><description>&lt;p&gt;&lt;strong&gt;MVCC&lt;/strong&gt; (Multi-Version Concurrency Control) is the concurrency model used by PostgreSQL to manage simultaneous data access. Every UPDATE creates a new row version and marks the old one as &amp;ldquo;dead&amp;rdquo;; every DELETE marks the row as no longer visible. Reads don&amp;rsquo;t block writes and vice versa.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Each transaction sees a consistent snapshot of the database at the moment it begins. Rows modified by other uncommitted transactions are invisible. This eliminates the need for exclusive locks on reads, enabling high concurrency — but generates &amp;ldquo;garbage&amp;rdquo; in the form of dead tuples that must be cleaned up by VACUUM.&lt;/p&gt;</description></item><item><title>mydumper</title><link>https://ivanluminaria.com/en/glossary/mydumper/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/mydumper/</guid><description>&lt;p&gt;&lt;strong&gt;mydumper&lt;/strong&gt; is an open source logical backup tool for MySQL and MariaDB that implements true parallelism: not just across different tables, but also within the same table, splitting it into chunks based on the primary key.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;mydumper connects to the MySQL server, acquires a consistent snapshot with &lt;code&gt;FLUSH TABLES WITH READ LOCK&lt;/code&gt; (or &lt;code&gt;--trx-consistency-only&lt;/code&gt; to avoid global locks on InnoDB), then distributes the work among multiple threads. Each large table is broken into chunks — by default based on primary key ranges — and each chunk is exported by a separate thread.&lt;/p&gt;</description></item><item><title>mysqlbinlog</title><link>https://ivanluminaria.com/en/glossary/mysqlbinlog/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/mysqlbinlog/</guid><description>&lt;p&gt;&lt;strong&gt;mysqlbinlog&lt;/strong&gt; is the command-line utility shipped with MySQL for reading and decoding the contents of binary log files. It is the only tool capable of converting the binary format of binlogs into readable output or re-executable SQL statements.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;mysqlbinlog reads binlog files and produces text-format output. It supports several filters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;By time range&lt;/strong&gt;: &lt;code&gt;--start-datetime&lt;/code&gt; and &lt;code&gt;--stop-datetime&lt;/code&gt; to limit output to a time window&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;By database&lt;/strong&gt;: &lt;code&gt;--database&lt;/code&gt; to filter events for a specific database&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;By position&lt;/strong&gt;: &lt;code&gt;--start-position&lt;/code&gt; and &lt;code&gt;--stop-position&lt;/code&gt; to select specific events&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With ROW format, the &lt;code&gt;--verbose&lt;/code&gt; flag decodes row-level changes into commented pseudo-SQL format, otherwise the output is an unreadable binary blob.&lt;/p&gt;</description></item><item><title>mysqldump</title><link>https://ivanluminaria.com/en/glossary/mysqldump/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/mysqldump/</guid><description>&lt;p&gt;&lt;strong&gt;mysqldump&lt;/strong&gt; is the logical backup utility included by default in every MySQL and MariaDB installation. It produces an SQL file containing all the statements (CREATE TABLE, INSERT) needed to fully rebuild a database&amp;rsquo;s schema and data.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;mysqldump connects to the MySQL server and reads tables one at a time, generating the corresponding SQL statements as output. The operation is strictly single-threaded: one table after another, one row after another. The output file can be compressed externally (gzip, zstd) but the tool itself offers no native compression.&lt;/p&gt;</description></item><item><title>mysqlpump</title><link>https://ivanluminaria.com/en/glossary/mysqlpump/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/mysqlpump/</guid><description>&lt;p&gt;&lt;strong&gt;mysqlpump&lt;/strong&gt; is the logical backup utility introduced by Oracle in MySQL 5.7 as an evolution of mysqldump. The main difference is support for table-level parallelism and native output compression (zlib, lz4, zstd).&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;mysqlpump can dump multiple tables simultaneously using parallel threads, configurable via &lt;code&gt;--default-parallelism&lt;/code&gt;. Compression is applied directly during the dump without needing external pipes to gzip. It also supports selective dumping of MySQL users and accounts.&lt;/p&gt;</description></item><item><title>Nested Loop</title><link>https://ivanluminaria.com/en/glossary/nested-loop/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/nested-loop/</guid><description>&lt;p&gt;&lt;strong&gt;Nested loop&lt;/strong&gt; is the simplest join strategy: for each row in the outer table, the database looks for matching rows in the inner table. It works like a double nested &lt;code&gt;for&lt;/code&gt; loop — hence the name.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The optimizer picks one table as &amp;ldquo;outer&amp;rdquo; and one as &amp;ldquo;inner&amp;rdquo;. For each row in the outer table, it performs a lookup in the inner table on the join column. If the inner table has an index on the join column, each lookup is a direct B-tree access. Without an index, each lookup becomes a full sequential scan.&lt;/p&gt;</description></item><item><title>NOLOGGING</title><link>https://ivanluminaria.com/en/glossary/nologging/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/nologging/</guid><description>&lt;p&gt;&lt;strong&gt;NOLOGGING&lt;/strong&gt; is an Oracle mode that disables redo log generation during bulk load operations. Operations complete much faster, but the data is not recoverable via redo in case of a crash before a backup is taken.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When a segment (table, index, partition) is in NOLOGGING mode, bulk operations like CTAS, &lt;code&gt;INSERT /*+ APPEND */&lt;/code&gt; and &lt;code&gt;ALTER TABLE MOVE&lt;/code&gt; do not write redo log for data blocks. On a 380 GB copy, this eliminates the generation of the same amount of redo, preventing archivelog area saturation and reducing times from days to hours.&lt;/p&gt;</description></item><item><title>Object Privilege</title><link>https://ivanluminaria.com/en/glossary/object-privilege/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/object-privilege/</guid><description>&lt;p&gt;An &lt;strong&gt;Object Privilege&lt;/strong&gt; in Oracle is an authorization that allows performing operations on a specific database object: a table, view, sequence, or PL/SQL procedure. Typical examples include &lt;code&gt;SELECT ON schema.table&lt;/code&gt;, &lt;code&gt;INSERT ON schema.table&lt;/code&gt;, and &lt;code&gt;EXECUTE ON schema.procedure&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Object privileges are granted with &lt;code&gt;GRANT&lt;/code&gt; specifying the operation and the target object: &lt;code&gt;GRANT SELECT ON app_owner.customers TO srv_report&lt;/code&gt;. They can be assigned to individual users or roles. Unlike system privileges, they operate on a single object and do not confer global powers over the database.&lt;/p&gt;</description></item><item><title>OCI</title><link>https://ivanluminaria.com/en/glossary/oci/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/oci/</guid><description>&lt;p&gt;&lt;strong&gt;OCI&lt;/strong&gt; (Oracle Cloud Infrastructure) is Oracle&amp;rsquo;s cloud platform, launched in its second generation in 2018. Unlike other cloud providers, OCI is natively designed for Oracle Database workloads and offers significant licensing and performance advantages.&lt;/p&gt;
&lt;h2 id="why-oci-for-oracle-database" class="relative group"&gt;Why OCI for Oracle Database &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="#why-oci-for-oracle-database" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The main advantage is licensing. On OCI, Oracle recognizes its own OCPUs (Oracle CPUs) with a 1:1 ratio for license counting purposes. On other cloud providers like AWS or Azure, the vCPU-to-license ratio is less favorable and the audit risk is real.&lt;/p&gt;</description></item><item><title>OLAP</title><link>https://ivanluminaria.com/en/glossary/olap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/olap/</guid><description>&lt;p&gt;&lt;strong&gt;OLAP&lt;/strong&gt; (Online Analytical Processing) refers to a data processing approach oriented to multidimensional analysis: aggregations, drill-down, time comparisons, slice-and-dice on large volumes of historical data.&lt;/p&gt;
&lt;h2 id="olap-vs-oltp" class="relative group"&gt;OLAP vs OLTP &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="#olap-vs-oltp" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Feature&lt;/th&gt;
 &lt;th&gt;OLAP&lt;/th&gt;
 &lt;th&gt;OLTP&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Purpose&lt;/td&gt;
 &lt;td&gt;Analysis and reporting&lt;/td&gt;
 &lt;td&gt;Operational transactions&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Data model&lt;/td&gt;
 &lt;td&gt;Star schema, denormalized&lt;/td&gt;
 &lt;td&gt;3NF, normalized&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Typical query&lt;/td&gt;
 &lt;td&gt;Aggregations over millions of rows&lt;/td&gt;
 &lt;td&gt;Read/write of a few rows&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Users&lt;/td&gt;
 &lt;td&gt;Analysts, management&lt;/td&gt;
 &lt;td&gt;Applications, operators&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Updates&lt;/td&gt;
 &lt;td&gt;Batch (periodic ETL)&lt;/td&gt;
 &lt;td&gt;Real-time&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="olap-operations" class="relative group"&gt;OLAP operations &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="#olap-operations" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The fundamental OLAP analysis operations are:&lt;/p&gt;</description></item><item><title>Outsourcing</title><link>https://ivanluminaria.com/en/glossary/outsourcing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/outsourcing/</guid><description>&lt;p&gt;&lt;strong&gt;Outsourcing&lt;/strong&gt; is the practice of entrusting the development, maintenance or management of IT systems to suppliers external to the company. It can involve complete projects (custom software development) or ongoing services (infrastructure management, application support).&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The client company defines requirements and signs a contract with an external supplier who commits to delivering the project. The most common contract models are: fixed-price (set price for defined result), time and materials (billed man-days), or hybrid. The supplier provides a team of consultants who work on the project, often with periodic staff rotation.&lt;/p&gt;</description></item><item><title>Parking Lot</title><link>https://ivanluminaria.com/en/glossary/parking-lot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/parking-lot/</guid><description>&lt;p&gt;The &lt;strong&gt;Parking Lot&lt;/strong&gt; is a visible list — on a whiteboard, shared document, or chat — where the facilitator notes topics that emerge during a meeting but cannot be discussed within the available time. Topics are &amp;ldquo;parked&amp;rdquo; and addressed after the meeting with only the people involved.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When someone raises a complex issue during a standup, the facilitator says: &amp;ldquo;I&amp;rsquo;ll note it in the parking lot, we&amp;rsquo;ll discuss it afterwards.&amp;rdquo; The topic is not ignored — it is simply moved to the right context, where it can be addressed without wasting time for those not involved.&lt;/p&gt;</description></item><item><title>Partita IVA</title><link>https://ivanluminaria.com/en/glossary/partita-iva/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/partita-iva/</guid><description>&lt;p&gt;&lt;strong&gt;Partita IVA&lt;/strong&gt; is the tax identification code assigned to self-employed workers and businesses in Italy for VAT-liable operations. In IT consulting, &amp;ldquo;working with partita IVA&amp;rdquo; means operating as a freelancer, invoicing services directly to the client.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The freelance consultant issues an invoice at the end of the work period. Payment follows contractual terms — which in Italy are typically 60-90-120 days end of month. Meanwhile, the consultant bears all expenses (social security contributions, taxes, rent, utilities) from personal funds.&lt;/p&gt;</description></item><item><title>Partition Pruning</title><link>https://ivanluminaria.com/en/glossary/partition-pruning/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/partition-pruning/</guid><description>&lt;p&gt;&lt;strong&gt;Partition Pruning&lt;/strong&gt; is the mechanism by which Oracle, during query execution on a partitioned table, automatically identifies and excludes partitions that cannot contain data relevant to the query predicate.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When a query includes a predicate on the partition column (e.g. &lt;code&gt;WHERE data_movimento BETWEEN ...&lt;/code&gt;), Oracle consults the partition metadata and determines which partitions contain data in the requested range. Only those partitions are read. In the execution plan it appears as &lt;code&gt;PARTITION RANGE SINGLE&lt;/code&gt; or &lt;code&gt;PARTITION RANGE ITERATOR&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Pedal Assist</title><link>https://ivanluminaria.com/en/glossary/pedalata-assistita/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/pedalata-assistita/</guid><description>&lt;p&gt;&lt;strong&gt;Pedal Assist&lt;/strong&gt; is an electric propulsion system mounted on a bicycle that amplifies the cyclist&amp;rsquo;s pedaling force through an electric motor. The motor activates only when pedaling and cuts off above 25 km/h (European limit).&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A sensor detects pedaling force and cadence and activates the electric motor proportionally. The harder you pedal, the more the motor helps. The result is that climbs like the Celio hill in Rome become a gentle slope, and you arrive at your destination without breaking a sweat — a crucial detail for someone who needs to show up at the office.&lt;/p&gt;</description></item><item><title>pg_stat_statements</title><link>https://ivanluminaria.com/en/glossary/pg-stat-statements/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/pg-stat-statements/</guid><description>&lt;p&gt;&lt;strong&gt;pg_stat_statements&lt;/strong&gt; is a PostgreSQL extension — included in the official distribution but not active by default — that tracks execution statistics for all SQL queries that pass through the server. Queries are normalized (literal values replaced with parameters) to group executions of the same pattern.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The extension requires loading as a shared library at server startup via the &lt;code&gt;shared_preload_libraries&lt;/code&gt; parameter. Once active, it records for each query: execution count, total and average time, rows returned, blocks read from disk and from cache. The &lt;code&gt;pg_stat_statements.max&lt;/code&gt; parameter controls how many distinct queries are tracked (default 5000).&lt;/p&gt;</description></item><item><title>pg_trgm</title><link>https://ivanluminaria.com/en/glossary/pg-trgm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/pg-trgm/</guid><description>&lt;p&gt;&lt;strong&gt;pg_trgm&lt;/strong&gt; is a PostgreSQL extension that implements trigram-based searching — sequences of three consecutive characters extracted from text. It enables the use of GIN and GiST indexes to accelerate &lt;code&gt;LIKE '%value%'&lt;/code&gt; and &lt;code&gt;ILIKE&lt;/code&gt; searches, which would otherwise require sequential scans.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The extension decomposes each string into trigrams: for example, &amp;ldquo;hello&amp;rdquo; becomes {&amp;quot; h&amp;quot;, &amp;quot; he&amp;quot;, &amp;ldquo;hel&amp;rdquo;, &amp;ldquo;ell&amp;rdquo;, &amp;ldquo;llo&amp;rdquo;, &amp;ldquo;lo &amp;ldquo;}. A GIN index with operator class &lt;code&gt;gin_trgm_ops&lt;/code&gt; indexes these trigrams. When executing a &lt;code&gt;LIKE '%ell%'&lt;/code&gt;, PostgreSQL searches for matching trigrams in the index instead of scanning the entire table.&lt;/p&gt;</description></item><item><title>PITR</title><link>https://ivanluminaria.com/en/glossary/pitr/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/pitr/</guid><description>&lt;p&gt;&lt;strong&gt;PITR&lt;/strong&gt; (Point-in-Time Recovery) is a restore technique that allows bringing a database back to any moment in time, not just the moment of the backup. It relies on combining a full backup with transaction logs (binary logs in MySQL, WAL in PostgreSQL, redo logs in Oracle).&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The process has two phases:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Backup restore&lt;/strong&gt;: the database is restored to the last available backup&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log replay&lt;/strong&gt;: transaction logs are replayed from the backup moment up to the desired point in time, excluding the event that caused the problem&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In MySQL, the &lt;code&gt;mysqlbinlog&lt;/code&gt; tool extracts events from binary logs and replays them on the restored database.&lt;/p&gt;</description></item><item><title>Presenteeism</title><link>https://ivanluminaria.com/en/glossary/presenteismo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/presenteismo/</guid><description>&lt;p&gt;&lt;strong&gt;Presenteeism&lt;/strong&gt; is the organizational culture that measures work value based on an employee&amp;rsquo;s physical presence in the office, regardless of the quality and quantity of results produced. It is the assumption that &amp;ldquo;if I can see you at your desk, you&amp;rsquo;re working.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In a presenteeist organization, being in the office from 9 to 6 matters more than closing tasks. Arriving late is a problem even if you&amp;rsquo;ve produced more than everyone else. Working from home is suspicious even if results are excellent. Control is based on sight, not metrics.&lt;/p&gt;</description></item><item><title>Pull Request</title><link>https://ivanluminaria.com/en/glossary/pull-request/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/pull-request/</guid><description>&lt;p&gt;A &lt;strong&gt;Pull Request&lt;/strong&gt; (PR) is a formal request to incorporate changes from a development branch into the repository&amp;rsquo;s main branch. It is the central collaboration mechanism on GitHub and similar platforms.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The developer works on a dedicated branch (e.g. &lt;code&gt;fix/issue-234-calculation-error&lt;/code&gt;), completes the changes, and opens a PR. The PR shows the code diff, allows colleagues to comment line by line, request changes or approve. Only after approval is the code merged into the main branch. This ensures that &amp;ldquo;good&amp;rdquo; code stays good.&lt;/p&gt;</description></item><item><title>Quorum</title><link>https://ivanluminaria.com/en/glossary/quorum/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/quorum/</guid><description>&lt;p&gt;&lt;strong&gt;Quorum&lt;/strong&gt; is the minimum number of nodes that must agree for the cluster to be considered operational. In a 3-node cluster, the quorum is 2 (the majority). If one node disconnects, the other two recognise they are the majority and continue operating normally.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Galera Cluster uses a group communication protocol that continuously checks how many nodes are reachable. The calculation is simple: quorum = (total nodes / 2) + 1. With 3 nodes the quorum is 2, with 5 nodes it&amp;rsquo;s 3. Nodes that lose quorum transition to Non-Primary state and refuse writes to avoid inconsistencies.&lt;/p&gt;</description></item><item><title>RAC</title><link>https://ivanluminaria.com/en/glossary/rac/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/rac/</guid><description>&lt;p&gt;&lt;strong&gt;RAC&lt;/strong&gt; (Real Application Clusters) is Oracle&amp;rsquo;s technology that allows multiple database instances to simultaneously access the same shared storage. If a node fails, the others continue serving requests without interruption — failover is transparent to applications.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A RAC cluster consists of two or more servers (nodes) connected via a high-speed private network (interconnect) and shared storage (typically ASM — Automatic Storage Management). Each node runs its own Oracle instance, but all access the same datafiles.&lt;/p&gt;</description></item><item><title>Ragged hierarchy</title><link>https://ivanluminaria.com/en/glossary/ragged-hierarchy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/ragged-hierarchy/</guid><description>&lt;p&gt;A &lt;strong&gt;ragged hierarchy&lt;/strong&gt; (also called unbalanced hierarchy) is a hierarchical structure where not all branches reach the same depth. Some intermediate levels are missing for certain entities.&lt;/p&gt;
&lt;h2 id="concrete-example" class="relative group"&gt;Concrete example &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="#concrete-example" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In a three-level hierarchy Top Group → Group → Client:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some clients have all three levels (complete hierarchy)&lt;/li&gt;
&lt;li&gt;Some clients have a Group but no Top Group&lt;/li&gt;
&lt;li&gt;Some clients have neither Group nor Top Group (direct clients)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result is a structure with &amp;ldquo;holes&amp;rdquo; that causes problems in aggregation reports: NULL rows, split totals, incomplete drill-downs.&lt;/p&gt;</description></item><item><title>Range Partitioning</title><link>https://ivanluminaria.com/en/glossary/range-partitioning/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/range-partitioning/</guid><description>&lt;p&gt;&lt;strong&gt;Range Partitioning&lt;/strong&gt; is a table partitioning strategy where rows are distributed across different partitions based on the value of a column relative to predefined ranges. The partition column is almost always a date in data warehouses.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Each partition is defined with a &lt;code&gt;VALUES LESS THAN&lt;/code&gt; clause that sets the upper bound of the range. Oracle automatically assigns each row to the correct partition based on the partition column value. If a row has &lt;code&gt;data_vendita = '2025-03-15'&lt;/code&gt;, it gets inserted into the partition whose range includes that date.&lt;/p&gt;</description></item><item><title>Redo Log</title><link>https://ivanluminaria.com/en/glossary/redo-log/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/redo-log/</guid><description>&lt;p&gt;&lt;strong&gt;Redo Log&lt;/strong&gt; is the mechanism by which Oracle records every data modification (INSERT, UPDATE, DELETE, DDL) before it is permanently written to the datafiles. It is the fundamental guarantee of transaction durability.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Oracle writes changes to the online redo logs sequentially and continuously. Redo logs are organized in circular groups: when one group fills up, Oracle switches to the next. When all groups have been used, Oracle returns to the first (log switch).&lt;/p&gt;</description></item><item><title>Relay log</title><link>https://ivanluminaria.com/en/glossary/relay-log/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/relay-log/</guid><description>&lt;p&gt;The &lt;strong&gt;relay log&lt;/strong&gt; is an intermediate log file present on the slave in a MySQL replication architecture. It contains events received from the master&amp;rsquo;s binary log, waiting to be executed locally by the slave&amp;rsquo;s SQL thread.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;MySQL replication flows through the relay log in three phases:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The slave&amp;rsquo;s &lt;strong&gt;I/O thread&lt;/strong&gt; connects to the master and reads the binary logs&lt;/li&gt;
&lt;li&gt;Received events are written to the local relay log&lt;/li&gt;
&lt;li&gt;The slave&amp;rsquo;s &lt;strong&gt;SQL thread&lt;/strong&gt; reads events from the relay log and executes them on the local database&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This two-thread architecture decouples data reception from data application: the slave can continue receiving events from the master even if local execution is temporarily slower.&lt;/p&gt;</description></item><item><title>REVOKE</title><link>https://ivanluminaria.com/en/glossary/revoke/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/revoke/</guid><description>&lt;p&gt;&lt;strong&gt;REVOKE&lt;/strong&gt; is the SQL command that removes privileges or roles previously assigned with &lt;code&gt;GRANT&lt;/code&gt;. It is the indispensable complement to GRANT and the primary tool for restricting permissions when a security model is restructured.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The syntax follows the same pattern as GRANT: &lt;code&gt;REVOKE SELECT ON schema.table FROM user&lt;/code&gt; or &lt;code&gt;REVOKE role FROM user&lt;/code&gt;. In Oracle, revoking a role like &lt;code&gt;DBA&lt;/code&gt; removes in one stroke all the system privileges included in that role. Before executing a critical REVOKE, it is essential to verify that the user retains the privileges necessary for their functions.&lt;/p&gt;</description></item><item><title>RMAN</title><link>https://ivanluminaria.com/en/glossary/rman/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/rman/</guid><description>&lt;p&gt;&lt;strong&gt;RMAN&lt;/strong&gt; (Recovery Manager) is Oracle&amp;rsquo;s native tool for database backup, restore and recovery. It is a command-line utility that manages all data protection operations in an integrated way with the database.&lt;/p&gt;
&lt;h2 id="what-it-does" class="relative group"&gt;What it does &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="#what-it-does" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Backup&lt;/strong&gt;: full, incremental, archived log only&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restore&lt;/strong&gt;: recovery of datafiles, tablespaces or the entire database&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recovery&lt;/strong&gt;: applying redo logs to bring the database to a specific point in time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duplicate&lt;/strong&gt;: creating database copies, including standby databases for Data Guard&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rman-and-data-guard" class="relative group"&gt;RMAN and Data Guard &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="#rman-and-data-guard" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;For standby database creation, RMAN allows &lt;code&gt;DUPLICATE ... FOR STANDBY FROM ACTIVE DATABASE&lt;/code&gt; — a direct network copy from primary to standby, with no need for intermediate tape or disk backups. The command transfers all datafiles and controlfiles and configures them automatically for replication.&lt;/p&gt;</description></item><item><title>ROI</title><link>https://ivanluminaria.com/en/glossary/roi/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/roi/</guid><description>&lt;p&gt;&lt;strong&gt;ROI&lt;/strong&gt; (Return on Investment) is the metric that measures investment return by relating net benefit to cost incurred, expressed as a percentage. A 200% ROI means every euro invested generated two euros in return.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;It is calculated as: &lt;code&gt;(Benefit - Cost) / Cost × 100&lt;/code&gt;. In the context of IT projects with AI components, ROI calculation must include not only implementation costs but also maintenance, team training, governance, and model error management costs.&lt;/p&gt;</description></item><item><title>ROLE</title><link>https://ivanluminaria.com/en/glossary/postgresql-role/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/postgresql-role/</guid><description>&lt;p&gt;In PostgreSQL, &lt;strong&gt;ROLE&lt;/strong&gt; is the only security entity. There is no distinction between &amp;ldquo;user&amp;rdquo; and &amp;ldquo;role&amp;rdquo;: everything is a ROLE. A ROLE with the &lt;code&gt;LOGIN&lt;/code&gt; attribute behaves as a user; without &lt;code&gt;LOGIN&lt;/code&gt;, it is a privilege container assignable to other ROLEs.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;CREATE USER mario&lt;/code&gt; is simply a shortcut for &lt;code&gt;CREATE ROLE mario WITH LOGIN&lt;/code&gt;. ROLEs can own objects, inherit privileges from other ROLEs through the &lt;code&gt;INHERIT&lt;/code&gt; attribute, and be used to build permission hierarchies. A &amp;ldquo;functional&amp;rdquo; ROLE (without LOGIN) groups privileges; &amp;ldquo;user&amp;rdquo; ROLEs (with LOGIN) inherit them.&lt;/p&gt;</description></item><item><title>RPO</title><link>https://ivanluminaria.com/en/glossary/rpo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/rpo/</guid><description>&lt;p&gt;&lt;strong&gt;RPO&lt;/strong&gt; (Recovery Point Objective) is the maximum amount of data an organisation can afford to lose in case of failure or disaster. It is measured in time: an RPO of 1 hour means accepting the loss of at most the last hour of transactions.&lt;/p&gt;
&lt;h2 id="how-its-determined" class="relative group"&gt;How it&amp;rsquo;s determined &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="#how-its-determined" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;RPO depends on the backup and replication strategy:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Strategy&lt;/th&gt;
 &lt;th&gt;Typical RPO&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Nightly tape backup&lt;/td&gt;
 &lt;td&gt;12-24 hours&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Backup + archived logs on remote storage&lt;/td&gt;
 &lt;td&gt;1-4 hours&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Asynchronous Data Guard (MaxPerformance)&lt;/td&gt;
 &lt;td&gt;A few seconds&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Synchronous Data Guard (MaxAvailability)&lt;/td&gt;
 &lt;td&gt;Zero&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="rpo-vs-rto" class="relative group"&gt;RPO vs RTO &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="#rpo-vs-rto" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;RPO and RTO are complementary but distinct:&lt;/p&gt;</description></item><item><title>RTO</title><link>https://ivanluminaria.com/en/glossary/rto/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/rto/</guid><description>&lt;p&gt;&lt;strong&gt;RTO&lt;/strong&gt; (Recovery Time Objective) is the maximum acceptable time to restore service after a failure or disaster. It is measured from the moment of failure to the moment the system is operational again.&lt;/p&gt;
&lt;h2 id="how-its-determined" class="relative group"&gt;How it&amp;rsquo;s determined &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="#how-its-determined" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;RTO depends on the recovery strategy and available infrastructure:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Strategy&lt;/th&gt;
 &lt;th&gt;Typical RTO&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Restore from tape backup&lt;/td&gt;
 &lt;td&gt;4-12 hours&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Restore from disk backup&lt;/td&gt;
 &lt;td&gt;1-4 hours&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Data Guard with manual switchover&lt;/td&gt;
 &lt;td&gt;1-5 minutes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Data Guard with Fast-Start Failover&lt;/td&gt;
 &lt;td&gt;10-30 seconds&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="rto-vs-rpo" class="relative group"&gt;RTO vs RPO &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="#rto-vs-rpo" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RTO&lt;/strong&gt;: how long it takes to restart (looks forward)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RPO&lt;/strong&gt;: how much data you can lose (looks backward)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They are independent metrics. A backup restore can have RTO=2 hours and RPO=24 hours. A synchronous Data Guard can have RTO=30 seconds and RPO=0.&lt;/p&gt;</description></item><item><title>SCAN Listener</title><link>https://ivanluminaria.com/en/glossary/scan-listener/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/scan-listener/</guid><description>&lt;p&gt;The &lt;strong&gt;SCAN Listener&lt;/strong&gt; (Single Client Access Name) is the Oracle RAC component that provides a single DNS name for cluster access. Applications connect to the SCAN name without needing to know individual nodes: the listener automatically distributes connections among active nodes.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;SCAN is a DNS name that resolves to three virtual IP addresses (VIPs) distributed across cluster nodes. When a client connects to the SCAN name, DNS returns one of the three IPs, and the listener on that IP redirects the connection to the most appropriate node based on the requested service and load.&lt;/p&gt;</description></item><item><title>SCD</title><link>https://ivanluminaria.com/en/glossary/scd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/scd/</guid><description>&lt;p&gt;&lt;strong&gt;SCD&lt;/strong&gt; (Slowly Changing Dimension) refers to a set of techniques used in data warehousing to manage changes in dimension table data over time.&lt;/p&gt;
&lt;h2 id="main-types" class="relative group"&gt;Main types &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="#main-types" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type 1&lt;/strong&gt;: overwrite the previous value. No history preserved&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type 2&lt;/strong&gt;: insert a new row with validity dates (start date, end date). Preserves full history&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type 3&lt;/strong&gt;: add a column for the previous value. Preserves only the last change&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="why-it-matters" class="relative group"&gt;Why it matters &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="#why-it-matters" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In a transactional database, when a customer changes address you update the record. In a data warehouse this would mean losing history: all previous sales would appear associated with the new address.&lt;/p&gt;</description></item><item><title>Schema</title><link>https://ivanluminaria.com/en/glossary/schema/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/schema/</guid><description>&lt;p&gt;A &lt;strong&gt;Schema&lt;/strong&gt; in a relational database is a logical namespace that groups objects such as tables, views, functions, and sequences. It functions as an organizational container within a database.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In PostgreSQL, the default schema is &lt;code&gt;public&lt;/code&gt;. To access an object in another schema, the prefix is required: &lt;code&gt;schema1.table&lt;/code&gt;. The &lt;code&gt;USAGE&lt;/code&gt; privilege on a schema is a prerequisite for accessing any object within it — without &lt;code&gt;USAGE&lt;/code&gt;, even a &lt;code&gt;GRANT SELECT&lt;/code&gt; on tables does not work.&lt;/p&gt;</description></item><item><title>Scope</title><link>https://ivanluminaria.com/en/glossary/scope/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/scope/</guid><description>&lt;p&gt;A project&amp;rsquo;s &lt;strong&gt;Scope&lt;/strong&gt; defines the perimeter of what the project must deliver: included features, expected deliverables, constraints, and boundaries agreed with stakeholders. Everything inside the scope gets done; everything outside does not.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Scope is defined in the early project phases through documents like the Statement of Work or Project Charter. Any subsequent change request must go through a formal change management process to evaluate its impact on timeline, budget, and resources.&lt;/p&gt;</description></item><item><title>Scope Creep</title><link>https://ivanluminaria.com/en/glossary/scope-creep/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/scope-creep/</guid><description>&lt;p&gt;&lt;strong&gt;Scope Creep&lt;/strong&gt; is the progressive and often uncontrolled expansion of a project&amp;rsquo;s scope beyond what was initially defined. New requirements, specification changes and additional features accumulate without a corresponding adjustment to budget and timelines.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In a software project, scope creep typically starts with seemingly small requests: &amp;ldquo;let&amp;rsquo;s add this field too&amp;rdquo;, &amp;ldquo;it would be useful to have this function as well&amp;rdquo;. Each individual change seems reasonable, but the cumulative effect is devastating. Specifications become a moving target, the team can never reach a stable baseline, and the project enters an endless cycle of revisions.&lt;/p&gt;</description></item><item><title>Scrum</title><link>https://ivanluminaria.com/en/glossary/scrum/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/scrum/</guid><description>&lt;p&gt;&lt;strong&gt;Scrum&lt;/strong&gt; is an agile framework for project management that organizes work into fixed-length iterations called sprints (typically 2 weeks). It defines three roles (Product Owner, Scrum Master, Development Team) and four ceremonies (Sprint Planning, Daily Standup, Sprint Review, Sprint Retrospective).&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Each sprint starts with planning, continues with daily standups for synchronization, and ends with a review (what was done) and a retrospective (how to improve the process). Timeboxing is the fundamental principle: every ceremony has a non-negotiable maximum duration.&lt;/p&gt;</description></item><item><title>secure-file-priv</title><link>https://ivanluminaria.com/en/glossary/secure-file-priv/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/secure-file-priv/</guid><description>&lt;p&gt;&lt;strong&gt;secure-file-priv&lt;/strong&gt; is a MySQL system variable that controls where &lt;code&gt;LOAD DATA INFILE&lt;/code&gt;, &lt;code&gt;SELECT INTO OUTFILE&lt;/code&gt; and the &lt;code&gt;LOAD_FILE()&lt;/code&gt; function can operate on the server&amp;rsquo;s filesystem.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The variable accepts three values: a specific path (e.g. &lt;code&gt;/var/lib/mysql-files/&lt;/code&gt;), which limits file operations to that directory; an empty string (&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;), which imposes no restrictions; or &lt;code&gt;NULL&lt;/code&gt;, which completely disables file operations. The value can only be set in the configuration file (&lt;code&gt;my.cnf&lt;/code&gt;) and requires a service restart to change — it cannot be modified at runtime.&lt;/p&gt;</description></item><item><title>Self-parenting</title><link>https://ivanluminaria.com/en/glossary/self-parenting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/self-parenting/</guid><description>&lt;p&gt;&lt;strong&gt;Self-parenting&lt;/strong&gt; is a dimensional modeling technique used to balance ragged hierarchies. The principle is simple: an entity that doesn&amp;rsquo;t have an upper hierarchical level becomes its own parent at that level.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In a three-level hierarchy Top Group → Group → Client:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Client without a Group uses its own name/ID as its Group&lt;/li&gt;
&lt;li&gt;A Group without a Top Group uses its own name/ID as its Top Group&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result is a dimension table with no NULLs in the hierarchical columns, with all levels always populated.&lt;/p&gt;</description></item><item><title>Sequential Scan</title><link>https://ivanluminaria.com/en/glossary/sequential-scan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/sequential-scan/</guid><description>&lt;p&gt;A &lt;strong&gt;Sequential Scan&lt;/strong&gt; (Seq Scan) is the operation where PostgreSQL reads a table from start to finish, block by block, without using any index. It&amp;rsquo;s PostgreSQL&amp;rsquo;s equivalent of Oracle&amp;rsquo;s Full Table Scan.&lt;/p&gt;
&lt;h2 id="when-its-normal" class="relative group"&gt;When it&amp;rsquo;s normal &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="#when-its-normal" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;On small tables (a few thousand rows), a sequential scan is often the most efficient choice. Reading an entire table sequentially is faster than index lookups when the table fits in a few pages. The optimizer chooses a sequential scan when it estimates it&amp;rsquo;s cheaper than an index scan.&lt;/p&gt;</description></item><item><title>SGA</title><link>https://ivanluminaria.com/en/glossary/sga/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/sga/</guid><description>&lt;p&gt;The &lt;strong&gt;SGA&lt;/strong&gt; (System Global Area) is Oracle Database&amp;rsquo;s main shared memory area. It contains fundamental data structures: buffer cache (data pages read from disk), shared pool (execution plans and data dictionary), redo log buffer, and large pool.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;SGA size is controlled by the &lt;code&gt;SGA_TARGET&lt;/code&gt; or &lt;code&gt;SGA_MAX_SIZE&lt;/code&gt; parameter. Oracle allocates the SGA at instance startup in the operating system&amp;rsquo;s shared memory. The Linux kernel parameters &lt;code&gt;shmmax&lt;/code&gt; and &lt;code&gt;shmall&lt;/code&gt; must be sized to allow complete SGA allocation.&lt;/p&gt;</description></item><item><title>shared_buffers</title><link>https://ivanluminaria.com/en/glossary/shared-buffers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/shared-buffers/</guid><description>&lt;p&gt;&lt;strong&gt;shared_buffers&lt;/strong&gt; is the parameter that controls the size of the shared memory area PostgreSQL uses as a cache for data blocks read from disk. Every time PostgreSQL reads a data page (8 KB), it keeps it in shared_buffers for subsequent reads.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;PostgreSQL allocates memory for shared_buffers at service startup. All backend processes share this memory area. When a process needs a data block, it first looks in shared_buffers. If it finds it (cache hit), the read is immediate. If not (cache miss), it must read from disk — an operation orders of magnitude slower.&lt;/p&gt;</description></item><item><title>Single-primary</title><link>https://ivanluminaria.com/en/glossary/single-primary/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/single-primary/</guid><description>&lt;p&gt;&lt;strong&gt;Single-primary&lt;/strong&gt; is the most common operating mode in MySQL Group Replication, where only one node in the cluster — the primary — accepts write operations. The other nodes (secondaries) are read-only (&lt;code&gt;read_only=ON&lt;/code&gt;, &lt;code&gt;super_read_only=ON&lt;/code&gt;) and receive changes through the group&amp;rsquo;s synchronous replication.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The parameter &lt;code&gt;group_replication_single_primary_mode=ON&lt;/code&gt; enables this mode. The primary is the only node with &lt;code&gt;read_only=OFF&lt;/code&gt;. If the primary is stopped or becomes unreachable, the cluster triggers an automatic election and one of the secondaries becomes the new primary within seconds.&lt;/p&gt;</description></item><item><title>Smart Working</title><link>https://ivanluminaria.com/en/glossary/smart-working/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/smart-working/</guid><description>&lt;p&gt;&lt;strong&gt;Smart Working&lt;/strong&gt; (agile working) is an organizational model that allows employees to work from any location, combining office days and remote days, with flexible hours and evaluation based on results instead of presence.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The typical model is 80/20: 80% remote, 20% in person. Office days are for workshops, project reviews, and team building — not for warming chairs. The company provides equipment for the home workstation (monitor, ergonomic chair, headset) and a connectivity allowance.&lt;/p&gt;</description></item><item><title>Snapshot (Oracle)</title><link>https://ivanluminaria.com/en/glossary/snapshot-oracle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/snapshot-oracle/</guid><description>&lt;p&gt;&lt;strong&gt;Snapshot&lt;/strong&gt; in Oracle is a point-in-time capture of database performance statistics stored in the AWR repository. By default Oracle generates a snapshot every 60 minutes and retains them for 8 days.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Each snapshot records hundreds of metrics: wait events, SQL statistics, memory metrics (SGA, PGA), I/O by datafile, system statistics. Comparing two snapshots generates the AWR report, which shows what changed between the two points in time.&lt;/p&gt;</description></item><item><title>Split-brain</title><link>https://ivanluminaria.com/en/glossary/split-brain/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/split-brain/</guid><description>&lt;p&gt;&lt;strong&gt;Split-brain&lt;/strong&gt; is a critical condition that occurs when a database cluster splits into two or more partitions that cannot communicate with each other, and each partition continues accepting writes independently. The result is divergent data impossible to reconcile automatically.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In a 3-node cluster, if the network between Node 1 and Nodes 2-3 breaks, without quorum protection both parts could continue accepting writes. When the network is restored, the cluster would find itself with two different versions of the same data. The quorum mechanism prevents this scenario: only the partition with the majority of nodes (quorum) can continue operating.&lt;/p&gt;</description></item><item><title>SQL Injection</title><link>https://ivanluminaria.com/en/glossary/sql-injection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/sql-injection/</guid><description>&lt;p&gt;&lt;strong&gt;SQL Injection&lt;/strong&gt; is one of the most widespread and dangerous vulnerabilities in web applications. It occurs when user-supplied input is inserted directly into SQL queries without validation or parameterisation, allowing an attacker to modify the query logic.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The attacker inserts SQL code fragments into application input fields (login forms, search fields, URL parameters). If the application concatenates these inputs directly into SQL queries, the malicious code is executed by the database with the application user&amp;rsquo;s privileges. Combined with MySQL&amp;rsquo;s &lt;code&gt;FILE&lt;/code&gt; privilege and an unconfigured &lt;code&gt;secure-file-priv&lt;/code&gt;, the attacker can read system files or write arbitrary files on the server.&lt;/p&gt;</description></item><item><title>SST</title><link>https://ivanluminaria.com/en/glossary/sst/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/sst/</guid><description>&lt;p&gt;&lt;strong&gt;SST&lt;/strong&gt; (State Snapshot Transfer) is the mechanism by which a Galera node joining the cluster (or one that has been offline too long) receives a complete copy of the entire dataset from a donor node.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When a node joins the cluster and the gap of missing transactions exceeds the gcache size, the cluster initiates an SST. The donor node creates a full snapshot of the database and transfers it to the receiving node. Available methods include: &lt;code&gt;mariabackup&lt;/code&gt; (doesn&amp;rsquo;t block the donor), &lt;code&gt;rsync&lt;/code&gt; (fast but blocks the donor for reads), and &lt;code&gt;mysqldump&lt;/code&gt; (slow and blocking).&lt;/p&gt;</description></item><item><title>Stakeholder</title><link>https://ivanluminaria.com/en/glossary/stakeholder/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/stakeholder/</guid><description>&lt;p&gt;A &lt;strong&gt;Stakeholder&lt;/strong&gt; is any person, group, or organization with a direct or indirect interest in a project&amp;rsquo;s outcome. This includes clients, sponsors, end users, development teams, management, and external vendors.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In project management, stakeholders are identified, classified by level of influence and interest, and managed with differentiated communication strategies. A high-influence, high-interest stakeholder (like the CTO) requires active involvement; a low-influence one requires only periodic updates.&lt;/p&gt;</description></item><item><title>Star schema</title><link>https://ivanluminaria.com/en/glossary/star-schema/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/star-schema/</guid><description>&lt;p&gt;A &lt;strong&gt;star schema&lt;/strong&gt; is the most widely used data model in data warehousing. It gets its name from its shape: a central fact table connected to multiple dimension tables surrounding it, like the points of a star.&lt;/p&gt;
&lt;h2 id="structure" class="relative group"&gt;Structure &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="#structure" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fact table&lt;/strong&gt; at the center: contains numeric measures and foreign keys to dimensions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimension tables&lt;/strong&gt; around it: contain descriptive attributes (who, what, where, when) in a denormalized structure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dimensions in a star schema are typically denormalized — all attributes in a single flat table, with no normalized hierarchies. This simplifies queries and improves aggregation performance.&lt;/p&gt;</description></item><item><title>Surrogate key</title><link>https://ivanluminaria.com/en/glossary/chiave-surrogata/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/chiave-surrogata/</guid><description>&lt;p&gt;A &lt;strong&gt;surrogate key&lt;/strong&gt; is a sequential numeric identifier generated internally by the data warehouse, with no business meaning. It is distinct from the natural key — the one coming from the source system (e.g. customer code, employee number).&lt;/p&gt;
&lt;h2 id="why-it-matters" class="relative group"&gt;Why it matters &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="#why-it-matters" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In SCD Type 2, the same customer can have multiple rows in the dimension table — one for each historical version. The natural key (&lt;code&gt;customer_id&lt;/code&gt;) is no longer unique, so you need an identifier that distinguishes each individual version: the surrogate key (&lt;code&gt;customer_key&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Sustainable Mobility</title><link>https://ivanluminaria.com/en/glossary/mobilita-sostenibile/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/mobilita-sostenibile/</guid><description>&lt;p&gt;&lt;strong&gt;Sustainable Mobility&lt;/strong&gt; is an approach to urban transport that favors the use of low environmental impact means — cycling, public transport, electric vehicles, car sharing — over private combustion-engine cars.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;It is based on a paradigm shift: instead of building more roads for more cars, invest in cycling infrastructure, efficient public transport, and incentives for active mobility. Cities like Amsterdam, Copenhagen, and Munich demonstrate that the model works at scale.&lt;/p&gt;</description></item><item><title>Swappiness</title><link>https://ivanluminaria.com/en/glossary/swappiness/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/swappiness/</guid><description>&lt;p&gt;&lt;strong&gt;Swappiness&lt;/strong&gt; (&lt;code&gt;vm.swappiness&lt;/code&gt;) is a Linux kernel parameter that controls how aggressively the system moves memory pages from RAM to swap on disk. The value ranges from 0 (swap only in extreme cases) to 100 (aggressive swapping). The default is 60.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;With the default value of 60, Linux starts swapping when memory pressure is still relatively low. For a dedicated database server, this is unacceptable: the SGA must stay in RAM, always. The recommended value for Oracle is 1 — not 0, which would completely disable swap and could trigger the OOM killer.&lt;/p&gt;</description></item><item><title>Switchover</title><link>https://ivanluminaria.com/en/glossary/switchover/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/switchover/</guid><description>&lt;p&gt;A &lt;strong&gt;switchover&lt;/strong&gt; is a planned Oracle Data Guard operation that reverses the roles between the primary and standby databases. The primary becomes the standby, the standby becomes the primary. No data is lost, no transaction fails — it&amp;rsquo;s a clean, controlled transition.&lt;/p&gt;
&lt;h2 id="switchover-vs-failover" class="relative group"&gt;Switchover vs Failover &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="#switchover-vs-failover" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The distinction is fundamental:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;Switchover&lt;/th&gt;
 &lt;th&gt;Failover&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;When&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Planned (maintenance, migration)&lt;/td&gt;
 &lt;td&gt;Emergency (primary failure)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Data loss&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Zero&lt;/td&gt;
 &lt;td&gt;Possible (depends on mode)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Reversibility&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Yes, with another switchover&lt;/td&gt;
 &lt;td&gt;No, standby becomes primary permanently&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Time&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Minutes (typically 1-3)&lt;/td&gt;
 &lt;td&gt;Seconds to minutes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="how-to-execute" class="relative group"&gt;How to execute &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="#how-to-execute" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;With Data Guard Broker, the switchover is a single command:&lt;/p&gt;</description></item><item><title>System Privilege</title><link>https://ivanluminaria.com/en/glossary/system-privilege/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/system-privilege/</guid><description>&lt;p&gt;A &lt;strong&gt;System Privilege&lt;/strong&gt; in Oracle is an authorization that allows performing global database operations, independent of any specific object. Typical examples include &lt;code&gt;CREATE TABLE&lt;/code&gt;, &lt;code&gt;CREATE SESSION&lt;/code&gt;, &lt;code&gt;ALTER SYSTEM&lt;/code&gt;, &lt;code&gt;CREATE USER&lt;/code&gt;, and &lt;code&gt;DROP ANY TABLE&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;System privileges are granted with &lt;code&gt;GRANT&lt;/code&gt; and revoked with &lt;code&gt;REVOKE&lt;/code&gt;. They can be assigned directly to a user or to a role. The predefined &lt;code&gt;DBA&lt;/code&gt; role includes over 200 system privileges, which is why granting it to application users is a dangerous practice.&lt;/p&gt;</description></item><item><title>systemd</title><link>https://ivanluminaria.com/en/glossary/systemd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/systemd/</guid><description>&lt;p&gt;&lt;strong&gt;systemd&lt;/strong&gt; is the default init system and service manager on modern Linux distributions (CentOS/RHEL 7+, Ubuntu 16.04+, Debian 8+). In the database context, it is the mechanism that starts, stops and monitors MySQL or MariaDB instances.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Each service is defined by a unit file (e.g. &lt;code&gt;mysqld.service&lt;/code&gt;) that specifies the startup command, configuration file, dependencies and crash behaviour. In a multi-instance setup, separate unit files are created for each instance (e.g. &lt;code&gt;mysqld-app2.service&lt;/code&gt;, &lt;code&gt;mysqld-reporting.service&lt;/code&gt;), each with its own &lt;code&gt;--defaults-file&lt;/code&gt; pointing to a different &lt;code&gt;my.cnf&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Tablespace</title><link>https://ivanluminaria.com/en/glossary/tablespace/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/tablespace/</guid><description>&lt;p&gt;A &lt;strong&gt;Tablespace&lt;/strong&gt; is the logical unit of storage organisation in Oracle Database. Each tablespace comprises one or more physical datafiles on disk, and every database object (table, index, partition) resides in a tablespace.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Oracle separates logical management (tablespace) from physical management (datafile). A DBA can create dedicated tablespaces for different purposes: one for active data, one for indexes, one for archive. This enables distributing I/O load across different disks and applying differentiated management policies (e.g. read-only for historical data).&lt;/p&gt;</description></item><item><title>THP</title><link>https://ivanluminaria.com/en/glossary/thp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/thp/</guid><description>&lt;p&gt;&lt;strong&gt;THP&lt;/strong&gt; (Transparent Huge Pages) is a Linux kernel feature that automatically promotes 4 KB memory pages to 2 MB in the background, without explicit configuration. Unlike static Huge Pages, they are managed by the &lt;code&gt;khugepaged&lt;/code&gt; kernel process.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When active (default &lt;code&gt;always&lt;/code&gt;), the kernel attempts to compact normal pages into huge pages in the background. The &lt;code&gt;khugepaged&lt;/code&gt; process works continuously to find and merge groups of contiguous pages, causing unpredictable micro-freezes during compaction operations.&lt;/p&gt;</description></item><item><title>Timeboxing</title><link>https://ivanluminaria.com/en/glossary/timeboxing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/timeboxing/</guid><description>&lt;p&gt;&lt;strong&gt;Timeboxing&lt;/strong&gt; is a time management technique that assigns a fixed, non-negotiable time interval to an activity. When time runs out, the activity ends — regardless of whether it has been completed or not.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A maximum duration is defined (15 minutes for a standup, 1 hour for a design meeting, 2 weeks for a sprint) and the constraint is respected. The timebox forces people to focus on the essential, avoiding endless discussions and paralyzing perfectionism.&lt;/p&gt;</description></item><item><title>Transport Lag</title><link>https://ivanluminaria.com/en/glossary/transport-lag/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/transport-lag/</guid><description>&lt;p&gt;&lt;strong&gt;Transport lag&lt;/strong&gt; is the delay between when the primary database generates a redo log and when that redo log is received by the standby database in an Oracle Data Guard configuration. It&amp;rsquo;s one of the most important indicators for assessing replication health.&lt;/p&gt;
&lt;h2 id="how-its-measured" class="relative group"&gt;How it&amp;rsquo;s measured &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="#how-its-measured" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Transport lag is monitored via a query on the &lt;code&gt;V$DATAGUARD_STATS&lt;/code&gt; view or through Data Guard Broker:&lt;/p&gt;</description></item><item><title>Unified Audit</title><link>https://ivanluminaria.com/en/glossary/unified-audit/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/unified-audit/</guid><description>&lt;p&gt;&lt;strong&gt;Unified Audit&lt;/strong&gt; (Oracle Unified Auditing) is the centralized auditing system introduced in Oracle Database 12c that replaces legacy audit mechanisms with a single unified infrastructure. All audit events converge in the &lt;code&gt;UNIFIED_AUDIT_TRAIL&lt;/code&gt; view.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Unified Audit is based on &lt;strong&gt;audit policies&lt;/strong&gt;: declarative rules that specify which actions to monitor (DDL, DML, logins, administrative operations). Policies are created with &lt;code&gt;CREATE AUDIT POLICY&lt;/code&gt;, enabled with &lt;code&gt;ALTER AUDIT POLICY ... ENABLE&lt;/code&gt;, and can be applied to specific users or globally. Audit records are written to an internal queue and then persisted in the system table.&lt;/p&gt;</description></item><item><title>Unix Socket</title><link>https://ivanluminaria.com/en/glossary/unix-socket/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/unix-socket/</guid><description>&lt;p&gt;A &lt;strong&gt;Unix Socket&lt;/strong&gt; (or Unix domain socket) is a communication endpoint that allows two processes on the same operating system to exchange data without going through the TCP/IP network stack. In MySQL, it is the default connection method when connecting to &lt;code&gt;localhost&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When a MySQL client connects specifying &lt;code&gt;-h localhost&lt;/code&gt;, the client does not use TCP. It uses the Unix socket file (typically &lt;code&gt;/var/run/mysqld/mysqld.sock&lt;/code&gt;) to communicate directly with the MySQL server process. This communication happens entirely within the kernel, with no network overhead, and is faster than a TCP connection even on the same host.&lt;/p&gt;</description></item><item><title>VACUUM</title><link>https://ivanluminaria.com/en/glossary/vacuum/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/vacuum/</guid><description>&lt;p&gt;&lt;strong&gt;VACUUM&lt;/strong&gt; is the PostgreSQL command that reclaims space occupied by dead tuples and makes it available for new inserts. It does not return space to the operating system, does not reorganize the table, and does not compact anything — it marks pages as rewritable.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;VACUUM table&lt;/code&gt; scans the table, identifies dead tuples no longer visible to any transaction, and marks their space as reusable. It is a lightweight operation that does not block writes and can run in parallel with normal queries. &lt;code&gt;VACUUM FULL&lt;/code&gt; instead physically rewrites the entire table with an exclusive lock — to be used very rarely and only in emergencies.&lt;/p&gt;</description></item><item><title>Vendor Lock-in</title><link>https://ivanluminaria.com/en/glossary/vendor-lock-in/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/vendor-lock-in/</guid><description>&lt;p&gt;&lt;strong&gt;Vendor Lock-in&lt;/strong&gt; is the situation where a company becomes dependent on an external supplier to the point that switching becomes extremely costly or technically complex. In the IT context, it occurs when the code, architecture or system knowledge are in the supplier&amp;rsquo;s hands, not the client&amp;rsquo;s.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Lock-in establishes itself gradually: the supplier writes code with their own conventions, uses proprietary or undocumented technologies, and the internal team is not involved in development. When the supplier leaves — by choice or dismissal — they take the know-how with them. The client is left with software they don&amp;rsquo;t understand, can&amp;rsquo;t maintain and can&amp;rsquo;t evolve without re-engaging the same supplier or starting from scratch.&lt;/p&gt;</description></item><item><title>Version Control</title><link>https://ivanluminaria.com/en/glossary/version-control/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/version-control/</guid><description>&lt;p&gt;&lt;strong&gt;Version Control&lt;/strong&gt; is a system that records every change to a project&amp;rsquo;s files, maintaining a complete history of who changed what, when and why. Git is the most widely used version control system in the world.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Every change is recorded as a &amp;ldquo;commit&amp;rdquo; with a descriptive message, an author and a timestamp. The system maintains the project&amp;rsquo;s entire history: you can return to any previous version, compare different versions and understand how the code evolved over time. With Git, every developer has a complete copy of the history on their own computer.&lt;/p&gt;</description></item><item><title>Wait Event</title><link>https://ivanluminaria.com/en/glossary/wait-event/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/wait-event/</guid><description>&lt;p&gt;&lt;strong&gt;Wait Event&lt;/strong&gt; is an Oracle Database diagnostic indicator that identifies why a session is waiting rather than actively working. Whenever a process cannot proceed — because it is waiting for a block from disk, a lock, a network response or a CPU slot — Oracle records a specific wait event.&lt;/p&gt;
&lt;h2 id="the-most-common" class="relative group"&gt;The most common &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="#the-most-common" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Wait Event&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;db file sequential read&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Single-block read — typical of index access&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;db file scattered read&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Multi-block read — typical of full table scans&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;log file sync&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Waiting for commit to redo log&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;enq: TX - row lock contention&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Row lock conflict&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;direct path read&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Direct read (bypassing buffer cache)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="what-theyre-for" class="relative group"&gt;What they&amp;rsquo;re for &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="#what-theyre-for" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Wait events are the foundation of Oracle&amp;rsquo;s diagnostic methodology. By analysing which events dominate DB time (via AWR or ASH) you can immediately identify the nature of the problem: I/O, contention, CPU or network.&lt;/p&gt;</description></item><item><title>WSREP</title><link>https://ivanluminaria.com/en/glossary/wsrep/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/wsrep/</guid><description>&lt;p&gt;&lt;strong&gt;WSREP&lt;/strong&gt; (Write Set Replication) is the API and protocol that Galera Cluster uses for synchronous multi-master replication. Each transaction is captured as a &amp;ldquo;write set&amp;rdquo; (a set of row-level changes) and replicated to all cluster nodes before commit.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When a node executes a transaction, WSREP intercepts it at commit time, packages it as a write set and sends it to all cluster nodes via the group communication protocol. Each node performs a &lt;strong&gt;certification&lt;/strong&gt; process: it verifies that the transaction doesn&amp;rsquo;t conflict with other concurrent transactions. If certification succeeds, all nodes apply the transaction. If it fails, the transaction is rolled back on the originating node.&lt;/p&gt;</description></item><item><title>Yes-And</title><link>https://ivanluminaria.com/en/glossary/yes-and/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/yes-and/</guid><description>&lt;p&gt;&lt;strong&gt;Yes-And&lt;/strong&gt; is a communication technique from improvisational theatre, applied to project management to transform confrontational discussions into constructive conversations. The principle is simple: instead of negating someone&amp;rsquo;s proposal with &amp;ldquo;No, but&amp;hellip;&amp;rdquo;, you acknowledge it with &amp;ldquo;Yes, and&amp;hellip;&amp;rdquo; while adding your own contribution.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When someone proposes an idea, a &amp;ldquo;No&amp;rdquo; response triggers a defensive reaction and blocks the conversation. A &amp;ldquo;Yes, and&amp;hellip;&amp;rdquo; response acknowledges the validity of the proposal and extends it, keeping the dialogue open. It does not mean agreeing with everything — it means building on the other person&amp;rsquo;s proposal before redirecting it.&lt;/p&gt;</description></item><item><title>ZDM</title><link>https://ivanluminaria.com/en/glossary/zdm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivanluminaria.com/en/glossary/zdm/</guid><description>&lt;p&gt;&lt;strong&gt;ZDM&lt;/strong&gt; (Zero Downtime Migration) is the tool Oracle provides for automating Oracle database migrations to OCI (Oracle Cloud Infrastructure) or to higher-version on-premises databases. The name is somewhat optimistic — downtime isn&amp;rsquo;t zero, but it&amp;rsquo;s minimized.&lt;/p&gt;
&lt;h2 id="how-it-works" class="relative group"&gt;How it works &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="#how-it-works" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;ZDM is essentially an orchestrator that combines existing Oracle technologies under a single automated workflow. It supports two modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Physical migration&lt;/strong&gt; (Data Guard-based): creates a standby of the source database on the target, synchronizes it via redo transport, then performs a switchover. Downtime in the order of minutes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logical migration&lt;/strong&gt; (Data Pump-based): performs logical export and import with incremental synchronization via GoldenGate or Data Pump. More flexible but slower.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-it" class="relative group"&gt;When to use it &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="#when-to-use-it" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;ZDM is suited for standard migrations where source and target infrastructure are configured conventionally. The advantage is automation: it reduces the chance of human error in repetitive steps.&lt;/p&gt;</description></item></channel></rss>