VIEW
CREATE MATERIALIZED VIEW tracking_hour
(
`date` Date,
`datetime` DateTime,
`appId` String,
`event` UInt32,
`priceId` UInt32,
`bannerId` UInt32,
`count` AggregateFunction(count, String),
`uniq` AggregateFunction(uniq, String),
`avgBid` AggregateFunction(avg, Nullable(Float64)),
`maxBid` AggregateFunction(max, Nullable(Float64))
)
ENGINE = AggregatingMergeTree()
ORDER BY (date, datetime, appId, event, priceId, bannerId)
AS
SELECT toDate(datetime) AS date,
toStartOfHour(datetime) AS hour,
appId,
event,
priceId,
bannerId,
countState(uuidId) AS count,
uniqState(uuidId) AS uniq,
avgState(bid) AS avgBid,
maxState(bid) AS maxBid
FROM tracking_distributed
GROUP BY date,
hour,
appId,
event,
priceId,
bannerId;
Вот такого вида, datetime который внутри агрегатной таблицы всегда 1970 год, 0 секунд с начала эпохи. При этом селект которым наполняется таблица выдает правильные значения
У вас поле называется в таблице datetime а в селекте hour . MV заполняется по именам полей. Плюс вы можете сильно сэкономить на state. Теперь можно использовать simpleaggregatefunction
Правильно понимаю, что simpleAggregateFunction лучше чем простой AggregateFunction во всех случаях и на него можно мало-помалу переезжать? Или есть отличительные случаи когда лучше использовать одно, а иногда другое?
Эм, так это не полная замена. Это только для простых функций которым не нужен state, типа sum да, avg нет. Плюс countstate хранится хитро и нужно кодеки использовать чтобы sum сохранить похоже https://github.com/ClickHouse/ClickHouse/issues/17775#issuecomment-738874115
Обсуждают сегодня