我想查询 Covalent 数据库,以了解 RSK 区块链上最新 100 个 rUSDT 代币转移交易中支付的 Gas 量。
在下面的 SQL 查询中,我尝试连接这两个表来找出最近 100 笔交易中每笔交易支付的 Gas 费。
SELECT
t.fees_paid
FROM chain_rsk_mainnet.block_log_events e
INNER JOIN chain_rsk_mainnet.block_transactions t ON
e.block_id = t.block_id
AND e.tx_offset = t.tx_offset
WHERE
e.topics @> array[E'\\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'::bytea]
AND e.topics[1] = E'\\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
AND e.sender = E'\\xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96'
ORDER BY e.block_id DESC, e.tx_offset DESC
LIMIT 100;
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个查询似乎需要很长时间才能处理。
我该如何修改这个查询?
更多背景:
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef是 ERC20Transfer事件日志的主题 ID。0xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96是ERC20代币的智能合约。\\xPostgres 格式中的thebytea用于将十六进制值键入为字符串文字,可以认为等同于前缀0x。chain_rsk_mainnet.block_log_events有一个表,其中包含 RSK 主网上智能合约发出的所有事件chain_rsk_mainnet.block_transactions有一个包含所有 RSK 主网交易详细信息的表e.topics是性能优化。严格来说,只有后一种是必要的。您需要在查询上设置一个日期范围,否则它将运行很长时间。RSK 上有大量 rUSDTTransfer事件日志。扫描全表找到所有这些,然后一次性连接这些是这个查询花费太长时间的根本原因。
为了解决这个问题,对于每个要连接的表,向与时间相关的字段(block_log_events.block_signed_at和block_transactions.signed_at)添加一个条件,将其限制在一定的间隔内,比如一个月:
AND e.block_signed_at > NOW() - INTERVAL '1 month' AND e.block_signed_at <= NOW()
AND t.signed_at > NOW() - INTERVAL '1 month' AND t.signed_at <= NOW()
Run Code Online (Sandbox Code Playgroud)
这是完整的查询:
SELECT
t.fees_paid
FROM chain_rsk_mainnet.block_log_events e
INNER JOIN chain_rsk_mainnet.block_transactions t ON
e.block_id = t.block_id
AND e.tx_offset = t.tx_offset
WHERE
e.topics @> array[E'\\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'::bytea]
AND e.topics[1] = E'\\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
AND e.sender = E'\\xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96'
AND e.block_signed_at > NOW() - INTERVAL '1 month' AND e.block_signed_at <= NOW()
AND t.signed_at > NOW() - INTERVAL '1 month' AND t.signed_at <= NOW()
ORDER BY e.block_id DESC, e.tx_offset DESC
LIMIT 100;
Run Code Online (Sandbox Code Playgroud)