нее.
Вот код создания:
CREATE TABLE DB1.TEST_TABLE
(
ID String,
FIELDA UInt32,
FIELDB UInt32
) ENGINE = MergeTree()
PARTITION BY ID
ORDER BY ID;
CREATE MATERIALIZED VIEW DB1.TEST_MAT
(
ID String,
FIELDC UInt64
) ENGINE = MergeTree()
AS
SELECT ID,
arrayJoin(arraySlice(range(intDiv(FIELDA + FIELDB, 100) + 1), intDiv(FIELDB, 100) + 1)) as FIELDC
FROM DB1.TEST_TABLE;
При выполнении запроса:
INSERT INTO DB1.TEST_TABLE
(ID, FIELDA, FIELDB)
SELECT ID,
FIELDA,
FIELDB
FROM DB1.TMP_TABLE;
Получаем ошибку:
> A call to function range would produce 135616708 array elements, which is greater than the allowed maximum of 100000000: while pushing to view DB1.TEST_MAT
Таблица TMP_TABLE из которой копируются данные достаточно большая.
При чем в следующих случаях все работает:
1. Если сначала добавить данные в таблицу TEST_TABLE, а потом создать TEST_MAT с POPULATE
2. Если создать TEST_MAT не как матвью, а как таблицу и выполнить запрос:
INSERT INTO DB1.TEST_MAT
SELECT ID,
arrayJoin(arraySlice(range(intDiv(FIELDA + FIELDB, 100) + 1), intDiv(FIELDB, 100) + 1)) as FIELDC
FROM DB1.TEST_TABLE;
С чем связанно ограничение в 100000000, можно ли его как то поменять и есть ли путь обхода?
https://clickhouse.yandex/docs/ru/query_language/functions/array_functions/#range-n 1. Возвращает массив чисел от 0 до N-1. На всякий случай, если на блок данных, создаются массивы суммарной длины больше 100 000 000 элементов, то кидается исключение. 2. собирать КХ самому. https://github.com/yandex/ClickHouse/blob/master/dbms/src/Functions/range.cpp#L47
Обсуждают сегодня