Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Представления для чтения

Представление для чтения — это снимок всей базы данных в оперативной памяти, на который не влияют последующие изменения данных. Представления для чтения обеспечивают доступ к спейсам базы данных и их индексам. Получать данные можно с помощью тех же операций select и pairs.

Представления для чтения можно использовать для выполнения сложных аналитических запросов. Это снижает нагрузку на основную базу данных и повышает RPS для отдельного экземпляра Tarantool.

Для оптимизации потребления памяти и производительности Tarantool создает представления для чтения с использованием механизма copy-on-write. При этом дублирование всего набора данных не требуется: Tarantool дублирует только те блоки, которые были изменены после создания представления для чтения.

Ограничения

Представления для чтения имеют следующие ограничения:

Работа с представлениями для чтения

Создание представления для чтения

Чтобы создать представление для чтения, вызовите функцию 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.606817935  signature: 24  is_system: false  status: open  vclock: {1: 24}  name: read_view1  id: 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, как описано в Использование операций с данными (создание вторичных индексов можно пропустить).

  1. Вставьте тестовые данные.

    tarantool> bands:insert{1, 'Roxette', 1986}           bands:insert{2, 'Scorpions', 1965}           bands:insert{3, 'Ace of Base', 1987}           bands:insert{4, 'The Beatles', 1960}
  2. Создайте представление для чтения, вызвав функцию open.

    Затем убедитесь, что статус представления для чтения — open.

    tarantool> read_view1 = box.read_view.open({name = 'read_view1'})tarantool> read_view1.status---- open...
  3. Измените данные в базе данных с помощью операций delete и update.

    tarantool> bands:delete(4)---- [4, 'The Beatles', 1960]...tarantool> bands:update({2}, {{'=', 2, 'Pink Floyd'}})---- [2, 'Pink Floyd', 1965]...
  4. Выполните запрос к представлению для чтения, чтобы убедиться, что оно содержит снимок данных до обновления базы данных.

    tarantool> read_view1.space.bands:select()---- - [1, 'Roxette', 1986]  - [2, 'Scorpions', 1965]  - [3, 'Ace of Base', 1987]  - [4, 'The Beatles', 1960]...
  5. Закройте представление для чтения.

    tarantool> read_view1:close()---...