ThinkR-open / ThinkR-open/datadiff
[perf] Scans et transferts évitables : COUNT(*) systématiques, schéma collecté deux fois, colonnes ignorées embarquées dans le join, collect intégral des doublons
Open
Nobody has claimed this yet.
- Dominant language
- R
- Stars
- 6
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
Contexte
Quatre coûts évitables autour du join et des comptages, sensibles surtout sur le chemin lazy/Parquet :
- Deux
COUNT(*)systématiques :validate_row_counts()(R/validation.R) exécutelazy_nrow()sur les deux tables à chaque appel, même quandcheck_count: falseet qu'une clé est fournie — cas où ces comptes ne servent à rien (ils ne sont consommés que par le chemin positionnel ou le check de comptage). Deux full scans gratuits par comparaison sur gros Parquet. - Schéma head-0 collecté deux fois quand
path = NULL: une fois danswrite_rules_template()(l.49) et une fois dans le corps decompare_datasets_from_yaml()(l.299-300) — un aller-retour DB évitable. - Colonnes inutiles dans le join :
left_joinembarque aussi lesignore_columnset les colonnes extra des deux côtés, jamais comparées, puis les transporte jusque dans l'agent pointblank — surcoût mémoire sur tables larges. Unselect(all_of(c(key, common_cols)))avant le join les élimine. find_duplicate_keys()lazy collecte tous les groupes dupliqués (R/duplicate_keys.R :collect()aprèsfilter(n > 1)) alors que seuls 2 agrégats et 3 exemples sont nécessaires — transfert massif si des millions de clés sont dupliquées ; agréger côté SQL +head(3).
Reprex (illustration du point 1)
library(datadiff); library(duckdb); library(dplyr)
con <- dbConnect(duckdb())
# sur un vrai Parquet volumineux, ces deux COUNT(*) se voient au profiler DuckDB
ref <- tbl(con, "read_parquet('gros.parquet')")
compare_datasets_from_yaml(ref, ref, key = "id") # check_count FALSE par défaut avec clé
Critères de succès
-
lazy_nrow()appelé uniquement sicheck_countest actif ou si le chemin est positionnel. - Un seul collect de schéma head-0 par table et par appel.
- Le
cmpjoint ne contient que clé + colonnes comparées ; extraits d'échec inchangés. -
find_duplicate_keys()lazy : agrégats calculés en SQL, au plus 3+1 groupes rapatriés. - Verdicts et warnings byte-identiques sur la suite de tests ; gains visibles au bench lazy.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with validate_row_counts() in R/validation.R, write_rules_template() and compare_datasets_from_yaml(), then inspect find_duplicate_keys() in R/duplicate_keys.R. Run the test suite and lazy benchmark; done means the four listed costs are removed while verdicts, warnings, failure excerpts, and byte-identical tests remain unchanged.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- r
- Domain
- databases, performance
- Issue type
- Refactor
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100