我想查询Covalent数据库,以了解RSK区块链上最近100笔rUSDT代币转账交易中支付的天然气金额。
在下面的SQL查询中,我试图将这两个表连接起来,以找出最近100笔交易中每一笔的煤气费。
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;
遗憾的是,处理此查询似乎花费了太长时间。
如何修改此查询
更多上下文:
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
是ERC20Transfer
事件日志的主题ID0xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96
是ERC20代币的智能合约- Postgres
bytea
格式的CCD_,可以被认为等同于CCD_ 6前缀 - 在共价数据库中,
chain_rsk_mainnet.block_log_events
是包含RSK Mainnet上智能合约发出的所有事件的表 - 在Covalent数据库中,
chain_rsk_mainnet.block_transactions
是一个包含所有RSK Mainnet事务详细信息的表 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()
以下是完整的查询:
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;