<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Append Only (Anti Join) - DataTalks.RU. Data Engineering / DWH / Data Pipeline</title>
	<atom:link href="https://datatalks.ru/tag/append-only-anti-join/feed/" rel="self" type="application/rss+xml" />
	<link>https://datatalks.ru/tag/append-only-anti-join/</link>
	<description>RoadMap для инженера данных. Дорожная карта по инструментам Data Engineer</description>
	<lastBuildDate>Mon, 18 Aug 2025 19:09:19 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://datatalks.ru/wp-content/uploads/2024/12/cropped-logo_datatalks-32x32.png</url>
	<title>Append Only (Anti Join) - DataTalks.RU. Data Engineering / DWH / Data Pipeline</title>
	<link>https://datatalks.ru/tag/append-only-anti-join/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Инкрементальное обновление данных &#8212; Incremental Data Refresh</title>
		<link>https://datatalks.ru/incremental-data-refresh-sql-patterns/</link>
					<comments>https://datatalks.ru/incremental-data-refresh-sql-patterns/#respond</comments>
		
		<dc:creator><![CDATA[Data Engineer (Admin)]]></dc:creator>
		<pubDate>Tue, 07 Jan 2025 19:51:27 +0000</pubDate>
				<category><![CDATA[DWH]]></category>
		<category><![CDATA[Append]]></category>
		<category><![CDATA[Append Only (Anti Join)]]></category>
		<category><![CDATA[CDC]]></category>
		<category><![CDATA[Change Data Capture]]></category>
		<category><![CDATA[Delete + Insert]]></category>
		<category><![CDATA[full refresh]]></category>
		<category><![CDATA[incremental strategy]]></category>
		<category><![CDATA[Insert Overwrite]]></category>
		<category><![CDATA[Log-based CDC]]></category>
		<category><![CDATA[Merge]]></category>
		<category><![CDATA[Query-based CDC]]></category>
		<category><![CDATA[SCD]]></category>
		<category><![CDATA[Slowly Changing Dimensions]]></category>
		<category><![CDATA[Swap partitions]]></category>
		<category><![CDATA[Trigger-based CDC]]></category>
		<category><![CDATA[Upsert]]></category>
		<guid isPermaLink="false">https://datatalks.ru/?p=627</guid>

					<description><![CDATA[<p>Шаблоны обновлений данных в DWH Эта статья частично пересекается со статьей Понимание инкрементальных стратегий dbt, часть 1 (рекомендую ознакомиться). Изменение данных — одна из основных задач для команд инженерии данных, особенно при переходе от одной технологии к другой. Обсудим команды DML в языке SQL. Ниже будут рассмотрены основные схемы обновления данных в Data Engineering. Стратегия [&#8230;]</p>
<p>Сообщение <a href="https://datatalks.ru/incremental-data-refresh-sql-patterns/">Инкрементальное обновление данных &#8212; Incremental Data Refresh</a> появились сначала на <a href="https://datatalks.ru">DataTalks.RU. Data Engineering / DWH / Data Pipeline</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Шаблоны обновлений данных в DWH</h1>
<p>Эта статья частично пересекается со статьей <strong><a href="https://datatalks.ru/understanding-dbt-incremental-strategies-part-1/" target="_blank" rel="noopener">Понимание инкрементальных стратегий dbt, часть 1</a></strong> <span style="color: #ff6600;">(рекомендую ознакомиться)</span>.</p>
<hr />
<p>Изменение данных — одна из основных задач для команд инженерии данных, особенно при переходе от одной технологии к другой. Обсудим команды DML в языке SQL.</p>
<p>Ниже будут рассмотрены основные схемы обновления данных в Data Engineering.</p>
<h2>Стратегия полного обновления (full refresh)</h2>
<h3><strong>Вариант 1 &#8212; Truncate Table</strong></h3>
<p>Стирание — это шаблон обновления, который ничего не обновляет. Он просто удаляет старые данные. При обновлении по схеме «стирание и перезагрузка» (truncate-and-reload) таблица очищается от данных, а преобразования запускаются заново и загружаются в таблицу, фактически создавая её новую версию.</p>
<p><strong>Пример:</strong></p><pre class="urvanov-syntax-highlighter-plain-tag">TRUNCATE TABLE target_table;  

INSERT INTO target_table  
SELECT customer_id, SUM(amount) AS total_amount  
FROM source_table  
WHERE order_date &gt;= '2024-12-01' AND order_date &lt;= '2024-12-31'  
GROUP BY customer_id;</pre><p></p>
<h3><strong>Вариант 2 &#8212; Drop Table</strong></h3>
<p>Replace (Drop and Recreate) &#8212; Удаление таблицы и создание новой с новыми данными.</p>
<p><strong>Применение:</strong></p>
<p>Используется для временных или промежуточных таблиц, которые проще пересоздать, чем обновить.</p>
<p><strong>Пример:</strong></p><pre class="urvanov-syntax-highlighter-plain-tag">DROP TABLE IF EXISTS target_table;  

CREATE TABLE target_table AS  
SELECT *  
FROM source_table;</pre><p></p>
<h3><strong>Вариант 3 &#8212; Собираем временную таблицу и делаем переименование</strong></h3>
<p>Удаление таблицы или ее очистка может приводить к &#171;морганию данных&#187; (когда на период пересчета и загрузки данных таблица остается пустой), поэтому имеет смысл при небольших объемах данных готовить сбоку целевую заново рассчитанную таблицу и затем ее менять с целевой местами.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/tables_change_rename_swap.jpeg"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-809" src="https://datatalks.ru/wp-content/uploads/2025/01/tables_change_rename_swap.jpeg" alt="" width="252" height="238" /></a></p>
<p>В разных базах данных по разному можно выполнить переименование таблиц, в ClickHouse есть например <a href="https://clickhouse.com/docs/ru/sql-reference/statements/exchange" target="_blank" rel="noopener">EXCHANGE</a>.</p>
<h2>Append Only (Anti Join)</h2>
<blockquote><p><span style="color: #ff6600;">Append (Anti Join)</span> &#8212; Добавление только новых записей, которых нет в целевой таблице.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/append.png"><img decoding="async" class="aligncenter size-full wp-image-657" src="https://datatalks.ru/wp-content/uploads/2025/01/append.png" alt="" width="1413" height="753" srcset="https://datatalks.ru/wp-content/uploads/2025/01/append.png 1413w, https://datatalks.ru/wp-content/uploads/2025/01/append-300x160.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/append-1024x546.png 1024w, https://datatalks.ru/wp-content/uploads/2025/01/append-768x409.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/append-450x240.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/append-780x416.png 780w" sizes="(max-width: 1413px) 100vw, 1413px" /></a></p></blockquote>
<p><strong>Шаблон «только вставка»</strong> позволяет добавлять новые записи без изменения или удаления старых. Такие шаблоны могут использоваться для поддержания текущего состояния данных. Например, вставляются новые версии записей без удаления старых, а запрос или представление показывает текущее состояние данных, находя самую новую запись по первичному ключу.</p>
<p>В базах данных на основе столбцов первичные ключи обычно не применяются. Это концепция, используемая инженерами для управления текущим состоянием таблицы. Однако поиск последней записи во время запроса может быть вычислительно затратным.</p>
<p>Альтернативой может быть использование материализованного представления, в котором хранятся только актуальные записи, или использование таблицы для вставки всех записей и другой таблицы для хранения текущего состояния.</p>
<p>При вставке данных в OLAP-базы на основе столбцов часто возникает проблема, когда инженеры, переходящие со строковых систем, используют однострочную вставку. Этот антипаттерн создаёт огромную нагрузку на систему. Данные записываются в множество отдельных файлов, что снижает эффективность их последующего считывания. Рекомендуется загружать данные микропакетами или пакетами.</p>
<p>Исключением из правила «не выполнять частую вставку» является усовершенствованная лямбда-архитектура, применяемая в BigQuery и Apache Druid. Она сочетает потоковый буфер с хранилищем на основе столбцов.</p>
<p><strong>Применение Append:</strong></p>
<p>Используется, когда обновление данных подразумевает исключительно добавление новых строк (например, лог-файлы или потоковые данные).</p>
<p><strong>Принцип работы:</strong></p>
<ol>
<li>Выполняется проверка на наличие данных в целевой таблице с использованием ANTI JOIN.</li>
<li>Данные, которых нет в целевой таблице, добавляются.</li>
</ol>
<p><strong>Пример:</strong></p>
<p>Добавление новых заказов, которых еще нет в основной таблице.</p><pre class="urvanov-syntax-highlighter-plain-tag">INSERT INTO target_table (id, order_date, amount)  
SELECT s.id, s.order_date, s.amount  
FROM source_table s  
LEFT JOIN target_table t ON s.id = t.id  
WHERE t.id IS NULL; -- Только те записи, которых нет в целевой таблице</pre><p></p>
<h2>Merge (также называется Upsert)</h2>
<blockquote><p><span style="color: #ff6600;">Upsert / Merge</span> &#8212; Обновление существующих данных или добавление новых.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/Merge.png"><img decoding="async" class="aligncenter size-full wp-image-658" src="https://datatalks.ru/wp-content/uploads/2025/01/Merge.png" alt="" width="1413" height="753" srcset="https://datatalks.ru/wp-content/uploads/2025/01/Merge.png 1413w, https://datatalks.ru/wp-content/uploads/2025/01/Merge-300x160.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/Merge-1024x546.png 1024w, https://datatalks.ru/wp-content/uploads/2025/01/Merge-768x409.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/Merge-450x240.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/Merge-780x416.png 780w" sizes="(max-width: 1413px) 100vw, 1413px" /></a></p></blockquote>
<p><strong>Merge (он же Upsert)</strong> — это операция базы данных, которая позволяет сделать выбор между вставкой новой строки или обновлением существующих строк в зависимости от того, выполняется ли условие (например, ограничение уникальности). Эта операция особенно полезна, когда вы не уверены, существуют ли уже данные в базе данных.</p>
<hr />
<p>Операция Upsert (обновление + вставка) вызывает проблемы у инженеров, особенно при переходе от строковых баз данных к облачным хранилищам на основе столбцов.</p>
<p>При Upsert исходные записи ищут совпадения с целевой таблицей по первичному ключу или другому условию. Если совпадение найдено, запись обновляется. Если нет — добавляется новая. Слияние дополняет Upsert возможностью удаления записей.</p>
<p>Файловые системы не поддерживают обновление файлов на месте. Они используют технологию копирования при записи (Copy-on-write, COW): при изменении или удалении записи переписывается весь файл. Это делает операции обновления сложными.</p>
<p>Некоторые базы данных на основе столбцов, такие как Vertica, скрывают сложность COW, обновляя записи и указатели файлов. Облачные хранилища данных поддерживают обновления и слияния, хотя их выполнение может быть ресурсоёмким.</p>
<p>Обновления редко приводят к переписыванию всей таблицы. Эффективность зависит от стратегии разбиения и кластеризации.</p>
<p>Частота обновлений также имеет значение. Вместо попыток выполнять слияния в режиме реального времени разумнее делать их раз в час.</p>
<p>BigQuery поддерживает потоковую вставку записей с дедупликацией данных в реальном времени. Druid использует двухуровневое хранилище для сверхбыстрых запросов.</p>
<p><strong>Применение:</strong></p>
<p>Используется для синхронизации данных, когда необходимо как обновить существующие строки, так и добавить новые.</p>
<p><strong>Принцип работы:</strong></p>
<ol>
<li>Выполняется проверка на совпадение ключей между источником и целевой таблицей.</li>
<li>При совпадении ключа выполняется обновление.</li>
<li>При отсутствии совпадения выполняется вставка.</li>
</ol>
<p><strong>Пример:</strong></p>
<p>Синхронизация информации о пользователях.</p><pre class="urvanov-syntax-highlighter-plain-tag">MERGE INTO target_table AS t  
USING source_table AS s  
ON t.id = s.id  
WHEN MATCHED THEN  
    UPDATE SET t.name = s.name, t.email = s.email  
WHEN NOT MATCHED THEN  
    INSERT (id, name, email)  
    VALUES (s.id, s.name, s.email);</pre><p></p>
<h2>Delete + Insert</h2>
<p>Удаление данных важно, если исходная система требует их удаления в соответствии с нормативными требованиями. В системах на основе столбцов удаление обходится дороже, чем вставка.</p>
<p>Существуют два вида удаления: жёсткое и мягкое. Жёсткое удаление окончательно удаляет запись из базы данных, а мягкое помечает запись как «удалённую». Мягкое удаление полезно, если запись не нужно удалять навсегда, но нужно исключить из результатов запроса.</p>
<p>Третий подход — вставка удаления. Он добавляет новую запись с флагом deleted, не изменяя предыдущую версию. Это позволяет использовать шаблон «только вставка», учитывая удаление. Однако такой подход усложняет запросы для получения актуального состояния данных.</p>
<blockquote><p><span style="color: #ff6600;">Delta Updates (Change-Based Updates)</span> &#8212; Применение изменений к целевой таблице на основе метки времени или инкрементального идентификатора.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_delete_plus_insert.jpeg" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="aligncenter wp-image-422 size-full" src="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_delete_plus_insert.jpeg" alt="" width="1662" height="773" srcset="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_delete_plus_insert.jpeg 1662w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_delete_plus_insert-300x140.jpeg 300w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_delete_plus_insert-1024x476.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_delete_plus_insert-768x357.jpeg 768w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_delete_plus_insert-1536x714.jpeg 1536w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_delete_plus_insert-450x209.jpeg 450w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_delete_plus_insert-780x363.jpeg 780w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_delete_plus_insert-1600x744.jpeg 1600w" sizes="(max-width: 1662px) 100vw, 1662px" /></a></p></blockquote>
<p><strong>Применение:</strong></p>
<p>Используется, если источник предоставляет только измененные записи.</p>
<p><strong>Пример:</strong></p>
<p>Обновление заказов, измененных после последней загрузки.</p><pre class="urvanov-syntax-highlighter-plain-tag">-- Удаление старых данных
DELETE FROM target_table  
WHERE id IN (SELECT id FROM source_table WHERE updated_at &gt; @last_load_time);  

-- Вставка новых данных
INSERT INTO target_table  
SELECT *  
FROM source_table  
WHERE updated_at &gt; @last_load_time;</pre><p></p>
<h2>Insert Overwrite / Swap partitions</h2>
<blockquote><p><span style="color: #ff6600;">Windowed Updates (Partition-Based)</span> &#8212; это Обновление данных по партициям (например, по диапазонам дат).</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/Partition.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-660" src="https://datatalks.ru/wp-content/uploads/2025/01/Partition.png" alt="" width="1413" height="753" srcset="https://datatalks.ru/wp-content/uploads/2025/01/Partition.png 1413w, https://datatalks.ru/wp-content/uploads/2025/01/Partition-300x160.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/Partition-1024x546.png 1024w, https://datatalks.ru/wp-content/uploads/2025/01/Partition-768x409.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/Partition-450x240.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/Partition-780x416.png 780w" sizes="(max-width: 1413px) 100vw, 1413px" /></a></p></blockquote>
<p><strong>Схема работы с партициями следующая:</strong></p>
<ol>
<li>Собирается таблица с обновленными партициями.</li>
<li>Далее меняются партиции целевой таблицы (target table) и временной.</li>
<li>После замены существующих партиций и вставки новых партиций &#8212; временная таблица удаляется</li>
</ol>
<p><strong>Пример для ClickHouse:</strong></p><pre class="urvanov-syntax-highlighter-plain-tag">ALTER TABLE test.hits_local REPLACE PARTITION '2020-10-27' FROM test.hits_local_tmp;
ALTER TABLE test.hits_local_tmp DROP PARTITION '2020-10-27';</pre><p></p>
<h3><strong>Работа с партициями в ClickHouse</strong></h3>
<p>Для работы с <a href="https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/custom-partitioning-key">партициями</a> доступны следующие операции:</p>
<ul>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#alter_detach-partition">DETACH PARTITION</a> — перенести партицию в директорию <code>detached</code>;</li>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#alter_drop-partition">DROP PARTITION</a> — удалить партицию;</li>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#alter_attach-partition">ATTACH PARTITION|PART</a> — добавить партицию/кусок в таблицу из директории <code>detached</code>;</li>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#alter_attach-partition-from">ATTACH PARTITION FROM</a> — скопировать партицию из другой таблицы;</li>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#alter_replace-partition">REPLACE PARTITION</a> — скопировать партицию из другой таблицы с заменой;</li>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#alter_move_to_table-partition">MOVE PARTITION TO TABLE</a> — переместить партицию в другую таблицу;</li>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#alter_clear-column-partition">CLEAR COLUMN IN PARTITION</a> — удалить все значения в столбце для заданной партиции;</li>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#alter_clear-index-partition">CLEAR INDEX IN PARTITION</a> — очистить построенные вторичные индексы для заданной партиции;</li>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#alter_freeze-partition">FREEZE PARTITION</a> — создать резервную копию партиции;</li>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#alter_unfreeze-partition">UNFREEZE PARTITION</a> — удалить резервную копию партиции;</li>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#alter_fetch-partition">FETCH PARTITION|PART</a> — скачать партицию/кусок с другого сервера;</li>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#alter_move-partition">MOVE PARTITION|PART</a> — переместить партицию/кускок на другой диск или том.</li>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#update-in-partition">UPDATE IN PARTITION</a> — обновить данные внутри партиции по условию.</li>
<li><a href="https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition#delete-in-partition">DELETE IN PARTITION</a> — удалить данные внутри партиции по условию.</li>
</ul>
<h1>SCD (Slowly Changing Dimensions)</h1>
<p><strong>Медленно изменяющиеся измерения в хранилище данных (Slowly Changing Dimensions, SCD)</strong> — важная концепция, которая используется для включения исторического аспекта данных в аналитическую систему. Как вы знаете, хранилище данных используется для анализа исторических данных, важно хранить различные состояния данных.</p>
<p>В хранилище данных у нас есть таблицы фактов и измерений для хранения данных. Таблицы измерений используются для анализа мер в таблицах фактов. В среде данных данные инициируются в операционных базах данных, и данные будут извлечены-преобразованы-загружены (ETL) в хранилище данных для соответствия аналитической среде.</p>
<p>Customer, Product — примеры таблиц Dimensional. Эти атрибуты измерений изменяются с течением времени, и в хранилище данных нам необходимо поддерживать историю. В операционных системах мы можем перезаписывать измененные атрибуты, поскольку нам могут не понадобиться исторические аспекты данных. Поскольку нашей основной целью в хранилище данных является анализ данных с точки зрения истории, мы не сможем просто перезаписать данные, и нам необходимо реализовать специальные методы для поддержания истории с учетом аналитических и объемных аспектов хранилища данных. Эта реализация выполняется с использованием медленно изменяющихся измерений в хранилище данных.</p>
<h2><strong>Типы SCD</strong></h2>
<table border="0" cellspacing="0">
<colgroup width="85"></colgroup>
<colgroup width="523"></colgroup>
<tbody>
<tr>
<td align="center" height="17" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;SCD type&quot;}"><b><span style="font-family: Liberation Serif;">SCD type</span></b></td>
<td align="center" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;Use case scenarios&quot;}"><b><span style="font-family: Liberation Serif;">Use case scenarios</span></b></td>
</tr>
<tr>
<td align="left" height="17" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;SCD type 0&quot;}"><span style="font-family: Liberation Serif;">SCD type 0</span></td>
<td align="left" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;Durable data like constants, date dimensions&quot;}">Устойчивые данные, такие как константы, измерения по датам</td>
</tr>
<tr>
<td align="left" height="17" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;SCD type 1&quot;}"><span style="font-family: Liberation Serif;">SCD type 1</span></td>
<td align="left" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;Only current version of truth available, no need for historical data&quot;}">Только текущая версия данных (истина на данный момент), нет необходимости в исторических данных</td>
</tr>
<tr>
<td align="left" height="17" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;SCD type 2&quot;}"><span style="font-family: Liberation Serif;">SCD type 2</span></td>
<td align="left" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;Need historical versions of data and the periods during which they were current&quot;}">Необходимость в исторических версиях данных и периодах, в течение которых они были актуальны</td>
</tr>
<tr>
<td align="left" height="17" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;SCD type 3&quot;}"><span style="font-family: Liberation Serif;">SCD type 3</span></td>
<td align="left" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;Need for current data and the previous last value (alternate reality)&quot;}">Необходимость в текущих данных и предыдущем последнем значении (альтернативная реальность)</td>
</tr>
<tr>
<td align="left" height="32" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;SCD type 4&quot;}"><span style="font-family: Liberation Serif;">SCD type 4</span></td>
<td align="left" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;Used when a group of attributes in a dimension rapidly changes and is split off to a mini–dimension (rapidly changing monster dimension.)&quot;}">Используется, когда группа атрибутов в измерении быстро изменяется и выделяется в мини-измерение (быстро изменяющееся &#171;монстр-измерение&#187;)</td>
</tr>
<tr>
<td align="left" height="32" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;SCD type 5&quot;}"><span style="font-family: Liberation Serif;">SCD type 5</span></td>
<td align="left" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;Rarely used - to accurately preserve historical attribute values, plus report historical facts according to current attribute values; SCD 5 is equivalent to SCD 1 + SCD 4&quot;}">Редко используется — для точного сохранения исторических значений атрибутов и создания отчетов с учетом текущих значений атрибутов; SCD 5 эквивалентен SCD 1 + SCD 4</td>
</tr>
<tr>
<td align="left" height="32" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;SCD type 6&quot;}"><span style="font-family: Liberation Serif;">SCD type 6</span></td>
<td align="left" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;Rarely used - Unpredictable Changes with Single-Version Overlay; SCD 6 is equivalent to SCD 1 + SCD 2 + SCD 3&quot;}">Редко используется — непредсказуемые изменения с наложением одной версии; SCD 6 эквивалентен SCD 1 + SCD 2 + SCD 3</td>
</tr>
<tr>
<td align="left" height="17" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;SCD type 7&quot;}"><span style="font-family: Liberation Serif;">SCD type 7</span></td>
<td align="left" data-sheets-value="{ &quot;1&quot;: 2, &quot;2&quot;: &quot;Rarely used - Hybrid technique that supports both as-was and as-is reporting&quot;}">Редко используется — гибридная техника, поддерживающая как &#171;как было&#187; (as-was), так и &#171;как есть&#187; (as-is) отчетность</td>
</tr>
</tbody>
</table>
<h3><strong>SCD Тип 0</strong></h3>
<p>Бывают ситуации, когда вы игнорируете любые изменения. Например, когда сотрудник присоединяется к организации, есть присоединенные связанные атрибуты, такие как присоединенное назначение и дата присоединения и т. д., которые не должны меняться со временем.</p>
<p>Ниже приведен пример для типа 0 медленно изменяющихся измерений в хранилище данных.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/type_0_slowly_changing_dimensions_in_data_warehous.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-692" src="https://datatalks.ru/wp-content/uploads/2025/01/type_0_slowly_changing_dimensions_in_data_warehous.png" alt="" width="890" height="184" srcset="https://datatalks.ru/wp-content/uploads/2025/01/type_0_slowly_changing_dimensions_in_data_warehous.png 890w, https://datatalks.ru/wp-content/uploads/2025/01/type_0_slowly_changing_dimensions_in_data_warehous-300x62.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/type_0_slowly_changing_dimensions_in_data_warehous-768x159.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/type_0_slowly_changing_dimensions_in_data_warehous-450x93.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/type_0_slowly_changing_dimensions_in_data_warehous-780x161.png 780w" sizes="(max-width: 890px) 100vw, 890px" /></a></p>
<p>В приведенном выше измерении «Клиент» FirstDesignation, JoinedDate и DateFirstPurchase — это атрибуты, которые не будут обновляться, что соответствует SCD типа 0.</p>
<h3><strong>SCD Тип 1</strong></h3>
<p>В SCD типа 1 вы просто перезаписываете данные в измерениях. Могут быть ситуации, когда у вас нет всех данных, когда запись инициируется в измерении. Например, когда инициируется запись клиента, вы можете не получить все атрибуты. Поэтому, когда запись клиента инициируется в рабочей базе данных, в записях клиентов будут пустые или нулевые записи. После выполнения ETL эти пустые записи будут созданы в хранилище данных. После того, как эти атрибуты будут заполнены в рабочих базах данных, это должно быть обновлено в хранилище данных.</p>
<p>SCD типа 1 определяют, являются ли существующие атрибуты нулевыми, и вы получаете значение из рабочей таблицы.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/type_1_slowly_changing_dimensions_in_data_warehous.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-696" src="https://datatalks.ru/wp-content/uploads/2025/01/type_1_slowly_changing_dimensions_in_data_warehous.png" alt="" width="801" height="185" srcset="https://datatalks.ru/wp-content/uploads/2025/01/type_1_slowly_changing_dimensions_in_data_warehous.png 801w, https://datatalks.ru/wp-content/uploads/2025/01/type_1_slowly_changing_dimensions_in_data_warehous-300x69.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/type_1_slowly_changing_dimensions_in_data_warehous-768x177.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/type_1_slowly_changing_dimensions_in_data_warehous-450x104.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/type_1_slowly_changing_dimensions_in_data_warehous-780x180.png 780w" sizes="(max-width: 801px) 100vw, 801px" /></a></p>
<p>В приведенной выше таблице Customer Dimension AnnualIncome клиентов <strong>CustomerKey</strong> 11015 и 11019 равны NULL. Когда эти записи обновляются в операционной базе данных, эти значения должны обновляться в хранилище данных без учета того, что это исторические значения.</p>
<h3><strong>SCD Тип 2</strong></h3>
<p>Тип 2 Медленно изменяющиеся измерения в хранилище данных — это самое популярное измерение, которое используется в хранилище данных. Как мы уже обсуждали, хранилище данных используется для анализа данных. Если вам нужно проанализировать данные, вам нужно учесть исторические аспекты данных. Давайте посмотрим, как мы можем реализовать SCD Тип 2.</p>
<p>Для SCD типа 2 нам необходимо включить еще три атрибута, такие как <strong>StartDate</strong>, <strong>EndDate</strong> и <strong>IsCurrent</strong>, как показано ниже.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/type_2_slowly_changing_dimensions_in_data_warehous.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-697" src="https://datatalks.ru/wp-content/uploads/2025/01/type_2_slowly_changing_dimensions_in_data_warehous.png" alt="" width="886" height="96" srcset="https://datatalks.ru/wp-content/uploads/2025/01/type_2_slowly_changing_dimensions_in_data_warehous.png 886w, https://datatalks.ru/wp-content/uploads/2025/01/type_2_slowly_changing_dimensions_in_data_warehous-300x33.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/type_2_slowly_changing_dimensions_in_data_warehous-768x83.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/type_2_slowly_changing_dimensions_in_data_warehous-450x49.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/type_2_slowly_changing_dimensions_in_data_warehous-780x85.png 780w" sizes="(max-width: 886px) 100vw, 886px" /></a></p>
<p>В приведенном выше измерении клиента есть две записи, и предположим, что клиент, <strong>CustomerCode</strong> которого — AW00011012, был повышен до старшего руководства. Однако, если вы просто обновите запись новым значением, вы не увидите предыдущие записи. Поэтому будет создана новая запись с новым <strong>CustomerKey</strong> и новым <strong>Designation</strong>. Однако другие атрибуты останутся прежними.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/implementation_of_type_2_slowly_changing_dimension.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-698" src="https://datatalks.ru/wp-content/uploads/2025/01/implementation_of_type_2_slowly_changing_dimension.png" alt="" width="930" height="129" srcset="https://datatalks.ru/wp-content/uploads/2025/01/implementation_of_type_2_slowly_changing_dimension.png 930w, https://datatalks.ru/wp-content/uploads/2025/01/implementation_of_type_2_slowly_changing_dimension-300x42.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/implementation_of_type_2_slowly_changing_dimension-768x107.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/implementation_of_type_2_slowly_changing_dimension-450x62.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/implementation_of_type_2_slowly_changing_dimension-780x108.png 780w" sizes="(max-width: 930px) 100vw, 930px" /></a></p>
<p>Как вы можете видеть на рисунке выше, <strong>CustomerCode</strong> AW00011012 имеет новую запись с кодом 11013. Все новые транзакции будут связаны с <strong>CustomerKey</strong> 11013, в то время как предыдущие транзакции связаны с <strong>CustomerKey</strong> 11012. Этот механизм помогает сохранить исторический аспект клиента, как показано в запросе ниже.</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT
    C.Designation,
    SUM(SalesAmount) AS SalesAmount,
    SUM(TotalProductCost) AS TotalProductCost 
