Conclusion

mutate suivi de select n’est pas neutre, mais va plus vite que le calcul lui-même. Il est probable que l’on paye l’optimisation de la requête SQL, mais le calcul est évité.

Préparation

con <- DBI::dbConnect(duckdb::duckdb())
flights <- nycflights13::flights
DBI::dbWriteTable(con, name = "flights_table", value = flights)

Benchmark

On compare

On force le calcul en demandant à DuckDB de stocker le résultat dans une table temporaire.

microbenchmark::microbenchmark(
  zero = con %>% tbl("flights_table"),
  nothing = con %>% tbl("flights_table") %>% compute(),
  mutate_seul = con %>% tbl("flights_table") %>% mutate(calcul = exp(distance)) %>% compute(),
  mutate_select = con %>% tbl("flights_table") %>% mutate(calcul = exp(distance)) %>% select(-calcul) %>% compute(),
  times = 20L
) %>% ggplot2::autoplot()

DBI::dbDisconnect(con)