Представления для чтения
Представление для чтения — это снимок всей базы данных в оперативной
памяти, на который не влияют последующие изменения данных.
Представления для чтения обеспечивают доступ к спейсам базы данных и их индексам. Получать данные
можно с помощью тех же операций select и pairs.
Представления для чтения можно использовать для выполнения сложных аналитических запросов. Это снижает нагрузку на основную базу данных и повышает RPS для отдельного экземпляра Tarantool.
Для оптимизации потребления памяти и производительности Tarantool создает представления для чтения с использованием механизма copy-on-write. При этом дублирование всего набора данных не требуется: Tarantool дублирует только те блоки, которые были изменены после создания представления для чтения.
Представления для чтения имеют следующие ограничения:
-
Поддерживается только движок memtx.
-
Поддерживаются только индексы TREE, HASH и функциональные.
Чтобы создать представление для чтения, вызовите функцию box.read_view.open().
В примере ниже показано, как создать представление для чтения с именем read_view1.
tarantool> read_view1 = box.read_view.open({name = 'read_view1'})
После создания представления для чтения информацию о нем можно получить, вызвав read_view_object:info().
tarantool> read_view1:info()---- timestamp: 66.606817935signature: 24is_system: falsestatus: openvclock: {1: 24}name: read_view1id: 1...
Чтобы получить список всех созданных представлений для чтения, вызовите функцию box.read_view.list().
После создания представления для чтения доступ к спейсам базы данных можно
получить через поле read_view_object.space.
Это поле обеспечивает доступ к объекту спейса, через который доступны
методы select, get и pairs с
тем же поведением, что и у соответствующих методов box.space.
В примере ниже показано, как выбрать 4 записи из спейса bands:
tarantool> read_view1.space.bands:select({}, {limit = 4})---- - [1, 'Roxette', 1986]- [2, 'Scorpions', 1965]- [3, 'Ace of Base', 1987]- [4, 'The Beatles', 1960]...
Аналогично можно получать данные по конкретному индексу.
tarantool> read_view1.space.bands.index.year:select({}, {limit = 4})---- - [4, 'The Beatles', 1960]- [2, 'Scorpions', 1965]- [1, 'Roxette', 1986]- [3, 'Ace of Base', 1987]...
В представлениях для чтения поддерживается пагинация теми же способами, что
и в запросах select к спейсам: с помощью аргументов fetch_pos и
after. Чтобы получить позицию курсора после выполнения запроса к
представлению для чтения, задайте значение true для параметра fetch_pos:
tarantool> result, position = read_view1.space.bands:select({}, { limit = 3, fetch_pos = true })---...tarantool> result---- - [1, 'Roxette', 1986]- [2, 'Scorpions', 1965]- [3, 'Ace of Base', 1987]...tarantool> position---- kQM...
Затем передайте эту позицию в параметре after запроса, чтобы получить
следующую порцию данных:
tarantool> read_view1.space.bands:select({}, { limit = 3, after = position })---- - [4, 'The Beatles', 1960]- [5, 'Pink Floyd', 1965]- [6, 'The Rolling Stones', 1962]...
Когда представление для чтения больше не нужно, закройте его с помощью метода read_view_object:close(), так как представление для чтения может потреблять значительный объем памяти.
tarantool> read_view1:close()---...
В противном случае представление для чтения закрывается неявно при сборке объекта представления для чтения сборщиком мусора Lua.
После закрытия представления для чтения его статус устанавливается
в значение closed. При попытке его использования возникает ошибка.
В приведенном ниже сеансе Tarantool показано, как открыть представление для чтения, получить данные из этого представления и закрыть его. Чтобы повторить эти шаги, необходимо выполнить начальную загрузку экземпляра Tarantool, как описано в Использование операций с данными (создание вторичных индексов можно пропустить).
-
Вставьте тестовые данные.
tarantool> bands:insert{1, 'Roxette', 1986}bands:insert{2, 'Scorpions', 1965}bands:insert{3, 'Ace of Base', 1987}bands:insert{4, 'The Beatles', 1960} -
Создайте представление для чтения, вызвав функцию
open.Затем убедитесь, что статус представления для чтения —
open.tarantool> read_view1 = box.read_view.open({name = 'read_view1'})tarantool> read_view1.status---- open... -
Измените данные в базе данных с помощью операций
deleteиupdate.tarantool> bands:delete(4)---- [4, 'The Beatles', 1960]...tarantool> bands:update({2}, {{'=', 2, 'Pink Floyd'}})---- [2, 'Pink Floyd', 1965]... -
Выполните запрос к представлению для чтения, чтобы убедиться, что оно содержит снимок данных до обновления базы данных.
tarantool> read_view1.space.bands:select()---- - [1, 'Roxette', 1986]- [2, 'Scorpions', 1965]- [3, 'Ace of Base', 1987]- [4, 'The Beatles', 1960]... -
Закройте представление для чтения.
tarantool> read_view1:close()---...