184 похожих чатов

Есть простая таблица CREATE TABLE default.syslog ( `severity` UInt16,

`facility` UInt16,
`timestamp` DateTime,
`hostname` String,
`tag` String,
`message` String
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp)
ORDER BY (timestamp, hostname)
TTL timestamp + toIntervalDay(45)
SETTINGS index_granularity = 8192Записей много!
Можно как-то оптимизировать
SELECT DISTINCT hostname FROM syslogбез предварительного аггрегирования?

13 ответов

14 просмотров

Почему order by такой? Если hostname не слишком много, стоит поменять их местами. Не знаю, оптимизирован ли distinct сейчас, group by host_name,... сильно ускорится

hostname LowCardinality(String) и делать select hostname from FROM syslog group by hostname или тупо вынести в отдельную таблицу, и сделать типа словаря

1) hostname замените тип на LowCardinality(string) 2) ORDER BY поменяйте поставьте сначала hostname а потом timestamp 3) SELECT DISTINCT hostname FROM syslog WHERE timestamp BETWEEN no() - INTERVAL 20 DAYS AND now() - такое допустимо?

Valeriy-Filatov Автор вопроса
Slach [altinity]
1) hostname замените тип на LowCardinality(string)...

1. да! Ускорение ~10 раз, если запрос поменять на "select hostname from syslog group by hostname" 2. да, еще быстрее, но "поломался" поиск без участия hostname, ОЧЕНЬ медленно. Пришлось вернуть "ORDER BY (timestamp, hostname)" обратно.

Valeriy Filatov
1. да! Ускорение ~10 раз, если запрос поменять на ...

какой конкретно поиск? where что? как у вас таблица партиционирована?

Valeriy-Filatov Автор вопроса
Denny [Altinity]
какой конкретно поиск? where что? как у вас табли...

CREATE TABLE default.syslog ( `severity` UInt16, `facility` UInt16, `timestamp` DateTime, `hostname` LowCardinality(String), `tag` String, `message` String ) ENGINE = MergeTree() PARTITION BY toYYYYMM(timestamp) ORDER BY (timestamp, hostname) TTL timestamp + toIntervalDay(45) SETTINGS index_granularity = 8192 Если ORDER BY поменять местами, то SELECT formatDateTime(timestamp, '%m/%d %H:%M'), hostname, severity, tag, message FROM syslog WHERE timestamp >= $value1 AND timestamp < $value2 AND message like $msg ORDER BY timestamp ASCвозвращается ОЧЕНЬ медленно. Понятно, что если добавить "AND hostname = ..." запрос возвращается быстро

Valeriy Filatov
CREATE TABLE default.syslog ( `severity` UInt1...

сделайте ORDER BY (toStartOfHour(timestamp), hostname)

Valeriy-Filatov Автор вопроса
Valeriy-Filatov Автор вопроса
Denny [Altinity]
сделайте ORDER BY (toStartOfHour(timestamp), hostn...

Сделал, но разница несущественна даже с toStartOfDay. Заметил другую проблему: переходы на "далекую" страницу до минуты и более SELECT * FROM syslog WHERE timestamp >= toDate('2020-11-02') AND timestamp < NOW() AND hostname='myhost' LIMIT 1000 OFFSET 1053000

Valeriy Filatov
Сделал, но разница несущественна даже с toStartOfD...

OFFSET 1053000 -- а чего вы ожидали собственно? Чуда? Нет. Деда мороза не бывает.

Valeriy Filatov
Сделал, но разница несущественна даже с toStartOfD...

я посоветовал такой ORDER BY (toStartOfHour(timestamp), hostname) чтобы работали по индексу запросы вида where hostname = ? and timestamp between

Denny [Altinity]
я посоветовал такой ORDER BY (toStartOfHour(timest...

А разве не наоборот должны быть поля в ордер бай для вашего примера?

Anton
А разве не наоборот должны быть поля в ордер бай д...

есть хитрость в КХ, он умеет делать skip scan, для лидирующих полей в индексе, что-то вроде oracle-fast-full-index-scan, если кардинальность лидирующего поля мала Valeriy наоборот отказывался делать, у хоста кардинальность большая, а ему нужно делать запросы с фильтрацией по дате, без фильтра по хосту

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта