Échantillonnage

De l’intérêt des sondages

      Nous avons découvert que le stockage orienté colonne était intéressant dans certains traitements analytiques. Les résultats obtenus étaient exacts. Cependant, parfois, des résultats approximatifs sont suffisants pour dessiner une tendance et nous pouvons sacrifier l’exactitude au profit de la vitesse. Dans ce cas, il est possible de ne s’intéresser qu’à un échantillon des données. N’utilisez pas LIMIT ou FETCH FIRST n ROWS (ou ROWNUM avec Oracle) pour cela, utilisez TABLESAMPLE disponible avec PostgreSQL depuis la 9.5. Les sondages sont souvent décriés dans d’autres domaines mais leur efficacité peut être redoutable quand ils sont bien réalisés et utilisés à bon escient.
      Démonstration reprenant cet environnement :

select version(); version -------------------------------------------------------------------------------------------------- PostgreSQL 9.6.2 on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-6) 6.3.0 20170205, 64-bit (1 ligne) SELECT mode() WITHIN GROUP (ORDER BY heureux) FROM geants TABLESAMPLE SYSTEM(10); mode ------ t (1 ligne) Temps : 2792,840 ms SELECT idu, devise FROM geants TABLESAMPLE SYSTEM(10) WHERE not actif AND not heureux AND veteran AND berserk AND cyclope ; idu | devise -----+-------- (0 ligne) Temps : 1169,684 ms SELECT 10 * count(*) FROM geants TABLESAMPLE SYSTEM(10) WHERE ere = 'LICORNE'; ?column? ---------- 22125550 (1 ligne) Temps : 1704,898 ms SELECT avg(taille) FROM geants TABLESAMPLE SYSTEM(10) WHERE revenu > 800000; avg ---------------------- 300.6035047595785999 (1 ligne) Temps : 1508,053 ms

      Que constatons-nous ? Nous obtenons les résultats plus rapidement mais travailler sur un échantillon n’est pas forcément adapté. Ici l’intruse est "SELECT idu, devise FROM geants TABLESAMPLE SYSTEM(10) WHERE not actif AND not heureux AND veteran AND berserk AND cyclope". En effet la requête ne retourne aucune ligne. Si le but était d’identifier précisément les géants concernés nous les ratons car la requête originale ramenait 2 lignes. Tout au plus pouvons-nous conclure que les géants concernés ne sont pas nombreux s’ils existent.
      En revanche, les autres approximations sont potentiellement intéressantes. Ici la méthode SYSTEM travaillant au niveau page est utilisée en considérant 10% des données mais la méthode BERNOULLI travaillant au niveau ligne existe également. Ne pas oublier tout de même lorsqu’une somme ou un count(*) est demandé que nous travaillons sur environ N% des données.

Mise à jour : 26/03/2017