【问题标题】:How to query multiple databases in the same select query in clickhouse database?如何在clickhouse数据库的同一个select查询中查询多个数据库?
【发布时间】:2019-01-15 12:46:56
【问题描述】:

我有一个 clickhouse 数据库。它包含多个数据库。数据库中的表是相同的。

例如 DB1 有表“Table1”,DB2 也有表“Table1”(这里的数据库不同,表也不同但它们具有相同的架构并包含相似类型的信息)。

有没有一种方法可以让我编写一个查询以最佳地从所有不同数据库的所有不同表中获取信息?目前我正在单独查询每个表并在它们之间进行联合。

【问题讨论】:

    标签: database query-optimization clickhouse


    【解决方案1】:

    我建议再创建一个数据库:

    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>');
    

    为每个合并表创建一个View(使用视图可以执行任何聚合函数、分组依据等):

    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>');
    

    以这样的方式命名表和视图,使您的正则表达式匹配您需要的所有内容,并确保避免循环。

    【讨论】:

      【解决方案2】:

      您可以使用Merge 引擎设置一个特殊表(不要与 MergeTree 混淆)。查询它将透明地执行相同的UNION ALL。但它不支持跨越多个数据库,因此您仍然可能最终拥有多个数据库或将表移动到一个数据库中。

      【讨论】:

      • 嗯,有一种方法可以跨越多个数据库。只需设置多个合并引擎并将它们一个接一个地链接起来:)
      猜你喜欢
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 2016-09-21
      • 1970-01-01
      相关资源
      最近更新 更多