Oracle коннектор#
Примечание
Ниже приведена оригинальная документация Trino. Скоро мы ее переведем на русский язык и дополним полезными примерами.
The Oracle connector allows querying and creating tables in an external Oracle database. Connectors let Trino join data provided by different databases, like Oracle and Hive, or different Oracle database instances.
Требования#
To connect to Oracle, you need:
Oracle 12 or higher.
Network access from the Trino coordinator and workers to Oracle. Port 1521 is the default port.
Конфигурация#
To configure the Oracle connector as the example
catalog, create a file
named example.properties
in etc/catalog
. Include the following
connection properties in the file:
connector.name=oracle
# The correct syntax of the connection-url varies by Oracle version and
# configuration. The following example URL connects to an Oracle SID named
# "orcl".
connection-url=jdbc:oracle:thin:@example.net:1521:orcl
connection-user=root
connection-password=secret
The connection-url
defines the connection information and parameters to pass
to the JDBC driver. The Oracle connector uses the Oracle JDBC Thin driver,
and the syntax of the URL may be different depending on your Oracle
configuration. For example, the connection URL is different if you are
connecting to an Oracle SID or an Oracle service name. See the Oracle
Database JDBC driver documentation
for more information.
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.
Примечание
Oracle does not expose metadata comment via REMARKS
column by default
in JDBC driver. You can enable it using oracle.remarks-reporting.enabled
config option. See Additional Oracle Performance Extensions
for more details.
By default, the Oracle connector uses connection pooling for performance improvement. The below configuration shows the typical default values. To update them, change the properties in the catalog configuration file:
oracle.connection-pool.max-size=30
oracle.connection-pool.min-size=1
oracle.connection-pool.inactive-timeout=20m
To disable connection pooling, update properties to include the following:
oracle.connection-pool.enabled=false
Аутентификация в источнике данных#
Вы можете предоставить имя пользователя и пароль для подключения к источнику данных несколькими способами:
INLINE
- в файле конфигурации каталога (в том числе, используя секреты, что бы не хранить значения в открытом виде).FILE
- в отдельном properties файле.KEYSTORE
- в зашифрованном keystore файле.Из extra credentials клиента CedrusData.
The following table describes configuration properties for connection credentials:
Property name |
Description |
---|---|
|
Тип credential provider. Допустимые значения: |
|
Имя пользователя для подключения к источнику. Используется при |
|
Пароль для подключения к источнику. Используется при |
|
Путь к properties файлу, содержащему параметры |
|
Путь к keystore файлу, из которого следует прочитать имя пользователя и пароль. Используется при
|
|
Тип keystore файла. Например, |
|
Пароль к keystore файлу. |
|
Имя keystore entity, содержащей имя пользователя для подключения к источнику. |
|
Пароль к keystore entity, содержащей имя пользователя для подключения к источнику |
|
Имя keystore entity, содержащей пароль для подключения к источнику. |
|
Пароль к keystore entity, содержащей пароль для подключения к источнику. |
|
Имя параметра extra credentials, значение которого следует использовать в качестве имени пользователя.
См. |
|
Имя параметра extra credentials, значение которого следует использовать в качестве пароля.
См. |
Multiple Oracle servers#
If you want to connect to multiple Oracle servers, configure another instance of the Oracle connector as a separate catalog.
To add another Oracle catalog, create a new properties file. For example, if
you name the property file sales.properties
, Trino creates a catalog named
sales
.
Общие параметры конфигурации#
Общие параметры конфигурации каталога приведены в таблице ниже:
Название |
Описание |
Значение по умолчанию |
---|---|---|
|
Включить поддержку case insensitive идентификаторов. |
|
|
Время жизни закэшированных метаданных о case insensitive идентификаторах. |
|
|
Путь к файлу конфигурации в формате JSON, который позволяет разрешать конфликты имен между case insensitive схемами и таблицами. |
|
|
Частота проверки обновлений файла |
|
|
Время жизни закэшированных метаданных. Положительное значение включает кэширование. |
|
|
Кэшировать ли информацию о том, что для используемых таблиц и колонок отсутствуют статистики. Включение данного
параметра может ускорить планирование некоторых запросов. Однако, если информация об отсутствии статистик для
конкретного объекта СУБД закэширована, но статистики стали доступны позднее (например, была запущена
команда |
|
|
Максимальное количество объектов, хранящихся в metadata cache. |
|
|
Максимальное количество команд в batch операциях записи данных. Изменение данного параметра не рекомендовано, так как оно может негативно сказаться на производительности. |
|
|
Использовать ли динамические фильтры при работе с JDBC источником. |
|
|
Максимальное время ожидания готовности динамических фильтров с build стороны оператора join перед запуском JDBC запроса к источнику. Увеличение таймаута может позволить CedrusData выполнить запрос к источнику с более селективными фильтрами, но в то же время может увеличить latency некоторых запросов. |
|
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 Oracle#
The Oracle connector provides a schema for every Oracle database.
Run SHOW SCHEMAS
to see the available Oracle databases:
SHOW SCHEMAS FROM example;
If you used a different name for your catalog properties file, use that catalog
name instead of example
.
Примечание
The Oracle user must have access to the table in order to access it from Trino. The user configuration, in the connection properties file, determines your privileges in these schemas.
Examples#
If you have an Oracle database named web
, run SHOW TABLES
to see the
tables it contains:
SHOW TABLES FROM example.web;
To see a list of the columns in the clicks
table in the web
database, run either of the following:
DESCRIBE example.web.clicks;
SHOW COLUMNS FROM example.web.clicks;
To access the clicks table in the web database, run the following:
SELECT * FROM example.web.clicks;
Type mapping#
Because Trino and Oracle 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.
Oracle to Trino type mapping#
Trino supports selecting Oracle database types. This table shows the Oracle to Trino data type mapping:
Oracle database type |
Trino type |
Notes |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
No other types are supported.
Trino to Oracle type mapping#
Trino supports creating tables with the following types in an Oracle database. The table shows the mappings from Trino to Oracle data types:
Примечание
For types not listed in the table below, Trino can’t perform the CREATE
TABLE <table> AS SELECT
operations. When data is inserted into existing
tables, Oracle to Trino
type mapping is used.
Trino type |
Oracle database type |
Notes |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
No other types are supported.
Mapping numeric types#
An Oracle NUMBER(p, s)
maps to Trino’s DECIMAL(p, s)
except in these
conditions:
No precision is specified for the column (example:
NUMBER
orNUMBER(*)
), unlessoracle.number.default-scale
is set.Scale (
s
) is greater than precision.Precision (
p
) is greater than 38.Scale is negative and the difference between
p
ands
is greater than 38, unlessoracle.number.rounding-mode
is set to a different value thanUNNECESSARY
.
If s
is negative, NUMBER(p, s)
maps to DECIMAL(p + s, 0)
.
For Oracle NUMBER
(without precision and scale), you can change
oracle.number.default-scale=s
and map the column to DECIMAL(38, s)
.
Mapping datetime types#
Selecting a timestamp with fractional second precision (p
) greater than 3
truncates the fractional seconds to three digits instead of rounding it.
Oracle DATE
type stores hours, minutes, and seconds, so it is mapped
to Trino TIMESTAMP(0)
.
Предупреждение
Due to date and time differences in the libraries used by Trino and the
Oracle JDBC driver, attempting to insert or select a datetime value earlier
than 1582-10-15
results in an incorrect date inserted.
Mapping character types#
Trino’s VARCHAR(n)
maps to VARCHAR2(n CHAR)
if n
is no greater
than 4000. A larger or unbounded VARCHAR
maps to NCLOB
.
Trino’s CHAR(n)
maps to CHAR(n CHAR)
if n
is no greater than 2000.
A larger CHAR
maps to NCLOB
.
Using CREATE TABLE AS
to create an NCLOB
column from a CHAR
value
removes the trailing spaces from the initial values for the column. Inserting
CHAR
values into existing NCLOB
columns keeps the trailing spaces. For
example:
CREATE TABLE vals AS SELECT CAST('A' as CHAR(2001)) col;
INSERT INTO vals (col) VALUES (CAST('BB' as CHAR(2001)));
SELECT LENGTH(col) FROM vals;
_col0
-------
2001
1
(2 rows)
Attempting to write a CHAR
that doesn’t fit in the column’s actual size
fails. This is also true for the equivalent VARCHAR
types.
Конфигурация приведения типов#
Следующие параметры конфигурации могут быть использованы для изменения логики приведения типов.
Название |
Описание |
Значение по умолчанию |
---|---|---|
|
Как обрабатывать колонки неподдерживаемых типов:
* |
|
|
Список типов данных источника, которые должны быть принудительно приведены к |
Number to decimal configuration properties#
Configuration property name |
Session property name |
Description |
Default |
---|---|---|---|
|
|
Default Trino |
not set |
|
|
Rounding mode for the Oracle
|
|
SQL support#
The connector provides read access and write access to data and metadata in Oracle. In addition to the globally available and read operation statements, the connector supports the following statements:
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
Table functions#
The connector provides specific table functions to access Oracle.
query(varchar) -> table
#
The query
function allows you to query the underlying database directly. It
requires syntax native to Oracle, because the full query is pushed down and
processed in Oracle. This can be useful for accessing native features which are
not available in Trino or for improving query performance in situations where
running a query natively may be faster.
Примечание
Полиморфные табличные функции не всегда сохраняют оригинальный порядок записей в результате запроса. Есть табличная
функция содержит запрос с ORDER BY
, результат работы функции может вернуть записи в ином порядке. Для
восстановления требуемого порядка используйте ORDER BY
в запросе CedrusData.
As a simple example, to select an entire table:
SELECT
*
FROM
TABLE(
example.system.query(
query => 'SELECT
*
FROM
tpch.nation'
)
);
As a practical example, you can use the MODEL clause from Oracle SQL:
SELECT
SUBSTR(country, 1, 20) country,
SUBSTR(product, 1, 15) product,
year,
sales
FROM
TABLE(
example.system.query(
query => 'SELECT
*
FROM
sales_view
MODEL
RETURN UPDATED ROWS
MAIN
simple_model
PARTITION BY
country
MEASURES
sales
RULES
(sales['Bounce', 2001] = 1000,
sales['Bounce', 2002] = sales['Bounce', 2001] + sales['Bounce', 2000],
sales['Y Box', 2002] = sales['Y Box', 2001])
ORDER BY
country'
)
);
Performance#
The connector includes a number of performance improvements, detailed in the following sections.
Synonyms#
Based on performance reasons, Trino disables support for Oracle SYNONYM
. To
include SYNONYM
, add the following configuration property:
oracle.synonyms.enabled=true
Pushdown#
The connector supports pushdown for a number of operations:
In addition, the connector supports Aggregation pushdown for the following functions:
Pushdown is only supported for DOUBLE
type columns with the
following functions:
Pushdown is only supported for REAL
or DOUBLE
type column
with the following functions:
Примечание
Коннектор осуществляет 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 that use
the CLOB
, NCLOB
, BLOB
, or RAW(n)
Oracle database types, or Trino
data types that map to these Oracle database types.
In the following example, the predicate is not pushed down for either query
since name
is a column of type VARCHAR
, which maps to NCLOB
in
Oracle:
SHOW CREATE TABLE nation;
-- Create Table
----------------------------------------
-- CREATE TABLE oracle.trino_test.nation (
-- name varchar
-- )
-- (1 row)
SELECT * FROM nation WHERE name > 'CANADA';
SELECT * FROM nation WHERE name = 'CANADA';
In the following example, the predicate is pushed down for both queries
since name
is a column of type VARCHAR(25)
, which maps to
VARCHAR2(25)
in Oracle:
SHOW CREATE TABLE nation;
-- Create Table
----------------------------------------
-- CREATE TABLE oracle.trino_test.nation (
-- name varchar(25)
-- )
-- (1 row)
SELECT * FROM nation WHERE name > 'CANADA';
SELECT * FROM nation WHERE name = 'CANADA';