Как запросить несколько баз данных в одном запросе select в базе данных clickhouse?

У меня есть база данных clickhouse. Он содержит несколько баз данных. Таблицы внутри баз данных идентичны.

Например, в DB1 есть таблица «Таблица1», в DB2 также есть таблица «Таблица1» (здесь базы данных разные, таблицы также разные, но имеют идентичную схему и содержат аналогичный тип информации).

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


person phanipawan    schedule 08.08.2018    source источник


Ответы (2)


Вы можете создать специальную таблицу с помощью механизма Merge (не путать с MergeTree). Запросы к нему будут делать то же UNION ALL прозрачно. Однако он не поддерживает охват нескольких баз данных, поэтому вы все равно можете иметь несколько баз данных или перемещать таблицы в одну базу данных.

person Ivan Blinkov    schedule 09.08.2018
comment
Что ж, есть способ охватить несколько баз данных. Просто настройте несколько движков Merge и соедините их один за другим :) - person Amos; 13.08.2018

Предлагаю создать еще одну БД:

create database <your_db_name> on cluster <your_cluster_name>;

Затем создайте таблицу Merge для каждой из существующих БД:

CREATE TABLE <your_db_name>.<merge_table_name> On cluster <your_cluster_name> (<fields list you need to deal with>)  ENGINE=Merge(<existing_db_name>, '<regex>');

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

CREATE VIEW <your_db_name>.view_<merge_table_name> on cluster <your_cluster_name> (<list of fields>) AS SELECT <list of fields> FROM <your_db_name>.<merge_table_name>;

Наконец, создайте "результирующую" таблицу слияния, которая объединяет все вновь созданные представления:

CREATE TABLE <your_db_name>.<result_table_name> on cluster <your_cluster_name> (<list of fields>)  ENGINE=Merge(<your_db_name>, '<regex>');

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

person dmkvl    schedule 27.05.2019