<?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>инкрементальное обновление данных - DataTalks.RU. Data Engineering / DWH / Data Pipeline</title>
	<atom:link href="https://datatalks.ru/tag/%d0%b8%d0%bd%d0%ba%d1%80%d0%b5%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bb%d1%8c%d0%bd%d0%be%d0%b5-%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85/feed/" rel="self" type="application/rss+xml" />
	<link>https://datatalks.ru/tag/инкрементальное-обновление-данных/</link>
	<description>RoadMap для инженера данных. Дорожная карта по инструментам Data Engineer</description>
	<lastBuildDate>Tue, 07 Jan 2025 17:18:50 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.1</generator>

<image>
	<url>https://datatalks.ru/wp-content/uploads/2024/12/cropped-logo_datatalks-32x32.png</url>
	<title>инкрементальное обновление данных - DataTalks.RU. Data Engineering / DWH / Data Pipeline</title>
	<link>https://datatalks.ru/tag/инкрементальное-обновление-данных/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Понимание инкрементальных стратегий dbt, часть 1</title>
		<link>https://datatalks.ru/understanding-dbt-incremental-strategies-part-1/</link>
					<comments>https://datatalks.ru/understanding-dbt-incremental-strategies-part-1/#respond</comments>
		
		<dc:creator><![CDATA[Data Engineer (Admin)]]></dc:creator>
		<pubDate>Fri, 03 Jan 2025 19:06:45 +0000</pubDate>
				<category><![CDATA[dbt (Data Build Tool)]]></category>
		<category><![CDATA[dbt]]></category>
		<category><![CDATA[incremental strategy]]></category>
		<category><![CDATA[инкрементальное обновление данных]]></category>
		<guid isPermaLink="false">https://datatalks.ru/?p=411</guid>

					<description><![CDATA[<p>Перевод статьи, исходный текст: https://medium.com/indiciumtech/understanding-dbt-incremental-strategies-part-1-2-22bd97c7eeb5 Данный перевод выполнен с небольшими примечаниями. Используйте статью как ориентир, проверяя по каждой базе и каждому адаптеру возможность реализации. Особенно это касается партиций. Перевод выполнен 1 в 1 без удаления реплик автора. С технической точки зрения я не везде согласен с автором, оценил бы статью на 3 из 5, но [&#8230;]</p>
<p>Сообщение <a href="https://datatalks.ru/understanding-dbt-incremental-strategies-part-1/">Понимание инкрементальных стратегий dbt, часть 1</a> появились сначала на <a href="https://datatalks.ru">DataTalks.RU. Data Engineering / DWH / Data Pipeline</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>Перевод статьи, исходный текст:</strong> <a href="https://medium.com/indiciumtech/understanding-dbt-incremental-strategies-part-1-2-22bd97c7eeb5" target="_blank" rel="noopener">https://medium.com/indiciumtech/understanding-dbt-incremental-strategies-part-1-2-22bd97c7eeb5</a></p>
<p>Данный перевод выполнен с небольшими примечаниями. Используйте статью как ориентир, проверяя по каждой базе и каждому адаптеру возможность реализации. Особенно это касается партиций. Перевод выполнен 1 в 1 без удаления реплик автора.</p>
<p>С технической точки зрения я не везде согласен с автором, оценил бы статью на 3 из 5, но с другой стороны общее представление по инкрементальным стратегиям можно получить. </p>
<p>Плюс в конце статьи еще есть подборка видео с YouTube на english.</p>
<hr />
<h1>Понимание инкрементальных стратегий dbt, часть 1/2</h1>
<p>В этой статье я расскажу об инкрементальных стратегиях в dbt, о том, как они работают, а также о плюсах и минусах каждой из них. В следующей статье я объясню, как на практике реализовать инкрементальные стратегии в ваших моделях.</p>
<p>Используя инкрементальные модели, вы можете преобразовывать и добавлять в таблицы только недавние данные, значительно сокращая (в зависимости от размера таблицы) затраты на обработку и время выполнения. Однако, прежде чем углубляться в эту тему, вам нужно задать себе вопрос: действительно ли вам нужно использовать инкрементальные модели?</p>
<p><strong>Инкрементальная материализация</strong> — это продвинутая и мощная функция dbt, но ее не нужно применять в каждой модели проекта. Есть несколько моментов, которые следует учитывать, чтобы не изменять конфигурацию модели и не добавлять множество условий Jinja без необходимости.</p>
<p><strong>Стоит ли использовать инкрементальную модель?</strong></p>
<p>Как я упомянул в начале, инкрементальные модели не нужны для каждой модели. Во многих случаях <strong>стратегия полного обновления (full refresh)</strong> может быть лучшим вариантом, поэтому давайте подробнее обсудим этот подход.</p>
<h2>Стратегия полного обновления (full refresh)</h2>
<p><strong>Полное обновление</strong> — это стандартный и наиболее распространенный процесс преобразования данных в вашем хранилище данных (DW). Если вы не укажете материализацию как инкрементальную, ваша таблица будет полностью пересоздана при каждом запуске.</p>
<p>Предположим, у нас есть исходная таблица с данными до 2022-02-02, и мы хотим обновить целевую таблицу, содержащую данные до 2022-01-04. При использовании стратегии полного обновления dbt сначала удалит текущую целевую таблицу (1), а затем создаст новую таблицу из преобразованных исходных данных (2).</p>
<p><strong>Рисунок 1 — Пример полного обновления</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_full_refresh.jpeg" target="_blank" rel="noopener"><img fetchpriority="high" decoding="async" class="aligncenter wp-image-417 size-full" src="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_full_refresh.jpeg" alt="" width="1229" height="687" srcset="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_full_refresh.jpeg 1229w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_full_refresh-300x168.jpeg 300w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_full_refresh-1024x572.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_full_refresh-768x429.jpeg 768w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_full_refresh-450x252.jpeg 450w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_full_refresh-780x436.jpeg 780w" sizes="(max-width: 1229px) 100vw, 1229px" /></a></p>
<p>Это может показаться не самым оптимизированным процессом, так как он может потребовать много времени и вычислительных ресурсов для полного создания таблицы. Но у него есть свои преимущества.</p>
<p>Во-первых, в режиме полного обновления существует четкий компромисс между сложностью и затратами/временем обработки. Это низкосложный процесс: вам не нужно беспокоиться о настройке инкрементальных правил, и вы можете быть уверены, что целевая таблица получит все преобразованные данные.</p>
<p>С другой стороны, полное обновление требует больше времени и средств на пересоздание всей таблицы. Если ваша таблица небольшая, скажем, несколько миллионов строк или меньше, преобразования не являются затратными, и вы не беспокоитесь о затратах и времени, то можно использовать полное обновление.</p>
<p>Что касается частоты изменения данных, если данные в модели меняются редко, инкрементальные стратегии не дадут вам особого преимущества — вы можете просто выполнять периодические полные обновления. А если исторические данные модели часто изменяются, инкрементальные стратегии не смогут это учесть, так как они ориентированы на недавние данные, и полное обновление может быть более подходящим вариантом.</p>
<p>С точки зрения низкой сложности и практического использования, полное обновление может быть полезным для быстрого предоставления целевой таблицы конечному пользователю, что позволяет создавать ценность как можно быстрее. Таким образом, конечный пользователь может проверить преобразование и дать обратную связь, попросив о изменениях или исправлениях. Кроме того, наличие преобразованной таблицы в продакшене дает аналитическому инженеру лучшее понимание базы данных: как часто обновляются данные и какой объем данных обрабатывается при каждом запуске. Эти аспекты важны для оптимизации модели.</p>
<p>На этапе оптимизации можно оценить стратегии по сокращению затрат, объема обработки или времени выполнения, например, удалив столбцы, которые не создают ценности, или изменив материализацию модели.</p>
<p>Мы можем резюмировать ключевые моменты полного обновления следующим образом.</p>
<p><strong>Основные преимущества:</strong></p>
<ul>
<li>Простота реализации</li>
<li>Быстрое создание ценности</li>
<li>Гарантия того, что все данные будут добавлены в целевую таблицу, независимо от правил обновления БД</li>
</ul>
<p><strong>Основные недостатки:</strong></p>
<ul>
<li>Высокие затраты на обработку</li>
<li>Длительное время обработки</li>
</ul>
<p><strong>Когда использовать:</strong></p>
<ul>
<li>Когда вам не нужно беспокоиться о затратах и времени (для небольших таблиц или таблиц с простыми преобразованиями)</li>
<li>Когда данные более статичны, чем динамичны</li>
<li>Когда исторические данные часто изменяются</li>
</ul>
<p>Но если вам нужно сократить затраты, ускорить преобразования или если ваша таблица часто получает новые данные, и вы уверенно пользуетесь dbt, вам стоит попробовать инкрементальные модели.</p>
<p>Если вы новичок в dbt или плохо знаете команды dbt, ознакомьтесь с моей статьей о командах dbt: <a href="https://medium.com/indiciumtech/17-dbt-commands-you-should-start-using-today-581998dbf8f0" target="_blank" rel="noopener">17 dbt Commands You Should Start Using Today</a>.</p>
<h2>Инкрементальные модели</h2>
<p><strong>Инкрементальная материализация</strong> направлена на сокращение времени и затрат на обработку, преобразовывая и добавляя только более свежие данные.</p>
<p>Чтобы dbt знал, какие данные являются недавними, в вашей таблице должен быть столбец одного из следующих типов: date, datetime, timestamp или int64. Модель будет использовать столбцы исходной и целевой таблиц для фильтрации данных, которые нужно преобразовать, добавить, обновить или удалить.</p>
<p>Очень важно помнить, что инкрементальные стратегии не учитывают изменения, внесенные в старые записи. Поэтому хорошей практикой является периодическое выполнение полного обновления таблицы для актуализации исторических данных.</p>
<p>Также важно отметить, что ваша таблица будет обрабатываться инкрементально, если выполняются три условия:</p>
<ol>
<li>целевая таблица уже существует в базе данных,</li>
<li>dbt не запускается в режиме полного обновления (вы не используете флаг <code>--full-refresh</code>), и</li>
<li>текущая модель настроена с <code>materialized='incremental'</code>.</li>
</ol>
<p><strong>dbt предлагает четыре типа инкрементальных стратегий:</strong></p>
<ul>
<li><span style="color: #ff6600;"><strong>append</strong></span></li>
<li><span style="color: #ff6600;"><strong>merge</strong></span></li>
<li><span style="color: #ff6600;"><strong>delete+insert</strong></span></li>
<li><span style="color: #ff6600;"><strong>insert_overwrite</strong></span></li>
</ul>
<p><strong>Доступность стратегии зависит от используемого адаптера.</strong> В документации dbt перечислены три адаптера и их соответствующие стратегии:</p>
<ul>
<li><strong>Snowflake:</strong> merge (по умолчанию), delete+insert (опционально)</li>
<li><strong>BigQuery:</strong> merge (по умолчанию), insert_overwrite (опционально)</li>
<li><strong>Spark:</strong> append (по умолчанию), insert_overwrite (опционально), merge (опционально, только для Delta)</li>
</ul>
<p>Давайте рассмотрим каждую из них.</p>
<h2>Append</h2>
<p><strong>Стратегия append (добавление)</strong> очень проста: она просто берет выбранные записи и вставляет их в целевую таблицу. Она не может обновлять или удалять записи, только вставлять. Вы можете использовать эту стратегию только в том случае, если дубликаты не являются для вас проблемой. Append не заботится о дубликатах: она не проверяет, существует ли запись уже в целевой таблице, а просто вставляет дублированные записи.</p>
<blockquote>
<p><span style="color: #ff6600;">Примечание от datatalks.ru:</span> можно вставлять только новые строки, проверяя наличие в таблице. Но, возможно, в стандартных стратегиях appends в адаптерах не реализована проверка наличия строк. Или, например, отсутстует anti join и его можно реализовать, например, через LEFT JOIN с условием IS NULL.</p>
</blockquote>
<p>Например, предположим, что у нас есть те же таблицы, что и в примере с полным обновлением. Если мы выберем записи за сегодня и вчера (1), допустим, сегодня 2022-02-02. Строки будут вставлены в целевую таблицу (2), и мы получим 2 дублированные строки.</p>
<p><strong>Рисунок 2 — Пример Append</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_append.jpeg" target="_blank" rel="noopener"><img decoding="async" class="aligncenter wp-image-419 size-full" src="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_append.jpeg" alt="" width="1646" height="778" srcset="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_append.jpeg 1646w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_append-300x142.jpeg 300w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_append-1024x484.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_append-768x363.jpeg 768w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_append-1536x726.jpeg 1536w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_append-450x213.jpeg 450w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_append-780x369.jpeg 780w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_append-1600x756.jpeg 1600w" sizes="(max-width: 1646px) 100vw, 1646px" /></a></p>
<p>Ключевые моменты append:</p>
<p><strong>Основные преимущества:</strong></p>
<ul>
<li>Простота и понятность</li>
<li>Низкие затраты на обработку, так как не требуется сканирование целевой таблицы</li>
<li>Низкое время обработки</li>
</ul>
<p><strong>Основные недостатки:</strong></p>
<ul>
<li>Невозможно обновлять или удалять строки, только вставлять</li>
<li>Дубликаты! (<span style="color: #ff6600;"><strong>примечание от datatalks.ru:</strong> <span style="color: #003300;">нужно их обрабатывать с помощью Anti Join</span></span>)</li>
</ul>
<p><strong>Когда использовать:</strong></p>
<ul>
<li>Когда вы работаете с таблицами только для добавления записей (append-only)</li>
<li>Когда вас не беспокоят дубликаты</li>
<li>Когда требуется только добавление новых строк</li>
</ul>
<h2>Merge</h2>
<p><strong>Стратегия merge решает проблему дублированных записей.</strong> Она может обрабатывать дубликаты, если вы укажете уникальный ключ (который может состоять из одного или нескольких столбцов). Если уникальный ключ уже существует в целевой таблице, merge обновит запись, поэтому дубликатов не будет. Если записи не существуют, merge добавит их.</p>
<p>Чтобы проверить совпадение уникальных ключей в обеих таблицах, merge должен сканировать всю целевую таблицу, а также выбранную часть исходной таблицы. Это полное сканирование делает стратегию довольно затратной.</p>
<p>Если вы используете merge без указания уникального ключа, это фактически то же самое, что append. Однако, например, в BigQuery использование уникального ключа с merge является обязательным.</p>
<p><strong>Рисунок 3 — Пример Merge</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge.jpeg" target="_blank" rel="noopener"><img decoding="async" class="aligncenter wp-image-420 size-full" src="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge.jpeg" alt="" width="1672" height="777" srcset="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge.jpeg 1672w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge-300x139.jpeg 300w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge-1024x476.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge-768x357.jpeg 768w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge-1536x714.jpeg 1536w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge-450x209.jpeg 450w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge-780x362.jpeg 780w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge-1600x744.jpeg 1600w" sizes="(max-width: 1672px) 100vw, 1672px" /></a></p>
<p>Вернемся к нашему примеру. Предположим, сегодня 2022-02-02, и мы хотим объединить записи за сегодня и вчера с помощью merge.</p>
<p>Dbt сначала получает выбранные записи, указанные в операторе where (1). Затем выполняет сканирование (2), и если записи существуют в целевой таблице, они обновляются; если их нет, они добавляются (3).</p>
<p>Чтобы повысить производительность merge и сократить затраты, целевую таблицу можно кластеризовать. Таким образом, не потребуется полное сканирование целевой таблицы.</p>
<p><strong>Рисунок 4 — Пример кластеризации для Merge</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge_2.jpeg" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="aligncenter wp-image-421 size-full" src="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge_2.jpeg" alt="" width="1672" height="775" srcset="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge_2.jpeg 1672w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge_2-300x139.jpeg 300w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge_2-1024x475.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge_2-768x356.jpeg 768w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge_2-1536x712.jpeg 1536w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge_2-450x209.jpeg 450w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge_2-780x362.jpeg 780w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_merge_2-1600x742.jpeg 1600w" sizes="(max-width: 1672px) 100vw, 1672px" /></a></p>
<p>Ключевые моменты merge:</p>
<p><strong>Основные преимущества:</strong></p>
<ul>
<li>Устраняет дубликаты</li>
<li>Хорошо работает для небольших таблиц (менее нескольких миллионов строк)</li>
</ul>
<p><strong>Основные недостатки:</strong></p>
<ul>
<li>Высокие затраты на обработку из-за необходимости полного сканирования целевой таблицы</li>
</ul>
<p><strong>Когда использовать:</strong></p>
<ul>
<li>Когда у вас небольшие таблицы</li>
<li>Когда вы хотите избежать дубликатов</li>
<li>Когда требуется инкрементальное обновление, а записи постоянно обновляются</li>
</ul>
<h2>Delete+Insert</h2>
<p><strong>Стратегия delete+insert</strong> очень похожа на merge, но вместо обновления существующих записей и добавления новых она удаляет существующие записи и вставляет как новые, так и уже существующие записи. Поскольку она удаляет существующие записи из целевой таблицы, дубликаты также отсутствуют.</p>
<p><strong>Рисунок 5 — Пример стратегии Delete+insert</strong></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>
<p>(Да, я знаю, что использую этот пример на протяжении всей статьи :), но, на мой взгляд, так легче объяснить.)</p>
<p>При использовании delete+insert dbt сначала получает выбранные записи (1), выполняет их сканирование и полное сканирование целевой таблицы для сравнения уникальных ключей (2). Затем удаляет (3) существующие записи и вставляет выбранные (4).</p>
<p>Я не могу рассказать много подробностей об этой стратегии, так как не нашел достаточной документации или каких-либо бенчмарков, связанных с ее использованием. Однако, вероятно, она будет дорогостоящей из-за полного сканирования.</p>
<h2>Insert Overwrite</h2>
<p>Последняя инкрементальная стратегия, о которой я расскажу, — это <strong>insert overwrite.</strong> Эта стратегия решает проблему полного сканирования. Решение, используемое в insert overwrite, заключается в работе с <strong>разделами (<span style="color: #ff6600;">partitions</span>)</strong>.</p>
<p>Разделение таблицы на части означает ее деление на сегменты. Для работы insert overwrite раздел может быть следующих типов:</p>
<ul>
<li>date,</li>
<li>datetime, timestamp, (<span style="color: #ff6600;"><strong>примечание от datatalks.ru:</strong> </span>скорей всего нельзя, слишком много значений будет)</li>
<li>int64.</li>
</ul>
<p>А его гранулярность может быть по часу, дню, месяцу или году. Если вы используете int64, необходимо задать диапазон. Вы должны указать столбец, значения которого будут использоваться для формирования разделов, и в каждом разделе будут записи с одинаковым значением гранулярности.</p>
<p><strong>Стратегия insert overwrite</strong> удаляет выбранные разделы из текущей целевой таблицы и вставляет в нее выбранные преобразованные разделы.</p>
<p><strong>Рисунок 6 — Пример стратегии Insert Overwrite</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_insert_overwrite.jpeg" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="aligncenter wp-image-423 size-full" src="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_insert_overwrite.jpeg" alt="" width="1668" height="778" srcset="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_insert_overwrite.jpeg 1668w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_insert_overwrite-300x140.jpeg 300w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_insert_overwrite-1024x478.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_insert_overwrite-768x358.jpeg 768w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_insert_overwrite-1536x716.jpeg 1536w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_insert_overwrite-450x210.jpeg 450w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_insert_overwrite-780x364.jpeg 780w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_insert_overwrite-1600x746.jpeg 1600w" sizes="(max-width: 1668px) 100vw, 1668px" /></a></p>
<p>В приведенном выше примере целевая таблица разделена по дням (для повышения производительности исходная таблица также может быть разделена). Необходимо указать, какие разделы будут заменены в целевой таблице, и они определяются параметром конфигурации под названием partitions (мы рассмотрим это подробнее в следующей статье). В этом примере мы хотим заменить разделы за сегодня и вчера, предположим, что сегодня 2022-02-02.</p>
<p>Мы можем использовать оператор where в модели, указав, что нас интересуют записи, даты которых входят в параметр partitions. Таким образом, будут выбраны записи за сегодня и вчера (1).</p>
<p>Затем в целевой таблице находятся и удаляются соответствующие разделы как часть оператора merge (2). Так как таблица разделена, полное сканирование не требуется. Это основное отличие между insert overwrite и merge, что значительно сокращает объем обрабатываемых данных.</p>
<p>Наконец, выбранные записи вставляются в целевую таблицу как часть оператора merge (3).</p>
<p>За исключением использования разделов, этот процесс похож на стратегию delete+insert. Однако стратегия delete+insert использует два отдельных оператора — delete и insert, а insert overwrite использует оператор merge с постоянным ложным предикатом.</p>
<p>Insert overwrite — это стратегия высокой сложности. Если ее неправильно настроить, она может приводить к дублированию данных. Например, представим таблицу сотрудников, и мы используем стратегию insert overwrite на основе столбца updated_at.</p>
<p><strong>Рисунок 7 — Проблемы с Insert Overwrite</strong></p>
<p><a href="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_problem_with_insert_overwrite.jpeg" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="aligncenter wp-image-424 size-full" src="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_problem_with_insert_overwrite.jpeg" alt="" width="1190" height="780" srcset="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_problem_with_insert_overwrite.jpeg 1190w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_problem_with_insert_overwrite-300x197.jpeg 300w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_problem_with_insert_overwrite-1024x671.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_problem_with_insert_overwrite-768x503.jpeg 768w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_problem_with_insert_overwrite-450x295.jpeg 450w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_problem_with_insert_overwrite-780x511.jpeg 780w" sizes="(max-width: 1190px) 100vw, 1190px" /></a></p>
<p>Если через месяц запись сотрудника 1 будет обновлена, эта запись снова будет вставлена в целевую таблицу. Периодическое полное обновление решает эту проблему, но если вы не можете ждать выполнения полного обновления, следует использовать другой столбец или рассмотреть стратегию merge.</p>
<p>Основные моменты Insert Overwrite:</p>
<p><strong>Основные преимущества:</strong></p>
<ul>
<li>Низкие затраты на обработку</li>
<li>Низкое время обработки</li>
</ul>
<p><strong>Основные недостатки:</strong></p>
<ul>
<li>Высокая сложность</li>
<li>Может привести к дублированию данных, если неправильно настроено</li>
</ul>
<p><strong>Когда использовать:</strong></p>
<ul>
<li>Когда вы работаете с большими динамическими наборами данных</li>
<li>Когда затраты и время обработки становятся проблемой</li>
</ul>
<h2>Сравнение стратегий</h2>
<p>Вот сравнение различных стратегий. Delete+insert не включена, так как я не нашел достаточно информации о ней. Более детальный бенчмарк инкрементальных стратегий вы можете найти по ссылке.</p>
<p><strong>Рисунок 8 — Сравнение стратегий</strong></p>
<div><a href="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_total_review_table.jpeg" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="aligncenter wp-image-425 size-full" src="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_total_review_table.jpeg" alt="" width="1204" height="617" srcset="https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_total_review_table.jpeg 1204w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_total_review_table-300x154.jpeg 300w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_total_review_table-1024x525.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_total_review_table-768x394.jpeg 768w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_total_review_table-450x231.jpeg 450w, https://datatalks.ru/wp-content/uploads/2024/12/dbt_incremental_total_review_table-780x400.jpeg 780w" sizes="(max-width: 1204px) 100vw, 1204px" /></a></div>
<div> </div>
<div>Дерево решений, которое поможет вам выбрать наиболее оптимальную реализацию:</div>
<div> </div>
<div><a href="https://datatalks.ru/wp-content/uploads/2024/12/how_to_choose_incremental_strategy.jpeg" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="aligncenter wp-image-446 size-full" src="https://datatalks.ru/wp-content/uploads/2024/12/how_to_choose_incremental_strategy.jpeg" alt="" width="1820" height="777" srcset="https://datatalks.ru/wp-content/uploads/2024/12/how_to_choose_incremental_strategy.jpeg 1820w, https://datatalks.ru/wp-content/uploads/2024/12/how_to_choose_incremental_strategy-300x128.jpeg 300w, https://datatalks.ru/wp-content/uploads/2024/12/how_to_choose_incremental_strategy-1024x437.jpeg 1024w, https://datatalks.ru/wp-content/uploads/2024/12/how_to_choose_incremental_strategy-768x328.jpeg 768w, https://datatalks.ru/wp-content/uploads/2024/12/how_to_choose_incremental_strategy-1536x656.jpeg 1536w, https://datatalks.ru/wp-content/uploads/2024/12/how_to_choose_incremental_strategy-450x192.jpeg 450w, https://datatalks.ru/wp-content/uploads/2024/12/how_to_choose_incremental_strategy-780x333.jpeg 780w, https://datatalks.ru/wp-content/uploads/2024/12/how_to_choose_incremental_strategy-1600x683.jpeg 1600w" sizes="(max-width: 1820px) 100vw, 1820px" /></a></div>
<h2>Заключение</h2>
<p>Это конец первой части статьи о инкрементальных стратегиях в dbt. Теперь вы должны лучше понимать, когда использовать инкрементальные стратегии, а когда — нет. Кроме того, вы узнали, как работают различные стратегии и в каких случаях их применять.</p>
<p>В следующей статье я покажу, как реализовать инкрементальные стратегии на практике.</p>
<p>Надеюсь, вам понравилась эта статья! Лучший способ изучить что-то — попытаться объяснить это кому-то другому, и это то, что я пытаюсь сделать. Оставляйте комментарии, если у вас есть вопросы, предложения или даже исправления к тексту!</p>
<p><span style="color: #993366;"><strong>=== Конец перевода <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ===</strong></span></p>
<p>Вторую статью можно почитать по ссылке (юзать сами знаете что): <strong><a href="https://medium.com/indiciumtech/understanding-dbt-incremental-strategies-part-2-2-add59889ea17" target="_blank" rel="noopener">Understanding dbt Incremental Strategies part 2/2</a></strong></p>
<p><strong>Ознакомьтесь с официальной документацией по инкрементальным моделям:</strong></p>
<ul>
<li><a href="https://docs.getdbt.com/docs/build/incremental-models" target="_blank" rel="noopener"><span style="color: #ff6600;"><strong>Configure incremental models</strong></span></a></li>
<li><a href="https://docs.getdbt.com/docs/build/incremental-strategy" target="_blank" rel="noopener"><span style="color: #ff6600;"><strong>About incremental strategy</strong></span></a></li>
<li><span style="color: #ff6600;"><strong><a style="color: #ff6600;" href="https://docs.getdbt.com/docs/build/incremental-microbatch" target="_blank" rel="noopener">About microbatch incremental models</a></strong></span></li>
</ul>
<h1>Дополнение к статье YouTube (как смотреть разберетесь, надеюсь)</h1>
<h2><strong> Merge Tables With Incremental Models | dbt Tutorial</strong></h2>
<p><iframe title="Merge Tables With Incremental Models | dbt Tutorial" width="1170" height="658" src="https://www.youtube.com/embed/2OGUOaIJq94?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>
<h2><strong>YouTube &#8212; dbt Tutorial: dbt incremental models in bigquery; MERGE vs. INSERT_OVERWRITE</strong></h2>
<p><iframe title="dbt Tutorial: dbt incremental models in bigquery; MERGE vs. INSERT_OVERWRITE #dbt #bigquery #sql" width="1170" height="878" src="https://www.youtube.com/embed/Z4o0jVbrDi0?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>
<h2><strong>Dbt Materializations &#8212; Incremental Snapshot | data build tool | Slowly Changing Dimension SCD Type 2</strong></h2>
<p><iframe title="Dbt Materializations - Incremental Snapshot | data build tool | Slowly Changing Dimension SCD Type 2" width="1170" height="658" src="https://www.youtube.com/embed/bjemdsZibdM?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>
<h2><strong> Incremental Models (Faisal El Shami)</strong></h2>
<p><iframe title="Incremental Models (Faisal El Shami)" width="1170" height="878" src="https://www.youtube.com/embed/mOJ90AbzgQ8?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 class="wp-block-paragraph"></p>
<p>Сообщение <a href="https://datatalks.ru/understanding-dbt-incremental-strategies-part-1/">Понимание инкрементальных стратегий dbt, часть 1</a> появились сначала на <a href="https://datatalks.ru">DataTalks.RU. Data Engineering / DWH / Data Pipeline</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datatalks.ru/understanding-dbt-incremental-strategies-part-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
