Snowflake Stream стал пустым, даже если мы потребляем всего несколько записей из данных Stream

Я вижу, что набор потоковых данных стал пустым, даже если я использую только одну запись из набора потоковых данных. Я не думаю, что это правильно.

Вот шаги, которые я сделал. - Создайте таблицу для хранения имен и сборов, выплачиваемых участниками тренажерного зала, создания или замены элементов таблицы (номер идентификатора (8) не равен нулю, имя varchar(255) по умолчанию null, номер комиссии (3) ноль);

- Создать поток для отслеживания изменений на текущий момент в таблице MEMBERS, создать или заменить поток member_check на элементах таблицы;

- Создайте таблицу для хранения дат, когда участники тренажерного зала присоединились для создания или замены регистрации в таблице (номер идентификатора (8), дата даты);

вставить в члены (id,name,fee) значения (1,'Joe',0), (2,'Jane',0), (3,'George',0), (4,'Betty',0), (5,'Салли',0);

вставить в значения подписки (1,'2018-01-01'),(2,'2018-02-15'),(3,'2018-05-01'),(4,'2018-07-16'),(5,'2018-08-21');

- Поток записывает вставленные строки select * from member_check;

+----+--------+-----+-----------------+-------------------+------------------------------------------+
| ID | NAME   | FEE | METADATA$ACTION | METADATA$ISUPDATE | METADATA$ROW_ID                          |
|----+--------+-----+-----------------+-------------------+------------------------------------------|
|  1 | Joe    |   0 | INSERT          | False             | d200504bf3049a7d515214408d9a804fd03b46cd |
|  2 | Jane   |   0 | INSERT          | False             | d0a551cecbee0f9ad2b8a9e81bcc33b15a525a1e |
|  3 | George |   0 | INSERT          | False             | b98ad609fffdd6f00369485a896c52ca93b92b1f |
|  4 | Betty  |   0 | INSERT          | False             | e554e6e68293a51d8e69d68e9b6be991453cc901 |
|  5 | Sally  |   0 | INSERT          | False             | c94366cf8a4270cf299b049af68a04401c13976d |
+----+--------+-----+-----------------+-------------------+------------------------------------------+

- Примените взнос в размере 90 долларов США к участникам, которые присоединились к тренажерному залу после окончания бесплатного пробного периода: объединитесь с участниками m, используя (выберите id, dt из регистрационных номеров, где dateiff(day, '2018-08-15'::date, s.dt::date)<-30) s на m.id = s.id при совпадении затем обновить набор m.fee = 90;

выберите * из участников;

+----+--------+-----+
| ID | NAME   | FEE |
|----+--------+-----|
|  1 | Joe    |  90 |
|  2 | Jane   |  90 |
|  3 | George |  90 |
|  4 | Betty  |   0 |
|  5 | Sally  |   0 |
+----+--------+-----+

- Поток записывает обновленный столбец FEE как набор вставок - а не удаляет и вставляет, потому что содержимое потока - еще не было использовано select * from member_check;

+----+--------+-----+-----------------+-------------------+------------------------------------------+
| ID | NAME   | FEE | METADATA$ACTION | METADATA$ISUPDATE | METADATA$ROW_ID                          |
|----+--------+-----+-----------------+-------------------+------------------------------------------|
|  1 | Joe    |  90 | INSERT          | False             | 957e84b34ef0f3d957470e02bddccb027810892c |
|  2 | Jane   |  90 | INSERT          | False             | b00168a4edb9fb399dd5cc015e5f78cbea158956 |
|  3 | George |  90 | INSERT          | False             | 75206259362a7c89126b7cb039371a39d821f76a |
|  4 | Betty  |   0 | INSERT          | False             | 9b225bc2612d5e57b775feea01dd04a32ce2ad18 |
|  5 | Sally  |   0 | INSERT          | False             | 5a68f6296c975980fbbc569ce01033c192168eca |
+----+--------+-----+-----------------+-------------------+------------------------------------------+

- Создайте таблицу для хранения сведений о членах в производственной среде, создайте или замените таблицу members_prod (номер идентификатора (8) не равен нулю, имя varchar(255) по умолчанию null, номер комиссии (3) null);

- Вставьте первый пакет потоковых данных в производственную таблицу, вставьте в members_prod(id,name,fee) выберите id, name, fee из member_check, где метаданные $action = 'INSERT' и id=1;

в приведенном выше операторе вставки я использовал только одну запись, т.е. id=1 из набора потоковых данных (member_check), но после этого мой набор потоковых данных стал пустым и готов к новому смещению.

Это означает, что Snowflake не проверяет, какие записи потребляются из набора данных потока. Как только любой оператор DML запускается в наборе данных потока, Snowflake предполагает, что все записи были использованы, и очищает набор данных потока. (Сик!!!)

2 ответа

Можно обрабатывать поток порциями, но вы должны использовать явные транзакции.

      BEGIN WORK;

INSERT INTO table1 SELECT FROM your_stream WHERE <condition1>;
INSERT INTO table2 SELECT FROM your_stream WHERE <condition2>;

COMMIT;

Поток будет очищен после фиксации.

Потоки - все еще довольно новая функция, и это меня тоже удивило, но любой оператор DML увеличивает смещение для потока. Мое открытие связано с неудачной транзакцией в хранимой процедуре, которая опустошила поток.

Наилучший вариант сейчас - либо использовать все изменения в потоке сразу в рамках одной транзакции, либо вместо этого использовать функцию ИЗМЕНЕНИЙ из путешествия во времени.

Другие вопросы по тегам