DateTime,
recordSource String,
glnCode String
) ENGINE = MergeTree() ORDER BY glnHashKey SETTINGS index_granularity = 8192
к ней мат представление
CREATE MATERIALIZED VIEW data_vault_stage.hubGln_mv (
glnHashKey FixedString(20),
lastSeenDate AggregateFunction(max,
DateTime)
) ENGINE = AggregatingMergeTree() ORDER BY glnHashKey SETTINGS index_granularity = 8192
AS
SELECT glnHashKey, maxState(loadDate) AS lastSeenDate FROM data_vault_stage.hubGln GROUP BY glnHashKey
Таблица data_vault_stage.hubGln транкейтится 1 раз в час и в нее вставляются новые данные.
Также есть такая таблица, в которую данные только добавляются через insert-select:
CREATE TABLE data_vault_core.hubGln (
glnHashKey FixedString(20),
loadDate DateTime,
recordSource String,
glnCode String
) ENGINE = MergeTree() ORDER BY glnHashKey SETTINGS index_granularity = 8192
и вот такое представление
CREATE VIEW data_vault_core.hubGln_view (
glnHashKey FixedString(20),
loadDate DateTime,
recordSource String,
lastSeenDate DateTime,
glnCode String) AS SELECT glnHashKey,
loadDate,
recordSource,
lastSeenDate,
glnCode FROM (SELECT glnHashKey,
loadDate,
recordSource,
glnCode FROM data_vault_core.hubGln) ALL LEFT JOIN (SELECT glnHashKey,
maxMerge(lastSeenDate) AS lastSeenDate FROM data_vault_stage.hubGln_mv GROUP BY glnHashKey) USING (glnHashKey)
Есть еще достаточно сложное представление, частью которого является такой подзапрос, а к нему много чего прилоединяется левым соединением:
SELECT glnHashKey,
recordSource,
glnCode FROM data_vault_core.hubGln_view WHERE dateDiff('second',
lastSeenDate,
(SELECT max(lastSeenDate) FROM data_vault_core.hubGln_view)) < (60 * 10)
Собственно, вопрос:
Запрос к сложному представлению исполняется около 10 секунд. В момент исполнения таблица data_vault_stage.hubGln может быть очищена и в нее могут быть вставлены новые данные (происходит это 1 раз в час). В loadDate всегда вставляется now().
Есть примерно <1% случаев, когда этот запрос может не вернуть данных, полагаю, что это связано с dateDiff, так как не полняется условие в where. Но с другой стороны, при исполнении запроса разве не создается снапшота
всех используемых таблиц на определенный момент времени? Нормально ли для КХ, что он так себя ведет и как можно избежать подобной ситуации?
SELECT glnHashKey, recordSource, glnCode FROM data_vault_core.hubGln_view WHERE dateDiff('second', lastSeenDate, (SELECT max(lastSeenDate) FROM data_vault_core.hubGln_view) с т.з. КХ тут два селект и они видят 2 разных таблицы, т.е. SELECT max(lastSeenDate) выполняется над неочищенной таблицей, SELECT glnHashKey над очищенной
Обсуждают сегодня