Skip to content

Conversation

juliangruber
Copy link
Member

Closes #253

With this change, we don't need to manually copy transfers into the rewards releases spreadsheet any more.

export const fetchDailyRewardTransfers = async (pgPool, filter) => {
const { rows } = await pgPool.query(`
SELECT day::TEXT, SUM(amount) as amount
SELECT day::TEXT, to_address, amount
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to create some kind of iterator using something like pg-cursor so we could avoid loading all rows into memory in order to do calculation?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point.

I ran this query against the live database, and it returned less than 2000 rows. I think that's because we have data from 2024-12-02 and 2024-12-09 only. When I extrapolate that to the entire year (52 weeks) and account for double network size, we are talking about ~110k rows. Loading that into memory at once seems doable to me. WDYT?

EXPLAIN ANALYZE
SELECT day::TEXT, to_address, amount 
FROM daily_reward_transfers 
WHERE day >= '2024-12-01' AND day <= '2024-12-31';

                                                                        QUERY PLAN                                                                         
-----------------------------------------------------------------------------------------------------------------------------------------------------------
 Index Scan using daily_reward_transfers_day on daily_reward_transfers  (cost=0.29..72.24 rows=1862 width=87) (actual time=0.032..0.586 rows=2189 loops=1)
   Index Cond: ((day >= '2024-12-01'::date) AND (day <= '2024-12-31'::date))
 Planning Time: 0.106 ms
 Execution Time: 0.720 ms

Having wrote that, I have a different concern:

The execution time for two weeks' worth of data is 0.720ms. That would be like 18 seconds to query the entire year. I think we need to impose some limits on the filter interval this API endpoint allows.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bajtos Indeed, limiting the range would be more optimal.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member

@bajtos bajtos left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's great that you found a way how to make this change in a backwards-compatible way!

I am concerned about the pressure this can put on our DB.

export const fetchDailyRewardTransfers = async (pgPool, filter) => {
const { rows } = await pgPool.query(`
SELECT day::TEXT, SUM(amount) as amount
SELECT day::TEXT, to_address, amount
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point.

I ran this query against the live database, and it returned less than 2000 rows. I think that's because we have data from 2024-12-02 and 2024-12-09 only. When I extrapolate that to the entire year (52 weeks) and account for double network size, we are talking about ~110k rows. Loading that into memory at once seems doable to me. WDYT?

EXPLAIN ANALYZE
SELECT day::TEXT, to_address, amount 
FROM daily_reward_transfers 
WHERE day >= '2024-12-01' AND day <= '2024-12-31';

                                                                        QUERY PLAN                                                                         
-----------------------------------------------------------------------------------------------------------------------------------------------------------
 Index Scan using daily_reward_transfers_day on daily_reward_transfers  (cost=0.29..72.24 rows=1862 width=87) (actual time=0.032..0.586 rows=2189 loops=1)
   Index Cond: ((day >= '2024-12-01'::date) AND (day <= '2024-12-31'::date))
 Planning Time: 0.106 ms
 Execution Time: 0.720 ms

Having wrote that, I have a different concern:

The execution time for two weeks' worth of data is 0.720ms. That would be like 18 seconds to query the entire year. I think we need to impose some limits on the filter interval this API endpoint allows.

Copy link
Member

@bajtos bajtos left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@juliangruber juliangruber merged commit b59fdd7 into main Dec 12, 2024
10 checks passed
@juliangruber juliangruber deleted the add/individual-transfers branch December 12, 2024 12:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add participant addresses in GET /transfers/daily
3 participants