SingleStore (MemSQL) коннектор#

Примечание

Ниже приведена оригинальная документация Trino. Скоро мы ее переведем на русский язык и дополним полезными примерами.

The SingleStore (formerly known as MemSQL) connector allows querying and creating tables in an external SingleStore database.

Требования#

To connect to SingleStore, you need:

  • SingleStore version 7.1.4 or higher.

  • Network access from the Trino coordinator and workers to SingleStore. Port 3306 is the default port.

Конфигурация#

To configure the SingleStore connector, create a catalog properties file in etc/catalog named, for example, example.properties, to mount the SingleStore connector as the example catalog. Create the file with the following contents, replacing the connection properties as appropriate for your setup:

connector.name=singlestore
connection-url=jdbc:singlestore://example.net:3306
connection-user=root
connection-password=secret

The connection-url defines the connection information and parameters to pass to the SingleStore JDBC driver. The supported parameters for the URL are available in the SingleStore JDBC driver documentation.

The connection-user and connection-password are typically required and determine the user credentials for the connection, often a service user. You can use secrets to avoid actual values in the catalog properties files.

Connection security#

If you have TLS configured with a globally-trusted certificate installed on your data source, you can enable TLS between your cluster and the data source by appending a parameter to the JDBC connection string set in the connection-url catalog configuration property.

Enable TLS between your cluster and SingleStore by appending the useSsl=true parameter to the connection-url configuration property:

connection-url=jdbc:singlestore://example.net:3306/?useSsl=true

For more information on TLS configuration options, see the JDBC driver documentation.

Multiple SingleStore servers#

You can have as many catalogs as you need, so if you have additional SingleStore servers, simply add another properties file to etc/catalog with a different name (making sure it ends in .properties). For example, if you name the property file sales.properties, Trino will create a catalog named sales using the configured connector.

Общие параметры конфигурации#

Общие параметры конфигурации каталога приведены в таблице ниже:

Название

Описание

Значение по умолчанию

case-insensitive-name-matching

Включить поддержку case insensitive идентификаторов.

false

case-insensitive-name-matching.cache-ttl

Время жизни закэшированных метаданных о case insensitive идентификаторах.

1m

case-insensitive-name-matching.config-file

Путь к файлу конфигурации в формате JSON, который позволяет разрешать конфликты имен между case insensitive схемами и таблицами.

null

case-insensitive-name-matching.config-file.refresh-period

Частота проверки обновлений файла case-insensitive-name-matching.config-file.

0 (refresh disabled)

metadata.cache-ttl

Время жизни закэшированных метаданных. Положительное значение включает кэширование.

0 (caching disabled)

metadata.cache-missing

Кэшировать ли информацию о том, что для используемых таблиц и колонок отсутствуют статистики. Включение данного параметра может ускорить планирование некоторых запросов. Однако, если информация об отсутствии статистик для конкретного объекта СУБД закэширована, но статистики стали доступны позднее (например, была запущена команда ANALYZE), CedrusData не сможет использовать статистики, пока не истечет время жизни закэшированной записи в соответствии с metadata.cache-ttl.

false

metadata.cache-maximum-size

Максимальное количество объектов, хранящихся в metadata cache.

10000

write.batch-size

Максимальное количество команд в batch операциях записи данных. Изменение данного параметра не рекомендовано, так как оно может негативно сказаться на производительности.

1000

dynamic-filtering.enabled

Использовать ли динамические фильтры при работе с JDBC источником.

true

dynamic-filtering.wait-timeout

Максимальное время ожидания готовности динамических фильтров с build стороны оператора join перед запуском JDBC запроса к источнику. Увеличение таймаута может позволить CedrusData выполнить запрос к источнику с более селективными фильтрами, но в то же время может увеличить latency некоторых запросов.

20s

Domain compaction threshold#

CedrusData позволяет делегировать применение предикатов источнику данных (pushdown). Во многих случаях это существенно уменьшает количество записей, которые возвращает источник, и улучшает производительность. Однако, pushdown сложных предикатов (например, выражение IN со множеством значений) может негативно сказаться на производительности. При достижении порога сложности предиката, CedrusData автоматически преобразует предикат к более компактной форме. Например, предикат a IN (1, 2, ..., 100) может быть преобразован в a BETWEEN 1 AND 100. В большинстве случаев такое преобразование улучшает производительность запросов. Однако, в некоторых случаях может быть предпочтительнее передать сложный предикат в неизменном виде, так как источник данных может его обработать эффективнее, чем преобразованный предикат.

Вы можете увеличить значение порога сложности, что бы CedrusData передавал предикат в источник без изменений. Используйте для этого параметр конфигурации каталога domain-compaction-threshold или параметр сессии domain_compaction_threshold catalog session property.

