Добрый вечер! Имеется вот такая таблица для хранения исторических рыночных данных:
CREATE TABLE instrument_market_data3 (
`symbol` String,
`timestamp` DateTime('UTC'),
`open` Float64,
`high` Float64,
`low` Float64,
`close` Float64,
`volume` Float64,
`version` Int32
)
ENGINE = ReplacingMergeTree(`version`)
PARTITION BY toYYYYMM(`timestamp`)
ORDER BY (`symbol`, `timestamp`)
На данный момент в ней всего 7,5 млн строк по 33 уникальным значениям в symbol. Крутится на машине c 2-мя ядрами и 4Гб оперативки.
Сейчас раз в минуту в эту таблицу пишутся новые данные одним куском, иногда перезаписывая старые данные в пределах последних 2-х суток.
По ней есть 2 вопроса.
1. Вот такой запрос иногда выполняется очень долго:
`
S
ELECT
'1d' AS timeframe,
argMin(open, timestamp) AS open,
argMax(close, timestamp) AS close,
close - open AS yield_absolute,
((close - open) / open) * 100 AS yield_relative
FROM instrument_market_data3
WHERE (symbol = 'MOEX:USD000UTSTOM:CETS') AND (timestamp >= '2021-01-27 00:00:00')
GROUP BY timeframe
UNION ALL
SELECT
'1w' AS timeframe,
argMin(open, timestamp) AS open,
argMax(close, timestamp) AS close,
close - open AS yield_absolute,
((close - open) / open) * 100 AS yield_relative
FROM instrument_market_data3
WHERE (symbol = 'MOEX:USD000UTSTOM:CETS') AND (timestamp >= '2021-01-20 00:00:00')
GROUP BY timeframe
UNION ALL
SELECT
'1m' AS timeframe,
argMin(open, timestamp) AS open,
argMax(close, timestamp) AS close,
close - open AS yield_absolute,
((close - open) / open) * 100 AS yield_relative
FROM instrument_market_data3
WHERE (symbol = 'MOEX:USD000UTSTOM:CETS') AND (timestamp >= '2020-12-27 00:00:00')
GROUP BY timeframe
UNION ALL
SELECT
'3m' AS timeframe,
argMin(open, timestamp) AS open,
argMax(close, timestamp) AS close,
close - open AS yield_absolute,
((close - open) / open) * 100 AS yield_relative
FROM instrument_market_data3
WHERE (symbol = 'MOEX:USD000UTSTOM:CETS') AND (timestamp >= '2020-10-29 00:00:00')
GROUP BY timeframe
UNION ALL
SELECT
'1y' AS timeframe,
argMin(open, timestamp) AS open,
argMax(close, timestamp) AS close,
close - open AS yield_absolute,
((close - open) / open) * 100 AS yield_relative
FROM instrument_market_data3
WHERE (symbol = 'MOEX:USD000UTSTOM:CETS') AND (timestamp >= '2020-01-28 00:00:00')
GROUP BY timeframe
UNION ALL
SELECT
'max' AS timeframe,
argMin(open, timestamp) AS open,
argMax(close, timestamp) AS close,
close - open AS yield_absolute,
((close - open) / open) * 100 AS yield_relative
FROM instrument_market_data3
WHERE symbol = 'MOEX:USD000UTSTOM:CETS'
GROUP BY timeframe
Query id: c2204d45-ce34-4b5a-abf4-2820be95f52a
┌─timeframe─┬────open─┬───close─┬─────yield_absolute─┬─────yield_relative─┐
│ 1d │ 75.0675 │ 75.5825 │ 0.5150000000000006 │ 0.6860492223665375 │
└───────────┴─────────┴─────────┴────────────────────┴────────────────────┘
┌─timeframe─┬──open─┬───close─┬─────yield_absolute─┬────yield_relative─┐
│ 1w │ 73.68 │ 75.5825 │ 1.9024999999999892 │ 2.582111834961983 │
└───────────┴───────┴─────────┴────────────────────┴───────────────────┘
┌─timeframe─┬────open─┬───close─┬─────yield_absolute─┬─────yield_relative─┐
│ 1m │ 74.1425 │ 75.5825 │ 1.4399999999999977 │ 1.9422058873115928 │
└───────────┴─────────┴─────────┴────────────────────┴────────────────────┘
┌─timeframe─┬──open─┬───close─┬─────yield_absolute─┬─────yield_relative─┐
│ 3m │ 78.78 │ 75.5825 │ -3.197500000000005 │ -4.058771261741565 │
└───────────┴───────┴─────────┴────────────────────┴────────────────────┘
┌─timeframe─┬────open─┬───close─┬─────yield_absolute─┬─────yield_relative─┐
│ 1y │ 62.9475 │ 75.5825 │ 12.634999999999998 │ 20.072282457603556 │
└───────────┴─────────┴─────────┴────────────────────┴────────────────────┘
┌─timeframe─┬───open─┬───close─┬─────yield_absolute─┬─────yield_relative─┐
│ max │ 31.185 │ 75.5825 │ 44.397499999999994 │ 142.36812570145904 │