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.)
* /
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
1条答案
按热度按时间gk7wooem1#
目前ch不能很好地处理多连接查询(db星型模式),查询优化器也不能完全依赖它。
因此,它需要明确说明如何使用子查询而不是联接来“执行”查询。
让我们模拟您的查询:
在我的电脑上大约需要4秒钟。让我们使用子查询重写它,以显著加快速度。
还有其他优化联接的方法:
使用外部字典除去“small”表上的连接
使用联接表引擎
使用任何严格的
使用特定的设置,如join\u算法、partial\u merge\u join\u优化等
一些有用的参考文献:
altinity网络研讨会:每个clickhouse用户应该知道的技巧和窍门
altinity网络研讨会:clickhouse查询性能的秘密
答案更新:
要减少字符串列的存储消耗,请考虑将列类型更改为lowcardinality(链接2),这样可以显著减小包含许多重复元素的列的大小。
使用此查询可获取列的大小:
要获得字符串的数字表示,需要使用一个哈希函数。