Процедуры#

  • system.flush_metadata_cache()

    Очистить кэш JDBC метаданных. Команда ниже очищает кэш метаданных всех схем в каталоге example.

    USE example.example_schema;
    CALL system.flush_metadata_cache();
    

Case insensitive идентификаторы#

Когда параметр конфигурации case-insensitive-name-matching установлен в true, CedrusData может обращаться к схемам и таблицам источника, имена которых на являются lowercase. Для этого CedrusData сопоставляет lowercase название схемы или таблицы с ее реальным названием в источнике данных. Например, если таблица в источнике данных имеет название Customers, CedrusData позволяет обратиться к ней по имени customers.

В случае, если источник имеет несколько объектов, имена которых отличаются только регистром (например, Customer и customer), CedrusData не может автоматически определить, к какому объекту обращаться.

В этом случае вы можете явно задать сопоставление имен в помощью файла в JSON формате, путь к которому следует указать в параметре конфигурации каталога case-insensitive-name-matching.config-file. Например:

{
  "schemas": [
    {
      "remoteSchema": "CaseSensitiveName",
      "mapping": "case_insensitive_1"
    },
    {
      "remoteSchema": "cASEsENSITIVEnAME",
      "mapping": "case_insensitive_2"
    }],
  "tables": [
    {
      "remoteSchema": "CaseSensitiveName",
      "remoteTable": "tablex",
      "mapping": "table_1"
    },
    {
      "remoteSchema": "CaseSensitiveName",
      "remoteTable": "TABLEX",
      "mapping": "table_2"
    }]
}

В данном случае, при обращении из CedrusData к схеме case_insensitive_1, запрос будет переадресован к схеме источника CaseSensitiveName, а при обращении из CedrusData к таблице case_insensitive_1.table_1 запрос будет переадресован к таблице источника CaseSensitiveName.tablex.

По умолчанию если вы изменяете содержимое данного файла, экземпляр CedrusData должен быть перезапущен, что бы применить изменения. Если вы хотите изменять содержимое файла без перезапуска CedrusData, вы можете установить параметр конфигурации case-insensitive-name-mapping.refresh-period, который определяет частоту повторного чтения данного файла.

case-insensitive-name-mapping.refresh-period=30s

Нетракзакционный INSERT#

Коннектор поддерживает добавление записей в источник с помощью команды INSERT statements. По умолчанию CedrusData осуществляет запись данных, используя временную таблицу, что обеспечивает транзакционные гарантии: в источник будут записаны либо все данные, либо не будет записано ничего (в случае возникновения ошибки). Однако,

Вы можете осуществлять запись данных в таблицу источника напрямую, минуя временную таблицу. Для этого установите параметр конфигурации каталога insert.non-transactional-insert.enabled или параметр сессии non_transactional_insert в значение true. Изменение данного параметра может улучшает производительность записи, но так же может привести данные в источнике в неопределенное состояние при возникновении ошибки в момент записи. Например, если при вставке 10 записей в таблицу источника в середине процесса произошла ошибка, откат вставки уже сохраненных записей может оказаться невозможным, и после выполнения команды источник будет содержать только часть записей.

Querying SingleStore#

The SingleStore connector provides a schema for every SingleStore database. You can see the available SingleStore databases by running SHOW SCHEMAS:

SHOW SCHEMAS FROM example;

If you have a SingleStore database named web, you can view the tables in this database by running SHOW TABLES:

SHOW TABLES FROM example.web;

You can see a list of the columns in the clicks table in the web database using either of the following:

DESCRIBE example.web.clicks;
SHOW COLUMNS FROM example.web.clicks;

Finally, you can access the clicks table in the web database:

SELECT * FROM example.web.clicks;

If you used a different name for your catalog properties file, use that catalog name instead of example in the above examples.

Type mapping#

Because Trino and Singlestore each support types that the other does not, this connector modifies some types when reading or writing data. Data types may not map the same way in both directions between Trino and the data source. Refer to the following sections for type mapping in each direction.

Singlestore to Trino type mapping#

The connector maps Singlestore types to the corresponding Trino types following this table:

Singlestore to Trino type mapping#

Singlestore type

Trino type

Notes

BIT

BOOLEAN

BOOLEAN

BOOLEAN

TINYINT

TINYINT

TINYINT UNSIGNED

SMALLINT

SMALLINT

SMALLINT

SMALLINT UNSIGNED

INTEGER

INTEGER

INTEGER

INTEGER UNSIGNED

BIGINT

BIGINT

BIGINT

BIGINT UNSIGNED

DECIMAL(20, 0)

DOUBLE

DOUBLE

REAL

DOUBLE

DECIMAL(p, s)

DECIMAL(p, s)

See Singlestore DECIMAL type handling

CHAR(n)

CHAR(n)

TINYTEXT

