连接字符串列

vlju58qv  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(328)

我得到了字符串列 uin 在几个表中,如何有效地加入 uin 这些table?
在我们使用的vertica数据库中 hash(uin) 要将字符串列转换为int数据类型的散列-这大大提高了连接的效率-您能推荐这样的方法吗?我试过了 CRC32(s) 但它似乎起错了作用。

gk7wooem

gk7wooem1#

目前ch不能很好地处理多连接查询(db星型模式),查询优化器也不能完全依赖它。
因此,它需要明确说明如何使用子查询而不是联接来“执行”查询。
让我们模拟您的查询:

SELECT table_01.number AS r
FROM numbers(87654321) AS table_01
  INNER JOIN numbers(7654321) AS table_02 ON (table_01.number = table_02.number)
  INNER JOIN numbers(654321) AS table_03 ON (table_02.number = table_03.number)
  INNER JOIN numbers(54321) AS table_04 ON (table_03.number = table_04.number)
ORDER BY r DESC
LIMIT 8;
/*
┌─────r─┐
│ 54320 │
│ 54319 │
│ 54318 │
│ 54317 │
│ 54316 │
│ 54315 │
│ 54314 │
│ 54313 │
└───────┘

8 rows in set. Elapsed: 4.244 sec. Processed 96.06 million rows, 768.52 MB (22.64 million rows/s., 181.10 MB/s.) 

* /

在我的电脑上大约需要4秒钟。让我们使用子查询重写它,以显著加快速度。

SELECT number AS r
FROM numbers(87654321)
WHERE number IN (
  SELECT number 
  FROM numbers(7654321)
  WHERE number IN (
    SELECT number 
    FROM numbers(654321)
    WHERE number IN (
      SELECT number 
      FROM numbers(54321)
    )
  )
)
ORDER BY r DESC
LIMIT 8;
/*
┌─────r─┐
│ 54320 │
│ 54319 │
│ 54318 │
│ 54317 │
│ 54316 │
│ 54315 │
│ 54314 │
│ 54313 │
└───────┘

8 rows in set. Elapsed: 0.411 sec. Processed 96.06 million rows, 768.52 MB (233.50 million rows/s., 1.87 GB/s.) 

* /

还有其他优化联接的方法:
使用外部字典除去“small”表上的连接
使用联接表引擎
使用任何严格的
使用特定的设置,如join\u算法、partial\u merge\u join\u优化等
一些有用的参考文献:
altinity网络研讨会:每个clickhouse用户应该知道的技巧和窍门
altinity网络研讨会:clickhouse查询性能的秘密
答案更新:
要减少字符串列的存储消耗,请考虑将列类型更改为lowcardinality(链接2),这样可以显著减小包含许多重复元素的列的大小。
使用此查询可获取列的大小:

SELECT
    name AS column_name,
    formatReadableSize(data_compressed_bytes) AS data_size,
    formatReadableSize(marks_bytes) AS index_size,
    type,
    compression_codec
FROM system.columns
WHERE database = 'db_name' AND table = 'table_name'
ORDER BY data_compressed_bytes DESC

要获得字符串的数字表示,需要使用一个哈希函数。

SELECT 'jsfhuhsdf', xxHash32('jsfhuhsdf'), cityHash64('jsfhuhsdf');

相关问题