5

我想查询 Covalent 数据库,以了解在 RSK 区块链上最近 100 次 rUSDT 代币转移交易中支付的 gas 量。

在下面的 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事件日志的主题 ID。
  • 0xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96是 ERC20 代币的智能合约。
  • \\xPostgres 的格式bytea用于将十六进制值键入为字符串字面量,可以认为等同于0x前缀。
  • 在 Covalent 数据库中,chain_rsk_mainnet.block_log_events是一张包含 RSK 主网上智能合约发出的所有事件的表
  • 在 Covalent 数据库中,chain_rsk_mainnet.block_transactions是一个包含所有 RSK 主网交易详细信息的表
  • 匹配两次的原因e.topics是性能优化。严格来说,只有后一种是必要的。
4

1 回答 1

6

您需要在查询上放置一个日期范围,否则它将运行很长时间。RSK 上有大量 rUSDTTransfer事件日志。扫描全表找到所有这些,并一次将这些全部连接起来是此查询耗时过长的根本原因。

为了解决这个问题,对于每个要连接的表,在与时间相关的字段(block_log_events.block_signed_atblock_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;
于 2021-11-29T12:35:02.523 回答