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écute lazy_nrow() sur les deux tables à chaque appel, même quand check_count: false et 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 dans write_rules_template() (l.49) et une fois dans le corps de compare_datasets_from_yaml() (l.299-300) — un aller-retour DB évitable.
- Colonnes inutiles dans le join :
left_join embarque aussi les ignore_columns et 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. Un select(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ès filter(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
Contexte
Quatre coûts évitables autour du join et des comptages, sensibles surtout sur le chemin lazy/Parquet :
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.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.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)
Critères de succès
lazy_nrow()appelé uniquement sicheck_countest actif ou si le chemin est positionnel.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.