VARCHAR(255)

TEXT

VARCHAR(65535)

MEDIUMTEXT

VARCHAR(16777215)

LONGTEXT

VARCHAR

VARCHAR(n)

VARCHAR(n)

LONGBLOB

VARBINARY

DATE

DATE

TIME

TIME(0)

TIME(6)

TIME(6)

DATETIME

TIMESTAMP(0)

DATETIME(6)

TIMESTAMP(6)

JSON

JSON

No other types are supported.

Trino to Singlestore type mapping#

The connector maps Trino types to the corresponding Singlestore types following this table:

Trino to Singlestore type mapping#

Trino type

Singlestore type

Notes

BOOLEAN

BOOLEAN

TINYINT

TINYINT

SMALLINT

SMALLINT

INTEGER

INTEGER

BIGINT

BIGINT

DOUBLE

DOUBLE

REAL

FLOAT

DECIMAL(p, s)

DECIMAL(p, s)

See Singlestore DECIMAL type handling

CHAR(n)

CHAR(n)

VARCHAR(65535)

TEXT

VARCHAR(16777215)

MEDIUMTEXT

VARCHAR

LONGTEXT

VARCHAR(n)

VARCHAR(n)

VARBINARY

LONGBLOB

DATE

DATE

TIME(0)

TIME

TIME(6)

TIME(6)

TIMESTAMP(0)

DATETIME

TIMESTAMP(6)

DATETIME(6)

JSON

JSON

No other types are supported.

Обработка DECIMAL типов#

Тип данных DECIMAL без явного указания precision ил scale сопоставляется с типом данных CedrusData DECIMAL с precision 38 и scale 0. Scale может быть изменен путем установки параметра конфигурации коннектора decimal-mapping или параметра сессии decimal_mapping в значение allow_overflow. В этом случае scale типа будет равен значению параметра конфигурации коннектора decimal-default-scale или параметра сессии decimal_default_scale. Precision всегда равен 38.

Если DECIMAL значение не умещается в заданные precision и scale без округления, CedrusData сгенерирует ошибку. Вы можете изменить данное поведение, разрешив автоматическое округление значение с помощью параметра конфигурации коннектора decimal-rounding-mode или параметра сессии decimal_rounding_mode. Допустимые значения: UNNECESSARY (the default), UP, DOWN, CEILING, FLOOR, HALF_UP, HALF_DOWN, HALF_EVEN. Данные значения соответствуют поведению RoundingMode в Java 17.

Конфигурация приведения типов#

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

Название

Описание

Значение по умолчанию

unsupported-type-handling

Как обрабатывать колонки неподдерживаемых типов: * IGNORE, не обрабатывать колонку. * CONVERT_TO_VARCHAR, привести значение колонки к VARCHAR неограниченной длины. Соответствующий параметр сессии: unsupported_type_handling.

IGNORE

jdbc-types-mapped-to-varchar

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

SQL support#

The connector provides read access and write access to data and metadata in a SingleStore database. In addition to the globally available and read operation statements, the connector supports the following features:

SQL DELETE#

Команда DELETE с выражением WHERE работает только в случае, когда выполнение предиката может быть полностью делегировано источнику.

ALTER TABLE#

Коннектор поддерживает переименование таблиц только в пределах одной схемы.

Следующая команда поддерживается коннектором, так как переименовывает таблицу в пределах одной схемы.

ALTER TABLE example.schema_one.table_one RENAME TO example.schema_one.table_two

Следующая команда не поддерживается коннектором, так как меняет схему таблицы:

ALTER TABLE example.schema_one.table_one RENAME TO example.schema_two.table_two

Performance#

The connector includes a number of performance improvements, detailed in the following sections.

Pushdown#

The connector supports pushdown for a number of operations:

Примечание

Коннектор осуществляет pushdown для улучшения производительности запросов. Вместо с тем, коннектор не будет делать pushdown конкретной операции, если это может привести к некорректным результатам. Таким образом коннектор предпочитает корректность производительности. В некоторых случаях коннекторы могут предоставлять дополнительные параметры конфигурации, которые разрешают pushdown небезопасных операций, но только при явном указании соответствующего параметра пользователем.

Join pushdown#

The join-pushdown.enabled catalog configuration property or join_pushdown_enabled catalog session property control whether the connector pushes down join operations. The property defaults to false, and enabling join pushdowns may negatively impact performance for some queries.

Predicate pushdown support#

The connector does not support pushdown of any predicates on columns with textual types like CHAR or VARCHAR. This ensures correctness of results since the data source may compare strings case-insensitively.

In the following example, the predicate is not pushed down for either query since name is a column of type VARCHAR:

SELECT * FROM nation WHERE name > 'CANADA';
SELECT * FROM nation WHERE name = 'CANADA';