Команда STREAM
- Общее описание
- Простой пример
- Перенос данных
- Многопоточный перенос данных
- Формирование сообщений из плана обмена с удалением обработанных изменений
Общее описание
Команда STREAM аналогична команде SELECT - полностью реализует её синтаксис и функциональные возможности: общие табличные выражения, все виды соединений и так далее. Отличаются эти две команды только тем, каким образом процессор DaJet Script их обрабатывает.
Результат выполнения команды SELECT целиком возвращается в переменную типа object
или array
среды выполнения DaJet Script, то есть в оперативную память программы. Во втором случае, в зависимости от размера выборки данных, это может привести к значительному или даже неприемлемому потреблению ресурсов. После выполнения команды SELECT управление передаётся следующей команде - скрипт выполняется линейно.
Поведение команды STREAM принципиально иное - результат её выполнения возвращается из базы данных не весь сразу, а как поток: циклически по одной записи за один раз. Таким образом команда STREAM может возвращать данные только в переменную типа object
. Такая переменная используется DaJet Script как буфер памяти, через который можно “прокачать” огромные объёмы данных. Гораздо большие, чем объём доступной оперативной памяти.
Более того DaJet Script интерпретирует команду STREAM и все, следующие за ней до конца текущего блока выполнения команды, как единый конвейер для обработки потока объектов
. Например, если команда STREAM расположена внутри USE (наиболее очевидный и естественный вариант), то конвейер будет завершаться соответствующим ключевым словом END именно той же самой команды USE. Менее очевидным, но тем не менее возможным вариантом, будет размещение команды STREAM в блоках таких команд, как IF, WHILE или FOR. Однако принцип построения конвейера будет тот же - до конца текущего блока. Например, для блока THEN команды IF это будут ключевые слова ELSE или END.
Схематически процесс выполнения команды STREAM можно выразить следующим образом:
Таким образом команда STREAM реализует концепцию потокового обмена и обработки данных DaJet Script. Другими командами, реализующими данную концепцию аналогичным образом, являются UPDATE и CONSUME.
Использовать команду STREAM рекомендуется для сценариев переноса данных, предварительного тестирования команды CONSUME, обработки больших объёмов данных и аналогичных задач.
Простой пример
DECLARE @record object
DECLARE @counter number = 0
PRINT 'Start streaming'
USE 'mssql://server/database'
STREAM TOP 10
Ссылка, Код, Наименование
INTO @record
FROM Справочник.Номенклатура
ORDER BY Ссылка ASC
PRINT JSON(@record)
SET @counter = @counter + 1
END
PRINT 'Streamed ' + @counter + ' records'
-- Результат выполнения скрипта
[2024-11-09 15:45:00] Start streaming
[2024-11-09 15:45:00] {"Код":"00000001","Наименование":"Товар 1"}
[2024-11-09 15:45:00] {"Код":"00000002","Наименование":"Товар 2"}
[2024-11-09 15:45:00] {"Код":"00000003","Наименование":"Товар 3"}
[2024-11-09 15:45:00] {"Код":"00000004","Наименование":"Товар 4"}
[2024-11-09 15:45:00] {"Код":"00000005","Наименование":"Товар 5"}
[2024-11-09 15:45:00] {"Код":"00000006","Наименование":"Товар 6"}
[2024-11-09 15:45:00] {"Код":"00000007","Наименование":"Товар 7"}
[2024-11-09 15:45:00] {"Код":"00000008","Наименование":"Товар 8"}
[2024-11-09 15:45:00] {"Код":"00000009","Наименование":"Товар 9"}
[2024-11-09 15:45:00] {"Код":"00000010","Наименование":"Товар 10"}
[2024-11-09 15:45:00] Streamed 10 records