#sql #rsk
Вопрос:
Я хочу запросить Ковалентную базу данных, чтобы узнать количество газа, выплаченного в ходе последних 100 транзакций по переводу токенов rUSDT в блокчейне RSK.
В следующем 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 @gt; 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
это идентификаторTransfer
темы журнала событий ERC20.0xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96
является смарт — контрактом токена ERC20.- формат
\x
in Postgresbytea
используется для ввода шестнадцатеричных значений в виде строковых литералов, которые можно считать эквивалентными0x
префиксу. - В ковалентной базе данных
chain_rsk_mainnet.block_log_events
находится таблица со всеми событиями, генерируемыми смарт-контрактами в сети RSK Mainnet - В ковалентной базе данных
chain_rsk_mainnet.block_transactions
находится таблица со всеми подробностями транзакций RSK Mainnet - Причина, по которой
e.topics
это сопоставляется дважды, заключается в оптимизации производительности. Строго говоря, необходимо только последнее.
Ответ №1:
Вам нужно указать диапазон дат в запросе, иначе он будет выполняться очень долго. В RSK существует огромное количество журналов Transfer
событий rUSDT. Сканирование всей таблицы, чтобы найти их все, и объединение их всех за один раз является основной причиной того, что этот запрос занимает слишком много времени.
Чтобы решить эту проблему, для каждой из присоединяемых таблиц добавьте условие в поля, связанные со временем ( block_log_events.block_signed_at
и block_transactions.signed_at
), чтобы ограничить его определенным интервалом, скажем, месяцем:
AND e.block_signed_at gt; NOW() - INTERVAL '1 month' AND e.block_signed_at lt;= NOW() AND t.signed_at gt; NOW() - INTERVAL '1 month' AND t.signed_at lt;= 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 @gt; array[E'\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'::bytea] AND e.topics[1] = E'\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef' AND e.sender = E'\xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96' AND e.block_signed_at gt; NOW() - INTERVAL '1 month' AND e.block_signed_at lt;= NOW() AND t.signed_at gt; NOW() - INTERVAL '1 month' AND t.signed_at lt;= NOW() ORDER BY e.block_id DESC, e.tx_offset DESC LIMIT 100;