FROM FactInternetSales F
INNER JOIN Dim_Customer C ON F.CustomerKey = C.CustomerKey
GROUP BY C.Designation</pre><p>После выполнения запроса будут получены следующие результаты.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/sample_dataset_for_the_type_2_scd.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-699" src="https://datatalks.ru/wp-content/uploads/2025/01/sample_dataset_for_the_type_2_scd.png" alt="" width="464" height="107" srcset="https://datatalks.ru/wp-content/uploads/2025/01/sample_dataset_for_the_type_2_scd.png 464w, https://datatalks.ru/wp-content/uploads/2025/01/sample_dataset_for_the_type_2_scd-300x69.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/sample_dataset_for_the_type_2_scd-450x104.png 450w" sizes="(max-width: 464px) 100vw, 464px" /></a></p>
<p>Как вы можете видеть, обозначение управления можно увидеть в приведенном выше результате, что означает, что оно охватывает исторические аспекты. Тип 2 SCD является одной из реализаций, где вы не можете избежать суррогатных ключей в размерных таблицах в хранилище данных.</p>
<h3><strong>SCD Тип 3</strong></h3>
<p>Тип 3 Медленно изменяющееся измерение в хранилище данных — это простая реализация, где история будет храниться в дополнительном столбце. Если мы свяжем тот же сценарий, который мы обсуждали в Типе 2 SCD, с Типом 3 SCD, измерение клиента будет выглядеть следующим образом.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/type_3_scd.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-700" src="https://datatalks.ru/wp-content/uploads/2025/01/type_3_scd.png" alt="" width="834" height="92" srcset="https://datatalks.ru/wp-content/uploads/2025/01/type_3_scd.png 834w, https://datatalks.ru/wp-content/uploads/2025/01/type_3_scd-300x33.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/type_3_scd-768x85.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/type_3_scd-450x50.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/type_3_scd-780x86.png 780w" sizes="(max-width: 834px) 100vw, 834px" /></a></p>
<p>Как вы можете видеть, исторические аспекты данных сохраняются в виде другого столбца. Однако этот метод не будет масштабируемым, если вы хотите сохранить историю. Кроме того, эта техника позволит сохранить только последнюю версию истории, в отличие от SCD типа 2.</p>
<p>Обычно это лучше подходит для внедрения изменений имени сотрудника. В некоторых случаях женщины-сотрудницы меняют свои имена после замужества. В таких ситуациях вы можете использовать SCD типа 3, поскольку эти типы изменений не будут происходить быстро.</p>
<h3><strong>SCD Тип 4</strong></h3>
<p>Как мы обсуждали в SCD типа 2, мы сохраняем историю, добавляя другую версию строки в измерение. Однако, если изменения быстрые по своей природе, SCD типа 2 не будет масштабируемым.</p>
<p>Например, предположим, что мы хотим сохранить тип риска клиента в зависимости от его предыдущего платежа. Поскольку это атрибут, связанный с клиентом, он должен храниться в измерении клиента. Это означает, что каждый месяц будет новая версия записи клиента. Если у вас 1000 клиентов, вы просматриваете 12 000 записей в месяц. Как вы можете себе представить, эти медленно меняющиеся измерения в хранилище данных не масштабируются.</p>
<p>Ниже приведена взаимосвязь между таблицами «Факт» и «Клиентское измерение».</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/schema_design_before_implementing_type_4_scd.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-701" src="https://datatalks.ru/wp-content/uploads/2025/01/schema_design_before_implementing_type_4_scd.png" alt="" width="1017" height="447" srcset="https://datatalks.ru/wp-content/uploads/2025/01/schema_design_before_implementing_type_4_scd.png 1017w, https://datatalks.ru/wp-content/uploads/2025/01/schema_design_before_implementing_type_4_scd-300x132.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/schema_design_before_implementing_type_4_scd-768x338.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/schema_design_before_implementing_type_4_scd-450x198.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/schema_design_before_implementing_type_4_scd-780x343.png 780w" sizes="(max-width: 1017px) 100vw, 1017px" /></a></p>
<p>SCD Type 4 вводится для исправления этой проблемы. В этом методе быстро меняющийся столбец выносится из измерения и перемещается в новую таблицу измерений. Это новое измерение связано с таблицей фактов, как показано на диаграмме ниже.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/schema_design_after_implementing_type_4_scd.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-702" src="https://datatalks.ru/wp-content/uploads/2025/01/schema_design_after_implementing_type_4_scd.png" alt="" width="1048" height="503" srcset="https://datatalks.ru/wp-content/uploads/2025/01/schema_design_after_implementing_type_4_scd.png 1048w, https://datatalks.ru/wp-content/uploads/2025/01/schema_design_after_implementing_type_4_scd-300x144.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/schema_design_after_implementing_type_4_scd-1024x491.png 1024w, https://datatalks.ru/wp-content/uploads/2025/01/schema_design_after_implementing_type_4_scd-768x369.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/schema_design_after_implementing_type_4_scd-450x216.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/schema_design_after_implementing_type_4_scd-780x374.png 780w" sizes="(max-width: 1048px) 100vw, 1048px" /></a></p>
<p>С помощью вышеописанной реализации медленно изменяющихся измерений типа 4 в хранилище данных вы устраняете ненужный объем в основном измерении. Однако у вас все еще есть возможности для выполнения необходимого анализа.</p>
<h3><strong>SCD Тип 6</strong></h3>
<p>Медленно изменяющиеся измерения типа 6 в хранилище данных представляют собой комбинацию SCD типа 2 и типа 3. Это означает, что в реализации SCD типа 6 оба столбца являются строками.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/sample_dataset_for_type_6_scd.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-703" src="https://datatalks.ru/wp-content/uploads/2025/01/sample_dataset_for_type_6_scd.png" alt="" width="1155" height="150" srcset="https://datatalks.ru/wp-content/uploads/2025/01/sample_dataset_for_type_6_scd.png 1155w, https://datatalks.ru/wp-content/uploads/2025/01/sample_dataset_for_type_6_scd-300x39.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/sample_dataset_for_type_6_scd-1024x133.png 1024w, https://datatalks.ru/wp-content/uploads/2025/01/sample_dataset_for_type_6_scd-768x100.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/sample_dataset_for_type_6_scd-450x58.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/sample_dataset_for_type_6_scd-780x101.png 780w" sizes="(max-width: 1155px) 100vw, 1155px" /></a></p>
<p>С этой реализацией вы можете еще больше улучшить аналитические возможности хранилища данных. Если вы хотите найти анализ между текущей и исторической оккупацией, вы можете использовать следующий запрос.</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT
    C.Occupation,
    C.CurrentOccupation,
    SUM(SalesAmount) AS SalesAmount,
    SUM(TotalProductCost) AS TotalProductCost 
