Модификация данных | Tcs

Version:

0.x
Руководство пользователя Модификация данных

Модификация данных

Для выполнения операций модификации данных в Tarantool Column Store используются HTTP-запросы на адреса:

  • /insert (или /v2/insert)– вставка данных;

  • /sql – вставка данных из выборки;

  • /update – обновление данных.

Важно

Удаление данных вручную не поддерживается. Данные вытесняются автоматически при достижении предельного количества хранимых значений. Подробнее см. Удаление данных.

Вставка данных

Для вставки объектов в таблицу используйте POST-запрос на HTTP-адрес /insert или /v2/insert.

Примечание

Разница между адресами /insert и /v2/insert состоит в том, что запросы, направляемые на адрес /insert всегда приводят к вставке данных в буфер записи таблицы, а запросы, направляемые на адрес /v2/insert приводят к вставке данных или в буфер записи или в колоночное хранилище таблицы, в зависимости от параметров запроса.

В одном запросе можно передавать как один, так и несколько объектов для вставки. TCS обрабатывает объекты в том порядке, в каком они указаны в запросе. При вставке большого числа объектов наилучшая производительность достигается, когда число объектов в одном запросе на вставку совпадает с размером блока хранения, то есть равно 8192.

В значениях полей можно указывать как конкретные значения, так и null.

В теле запроса укажите в формате JSON:

  • название таблицы;

  • описания объектов для вставки в виде пар колонка:значение.

Пример:

POST http://localhost:7777/insert HTTP/1.1
Content-Type: application/json

{
  "table_name": "db.public.users",
  "rows": [
    {
      "id": "1",
      "username": "alice",
      "is_deleted": false,
      "created_at": 1710324848000
    },
    {
      "id": "2",
      "username": "bob",
      "is_deleted": false,
      "created_at": 1710324849000
    }
  ]
}

Примечание

В схеме по умолчанию tcs.public можно указывать в table_name только имя таблицы без каталога и схемы.

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

Также для запроса на вставку можно указать режим атомарной вставки.

При вставке в колоночный буфер (engine: memcs) доступны два режима вставки:

  • вставка строк как массивов формата Apache Arrow (по умолчанию);

  • вставка строк как кортежей формата Tarantool (см. инструкцию по переключению на этот режим вставки).

В режиме вставки строк как массивов Apache Arrow производительность пакетных вставок в колоночный буфер может быть выше, чем в случае пакетных вставок в строчный буфер (engine: memtx). При этом чем больше размер пакета, тем больше преимущество в производительности вставок у колоночного буфера перед строчным. Однако в этом режиме вставки снижается производительность одиночных вставок.

Вставка данных из выборки (insert into select)

Для вставки в таблицу объектов из выборки используйте POST-запрос на HTTP-адрес /sql.

В теле запроса укажите текст SQL-запроса, например:

POST http://localhost:7777/sql HTTP/1.1
Content-Type: application/json

INSERT INTO names SELECT name FROM users

В операциях вставки из выборки можно использовать все имеющиеся в TCS возможности SELECT-запросов, например осуществлять выборку из нескольких таблиц (оператор JOIN) и задавать условия с помощью оператора WHERE. Подробнее см. Справочник по SQL > Инструкция SELECT.

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

  • таблицу names, которая содержит 2 поля, name и age (именно в таком порядке они объявлены в модели данных);

  • таблицу users, которая содержит поля address, age, name и прочие.

Следующий запрос составлен с учетом порядка полей в этих таблицах:

POST http://localhost:7777/sql HTTP/1.1
Content-Type: application/json
INSERT INTO names SELECT name, age FROM users

Обновление данных

Для обновления объектов в таблице используйте POST-запрос на HTTP-адрес /update.

Адрес /update поддерживает 2 типа запросов на обновление данных:

  1. Сканирующее обновление данных в таблицах (fullscan), которое можно использовать в общих случаях.

  2. Обновление данных в таблицах с использованием поиска по индексам колонок (index-based), которое полезно использовать при определенных условиях.

В теле запроса укажите в формате JSON:

  • название таблицы;

  • операции обновления;

  • критерий выбора объектов для обновления.

Пример запроса на обновление данных:

POST http://localhost:7777/update
Content-Type: application/json

{
  "table_name": "db.public.users",
  "ops": [
    {
      "op": "set",
      "column_name": "is_deleted",
      "value": true
    }
  ],
  "conditions": [
    {
      "column_name": "username",
      "value": "alice"
    }
  ]
}

Поддерживаются следующие операции обновления (ops.op):

  • set – установка нового значения;

  • append – добавление подстроки в строчное значение;

  • add и sub – сложение и вычитание для числовых значений.

Примеры:

{
    "op": "append",
    "column_name": "username",
    "value": "81_"
},
{
    "op": "add",
    "column_name": "age",
    "value": 1
},
{
    "op": "sub",
    "column_name": "balance",
    "value": 7
}

В качестве критерия выбора объектов для обновления (conditions) используется совпадение значения колонки с указанными значениями (value). Вы можете указать одно или несколько значений:

  • одно значение:

    {
      "column_name": "username",
      "value": "alice"
    }
    
  • несколько значений в виде массива:

    {
      "column_name": "username",
      "value": [
        "alice",
        "bob"
      ]
    }
    

Чтобы обновить все объекты в таблице, укажите пустое условие выбора объектов: "conditions": [].

Операция set позволяет указывать null в качестве нового значения поля. Например:

{
    "table_name": "db.public.users",
    "ops": [
        {
            "op": "set",
            "column_name": "created_at",
            "value": null
        }
    ],
    "conditions": [
        {
            "column_name": "username",
            "value": [
                "alice"
            ]
        }
    ]
}

Можно обновлять данные в строках с пропущенными полями. Если поле, подлежащее обновлению, отсутствует в записи, то оно принимается равным нулевому значению своего типа (для чисел – 0, для строк – пустая строка '') и подлежит обновлению. При необходимости это поведение можно изменить с помощью флага ignore_nulls. Если он задан, то операция обновления не будет произведена, если поле, подлежащее обновлению, окажется пустым. Например:

{
  "table_name": "db.public.users",
  "ops": [
    {
      "op": "set",
      "column_name": "is_deleted",
      "value": true
    }
  ],
  "conditions": [
    {
      "column_name": "username",
      "value": "alice"
    }
  ],
  "ignore_nulls": true
}

В данном примере, если значение is_deleted окажется пустым, то оно не будет обновлено.

В результате запроса возвращается число записей, в которых было обновлено хотя бы одно поле.

По умолчанию запросы на HTTP-адрес /update производят обновление данных сразу в двух местах: в буфере записи и в колоночном хранилище. Обновление данных происходит атомарно (в одной транзакции). При необходимости можно отключить обновление колоночного хранилища:

  • для конкретного запроса, указав в заголовке запроса параметр "x-tcs-disable_column_update": "true";

  • для всех запросов на обновление, указав в конфигурации TCS параметр disable_column_update: true.

В результате по итогам выполнения запроса будет обновляться только буфер записи.

Примечание

В текущей версии TCS для запросов на обновление колоночного хранилища не поддерживается ускоренное обновление представления для чтения. Актуальные данные становятся доступными для чтения не сразу после произведенной операции, а только тогда, когда текущее представление для чтения будет обновлено в плановом порядке.

Примечание

Если для таблицы используется колоночный буфер записи (engine: memcs), то нужно иметь в виду, что операция обновления по колоночному буферу всегда выполняется в режиме полного сканирования (full scan), без поиска строк для обновления по индексу. Поэтому любое обновление по колоночному буферу будет менее производительным, чем обновление по индексу по строчному буферу (engine: memtx). При этом разница в производительности операций обновления в режиме full scan на разных видах буферов будет минимальна.

Обновление данных с использованием индексов

Если в поле conditions запроса присутствуют колонки с параметром indexed: true, то при POST-запросе на HTTP-адрес /update можно ускорить первичный поиск значений в таких колонках, используя их индексы. Для этого в запросе нужно указать заголовок x-tcs-index_search: true:

POST http://localhost:7777/update
Content-Type: application/json
x-tcs-index_search: true

{
  "table_name": "db.public.users",
  "ops": [
    {
      "op": "set",
      "column_name": "is_deleted",
      "value": true
    }
  ],
  "conditions": [
    {
      "column_name": "username",
      "value": "alice"
    }
  ]
}

При использовании заголовка x-tcs-index_search: true в теле запроса можно указать параметр reversed: true. Этот параметр запустит индексный поиск в обратном порядке. При этом сама модификация не изменится и будет производиться поблочно из найденных элементов, в случайном порядке:

POST http://localhost:7777/update
Content-Type: application/json
x-tcs-index_search: true

{
  "table_name": "db.public.users",
  "ops": [
    {
      "op": "set",
      "column_name": "is_deleted",
      "value": true
    }
  ],
  "conditions": [
    {
      "column_name": "username",
      "value": "alice"
    }
  ],
  "reversed": true
}

Если в поле conditions запроса указаны колонки с разным значением параметра indexed (indexed: true и indexed: false), то поиск произведется сначала по индексным, а затем по неиндексным колонкам.

Для повышения производительности операции со включенным индексным поиском придерживайтесь следующих рекомендаций:

  • Рекомендуется строить поле conditions таким образом, чтобы идущие первыми условия максимально уменьшали последующую выборку;

  • Максимальная производительность индексного поиска достигается в конфигурации: 1 условие в поле condition, при котором поиск происходит по индексной колонке и ищется 1 уникальная запись;

  • Используйте индексный поиск для колонок, у которых указан бесконечный index_depth или где известно, что index_depth превышает количество записей в колонке;

  • Не включайте заголовок x-tcs-index_search: true для большой выборки (половина или более записей);

  • Заголовок x-tcs-index_search: true не рекомендуется применять к колонкам, которые дают мало уникальных значений (колонки с типами данных bool, i8, u8), поскольку он может вызвать задержку отклика. Однако если условие, предшествующее индексному поиску, сильно отфильтрует записи и даст, к примеру, 1000 записей из миллиона или миллиарда, то индексный поиск не приведет к задержке.

Важно

  • Не используйте заголовок x-tcs-index_search: true для операций /update с колонками, у которых глубина индекса меньше количества существующих записей в колоночном хранилище. При таких условиях поиск может не дойти до нужной записи, а значит обновление не будет выполнено. Это приведёт к неконсистентности данных и к неочевидному состоянию, при котором некоторые поля, которых не было в индексах, не обновились после успешного выполнения запроса.

  • При включенном индексном поиске необходимо указывать в поле conditions условия для поиска по индексным полям, у которых установлены не-null значения. В противном случае поиск или не отработает, или вернёт сообщение об ошибке.

Удаление данных

Важно

Удаление данных вручную не поддерживается.

Found what you were looking for?
Feedback