我有一个每天运行几次的查询。它会检查历史数据并提升大量每小时分区。该查询在冷运行时需要近 30 秒的时间来执行,然后一旦数据被读取并且已经进入内存,它就会在不到一秒的时间内执行。
SELECT
timestamp, symbol,
first(price) AS open,
last(price) AS close,
min(price),
max(price),
sum(amount) AS volume
FROM trades
SAMPLE BY 15m;
我希望避免每天第一次执行查询时等待 30 秒的用户体验(或者如果在下午晚些时候执行并且数据已从内存中逐出)。我正在考虑使用 cronjob 早上第一件事使用 API 来运行我的查询,所以下次它将是一个热执行,但也许这有点矫枉过正了。还有其他解决方案或任何我可以微调的参数吗?
使用 API 运行 cronjob 来执行查询并预热内存的想法是一个很好的想法。有一个稍微好一点的解决方案,就是使用
TOUCH
语句运行。
TOUCH
将获取我们想要读取的相同列,并且将像我们一样读取所有数据,但它比SELECT
更早完成,因为它不需要返回结果,所以它更轻对于服务器来说,同时仍然在内存中预加载我们需要的所有数据。
请考虑到,当我们执行
TOUCH
时,我们不包含任何聚合或采样,仅包含我们需要预取的列列表。
我们将像这样使用它来执行上面的查询:
SELECT touch(SELECT timestamp, symbol, price, amount FROM trades );