FROM FactInternetSales F
INNER JOIN Dim_Customer C ON F.CustomerKey = C.CustomerKey
GROUP BY C.Occupation,C.CurrentOccupation</pre><p>Приведенный выше запрос даст следующий результат:</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/results_with_type_6_scd.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-704" src="https://datatalks.ru/wp-content/uploads/2025/01/results_with_type_6_scd.png" alt="" width="619" height="136" srcset="https://datatalks.ru/wp-content/uploads/2025/01/results_with_type_6_scd.png 619w, https://datatalks.ru/wp-content/uploads/2025/01/results_with_type_6_scd-300x66.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/results_with_type_6_scd-450x99.png 450w" sizes="(max-width: 619px) 100vw, 619px" /></a></p>
<p>Без Типа 6, медленно меняющихся измерений в хранилище данных, приходится использовать сложные запросы.</p>
<p>В SCD типа 6 можно использовать не только текущую профессию, но и первую профессию для проведения более глубокого анализа.</p>
<h1>Как устроено CDC (Change Data Capture)</h1>
<p><strong>Сбор измененных данных (Change Data Capture, CDC)</strong> — это процесс выявления и фиксации изменений, внесенных в данные в базе данных, а затем передача этих изменений в режиме реального времени в последующий процесс или систему.</p>
<p><strong>Почему это важно</strong></p>
<p>Фиксация всех изменений транзакций в исходной базе данных и их перенос в целевую базу данных в режиме реального времени позволяет синхронизировать системы и обеспечивает надежную репликацию данных и миграцию в облако без простоев.</p>
<p>CDC идеально подходит для современных облачных архитектур, поскольку это высокоэффективный способ перемещения данных по глобальной сети. И поскольку он перемещает данные в режиме реального времени, он также поддерживает аналитику и науку о данных в режиме реального времени.</p>
<h2>Три основных подхода CDC (Change Data Capture Methods)</h2>
<p><strong>1. Log-based CDC (CDC на основе журнала).</strong> Это наиболее эффективный способ внедрения CDC. Когда новая транзакция попадает в базу данных, она регистрируется в файле журнала без влияния на исходную систему. И вы можете подобрать эти изменения, а затем переместить их из журнала.<br />
Блок-схема, показывающая изменения данных в исходной базе данных (удаление, обновление, вставка), регистрируемые майнером журнала транзакций и применяемые к целевой системе с метками времени и суммами для каждой операции.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/Transaction_Log_CDC.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-669" src="https://datatalks.ru/wp-content/uploads/2025/01/Transaction_Log_CDC.png" alt="" width="1014" height="662" srcset="https://datatalks.ru/wp-content/uploads/2025/01/Transaction_Log_CDC.png 1014w, https://datatalks.ru/wp-content/uploads/2025/01/Transaction_Log_CDC-300x196.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/Transaction_Log_CDC-768x501.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/Transaction_Log_CDC-450x294.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/Transaction_Log_CDC-780x509.png 780w" sizes="(max-width: 1014px) 100vw, 1014px" /></a></p>
<p><strong>2. Query-based CDC (CDC на основе запросов) / Timestamp-Based CDC.</strong> Здесь вы запрашиваете данные в источнике, чтобы получить изменения. Этот подход более инвазивный для исходных систем, потому что вам нужно что-то вроде временной метки в самих данных.</p>
<p>Этот метод подразумевает добавление в таблицы выделенного столбца, который отражает время последнего изменения (например, <code> LAST_MODIFIED</code>или <code> LAST_UPDATED</code>). Последующие системы могут затем запросить это поле, чтобы извлечь записи, обновленные с момента их последней проверки.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/timestamp_based_cdc.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-674" src="https://datatalks.ru/wp-content/uploads/2025/01/timestamp_based_cdc.png" alt="" width="833" height="403" srcset="https://datatalks.ru/wp-content/uploads/2025/01/timestamp_based_cdc.png 833w, https://datatalks.ru/wp-content/uploads/2025/01/timestamp_based_cdc-300x145.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/timestamp_based_cdc-768x372.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/timestamp_based_cdc-450x218.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/timestamp_based_cdc-780x377.png 780w" sizes="(max-width: 833px) 100vw, 833px" /></a></p>
<p><strong>3. Trigger-based CDC (CDC на основе триггера).</strong> При этом подходе вы изменяете исходное приложение для запуска записи в таблицу изменений, а затем перемещаете ее. Такой подход снижает производительность базы данных, поскольку требует множественных записей каждый раз, когда строка обновляется, вставляется или удаляется.</p>
<p><a href="https://datatalks.ru/wp-content/uploads/2025/01/Trigger_based_CDC.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-670" src="https://datatalks.ru/wp-content/uploads/2025/01/Trigger_based_CDC.png" alt="" width="1059" height="559" srcset="https://datatalks.ru/wp-content/uploads/2025/01/Trigger_based_CDC.png 1059w, https://datatalks.ru/wp-content/uploads/2025/01/Trigger_based_CDC-300x158.png 300w, https://datatalks.ru/wp-content/uploads/2025/01/Trigger_based_CDC-1024x541.png 1024w, https://datatalks.ru/wp-content/uploads/2025/01/Trigger_based_CDC-768x405.png 768w, https://datatalks.ru/wp-content/uploads/2025/01/Trigger_based_CDC-450x238.png 450w, https://datatalks.ru/wp-content/uploads/2025/01/Trigger_based_CDC-780x412.png 780w" sizes="(max-width: 1059px) 100vw, 1059px" /></a></p>
<h2>Подборка видео про CDC</h2>
<h3>Change Data Capture (CDC) Explained (with examples)</h3>
<p><iframe title="Change Data Capture (CDC) Explained (with examples)" width="1170" height="658" src="https://www.youtube.com/embed/5KN_feUhtTM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<h3>Stream your PostgreSQL changes into Kafka with Debezium</h3>
<p><iframe title="Stream your PostgreSQL changes into Kafka with Debezium" width="1170" height="658" src="https://www.youtube.com/embed/YZRHqRznO-o?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<p>Сообщение <a href="https://datatalks.ru/incremental-data-refresh-sql-patterns/">Инкрементальное обновление данных &#8212; Incremental Data Refresh</a> появились сначала на <a href="https://datatalks.ru">DataTalks.RU. Data Engineering / DWH / Data Pipeline</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datatalks.ru/incremental-data-refresh-sql-patterns/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
