Spec-Zone.ru › MariaDB

CONNECT - Типы внешних таблиц

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

Эти типы могут быть использованы для доступа к таблицам текущего или другого сервера базы данных. В настоящее время предоставляются шесть типов:

ODBC: Используется для доступа к таблицам из системы управления базами данных, предоставляющей ODBC-соединитель. ODBC — стандарт Microsoft и в настоящее время доступен в Windows. В Linux он также может быть использован, если установлен конкретный эмулятор ODBC. В настоящее время поддерживается только unixODBC.

JDBC: Используется для доступа к таблицам из системы управления базами данных, предоставляющей JDBC-соединитель. JDBC — стандарт Oracle, реализованный в Java, и предназначен в основном для использования в приложениях Java. Использование его напрямую из приложений C или C++ кажется практически невозможным из-за ошибки Oracle, которая до сих пор не исправлена. Однако это можно достичь с помощью обертки Java-класса, используемой как интерфейс между C++ и JDBC. С другой стороны, JDBC доступен на всех платформах и операционных системах.

Mongo: Для доступа к коллекциям MongoDB как к таблицам через драйвер MongoDB C. Поскольку для этого требуется как MongoDB, так и драйвер C, этот тип таблиц в настоящее время недоступен в двоичных дистрибутивах, а только при компиляции MariaDB из исходного кода.

MySQL: Этот тип является предпочтительным способом доступа к таблицам на другом сервере MySQL или MariaDB. Он использует API MySQL для доступа к внешней таблице. Несмотря на то, что это можно получить с помощью плагина FEDERATED(X), этот конкретный тип используется внутри CONNECT, поскольку он также позволяет получать доступ к таблицам текущего сервера.

PROXY: Внутренне используется некоторыми типами таблиц для доступа к другим таблицам из одной таблицы.

Спецификация внешних таблиц

Четыре основных типа внешних таблиц — odbc, jdbc, mongo и mysql — задаются, предоставляя следующую информацию:

  1. Источник данных. Это задается в параметре соединения.
  2. Удаленная таблица или представление для доступа. Это можно указать в строке подключения или с использованием конкретных параметров CONNECT.
  3. Определения столбцов. Это также можно оставить CONNECT для поиска с помощью функции обнаружения MariaDB.
  4. Необязательный параметр Quoted. Может быть установлен в 1 для цитирования идентификаторов в запросе, отправленном на удаленный сервер. Это необходимо, если имена столбцов или таблиц могут содержать пробелы.

Работа происходит путем установления соединения с внешним источником данных и отправки ему SQL-запроса (или его эквивалента, используя функции API для MONGO), позволяя ему выполнить исходный запрос. Для повышения производительности необходимо, чтобы удаленный источник данных выполнял максимальную обработку. Это необходимо, в частности, для уменьшения количества данных, возвращаемых источником данных.

Вот почему для SELECT-запросов CONNECT использует функцию cond_push MariaDB для получения максимального фрагмента условия WHERE исходного запроса, который может быть добавлен к запросу, отправленному в источник данных. Это происходит автоматически и не требует никаких действий со стороны пользователя.

Однако можно сделать больше. В дополнение к доступу к удаленной таблице CONNECT предлагает возможность указать, что должен делать удаленный сервер. Это делается путем указания его как представления в параметре srcdef. Например:

CREATE TABLE custnum ENGINE=CONNECT TABLE_TYPE=XXX
CONNECTION='connecton string'
SRCDEF='select pays as country, count(*) as customers from custnum group by pays';

В результате операция группировки (group by) будет выполнена удаленным сервером, значительно уменьшая объем данных, отправленных обратно по соединению.

Это даже можно увеличить, добавив в часть srcdef часть «compatible» запроса, где условия, подобные этому, выполняются для табличных таблиц. Обратите внимание, что для MariaDB эта таблица имеет два столбца: country и customers. Предположим, что исходный запрос:

SELECT * FROM custnum WHERE (country = 'UK' OR country = 'USA') AND customers > 5;

Как можно добавить условие WHERE в отправляемый srcdef? Существует много проблем:

  1. Где включить дополнительную информацию.
  2. Что делать с использованием псевдонимов.
  3. Как определить, что будет условием WHERE или HAVING.

Первая проблема решается путем подготовки представления srcdef для приема условий. Вышеприведенный пример srcdef преобразуется в:

SRCDEF='select pays as country, count(*) as customers from custnum where %s group by pays having %s';

%s в srcdef — это заполнитель для возможных совместимых частей условия WHERE исходного запроса. Если запрос select не содержит условия WHERE или предоставляет неприемлемое условие WHERE, заполнитель будет заполнен фиктивными условиями (1=1).

Другие проблемы должны быть решены путем добавления в создаваемую таблицу списка столбцов, которые необходимо перевести, потому что они являются псевдонимами или/и псевдонимами агрегатных функций, которые должны стать условием HAVING. Например, в этом случае:

CREATE TABLE custnum ENGINE=CONNECT TABLE_TYPE=XXX
CONNECTION='connecton string'
SRCDEF='select pays as country, count(*) as customers from custnum where %s group by pays having %s'
OPTION_LIST='Alias=customers=*count(*);country=pays';

Это задается параметром alias, который используется в списке параметров. Он состоит из списка элементов, разделенных точкой с запятой, содержащих:

  1. Имя локального столбца (псевдоним на удаленном сервере)
  2. Знак равенства.
  3. Возможный символ «*», указывающий, что этот столбец соответствует агрегатной функции.
  4. Имя удаленного столбца.

С этой информацией CONNECT сможет сформировать запрос, отправленный на удаленный источник данных:

select pays as country, count(*) as customers from custnum where (pays = 'UK' OR pays = 'USA') group by country having count(*) > 5

Примечание: некоторые источники данных, включая MySQL и MariaDB, допускают псевдонимы в условии HAVING. В этом случае параметр alias мог бы быть указан как:

OPTION_LIST='Alias=customers=*;country=pays';

Существует другой параметр, phpos, позволяющий указать, какие плацехолдеры присутствуют и в каком порядке. Он задаётся как «W», «WH», «H» или «HW». Он редко используется, поскольку по умолчанию CONNECT может установить его из содержимого srcdef. Единственные случаи, когда он необходим, — это когда srcdef содержит только заполнитель HAVING или когда заполнитель HAVING встречается до заполнителя WHERE, что может встречаться в запросах, содержащих соединения. CONNECT не может обрабатывать более одного заполнителя каждого типа.

SRCDEF недоступен для таблиц MONGO, но существуют другие способы достижения этого, описанные в главе по типу таблиц MONGO.

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

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/connect-external-table-types/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API