如何解决索引跳过扫描模拟以检索不同的产品 ID 和其他列的最小值/最大值 查询索引
这是我的表架构:
const items = [
{ 0: "Jan" },{ 1: "Feb" },{ 2: "Mar" },{ 3: "Apr" },{ 4: "May" }
];
const inputText = "2";
const filteredMonths = Object.values(items.find(
obj => parseInt(inputText) - 1 in obj
));
我的应用程序在“ticker”频道上订阅了 Coinbase Pro 的 websocket,并在收到消息时在行情表中插入一行。
该表现在有超过 200 万行。
我学习了如何在 PostgreSQL 中使用索引跳过扫描模拟(参见:SELECT DISTINCT is slower than expected on my table in PostgreSQL),以便从该表中快速检索不同的 product_id 值,而不是使用较慢的 CREATE TABLE tickers (
product_id TEXT NOT NULL,trade_id INT NOT NULL,sequence BIGINT NOT NULL,time TIMESTAMPTZ NOT NULL,price NUMERIC NOT NULL,side TEXT NOT NULL,last_size NUMERIC NOT NULL,best_bid NUMERIC NOT NULL,best_ask NUMERIC NOT NULL,PRIMARY KEY (product_id,trade_id)
);
CREATE INDEX idx_tickers_product_id_time ON tickers (product_id,time);
方法。
我还想检索其他列的最小值/最大值。这是我想出的。 2.25 行大约需要 2.9 毫秒。
有没有更好的方法来实现这一点?
SELECT DISTINCT
解决方法
查询
使用 (product_id,time)
上的现有索引,我们可以以一个的价格获得两个,即获取 product_id
和 最小 {{1}在一次索引扫描中:
time
此外,不需要第二个 CTE 包装器。
索引
目前您有两个索引:WITH RECURSIVE product_ids AS (
( -- parentheses required
SELECT product_id,time AS min_time
FROM tickers
ORDER BY 1,2
LIMIT 1
)
UNION ALL
SELECT l.*
FROM product_ids p
CROSS JOIN LATERAL (
SELECT t.product_id,t.time
FROM tickers t
WHERE t.product_id > p.product_id
ORDER BY 1,2
LIMIT 1
) l
)
SELECT product_id,min_time,(SELECT MAX(time) FROM tickers WHERE product_id = p.product_id) AS max_time,(SELECT MAX(trade_id) - MIN(trade_id) + 1 FROM tickers WHERE product_id = p.product_id) AS ticker_count
FROM product_ids p
ORDER BY ticker_count DESC;
上的 PK 索引和 (product_id,trade_id)
上的另一个。您可以通过在两者之一中反转列顺序来优化它。喜欢:
(product_id,time)
逻辑上等效,但通常更有效,因为它涵盖了更广泛的可能查询。见(再次):
我们只需要 PRIMARY KEY (trade_id,product_id)
上的现有索引,所以对这个查询没有直接影响。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。