PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 21/08/2012 18:14:35

Postgres.0
Membre

BitmapAnd

Bonjour,

j'ai un problème avec cette requette, quelqu'un a t'il une idée pour aider à comprendre le comportement de ce planificateur et surtout l'améliorer.


Un truc très bizarre, c'est que le BitmapAnd ramène 0 lignes alors que le Bitmap Heap Scan lui ramène un nombre de ligne =1720.
 



Hometal=# explain analyze SELECT count(*)  FROM aus.fintrac  
WHERE  date_transaction between '2012-02-29 00:00:00' and '2012-03-01 23:59:59'  
AND idc = 196 
AND id_org = ANY '{1686,1495,502,708,10691,921,1219,707,704,1494,710,1576,1536,1539,506,1218,504,500,1540,1545,1510,1217,1578,822,1489,1530,1738,13920,719,797,715,1506,1544,1548,1114,1493,712,717,1825,1523,713,923,1519,706,1512,922,1524,1525,1322,14901,711,1521,1568,1811,1491,705,1490,1533,1574,1527,714,718,1488,709,1492,791,716}') 
 AND id_type = ANY( '{4}' ) ;
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Aggregate  (cost=138936.39..138936.40 rows=1 width=0) (actual time=437393.828..437393.828 rows=1 loops=1)
   ->  Append  (cost=0.00..138929.52 rows=2747 width=0) (actual time=138070.950..437390.474 rows=3653 loops=1)
         ->  Index Scan using fintrac_ndx2 on fintrac  (cost=0.00..4.36 rows=1 width=0) (actual time=0.016..0.016 rows=0 loops=1)
               Index Cond: (idc = 196)
               Filter: ((id_type = ANY ('{4}'::smallint[])) AND (date_transaction >= '2012-02-29 00:00:00'::timestamp without time zone) AND (date_transaction <= '2012-03-01 23:59:59'::timestamp without time zone) AND (id_org = ANY ('{1686,1495,502,708,10691,921,1219,707,704,1494,710,1576,1536,1539,506,1218,504,500,1540,1545,1510,1217,1578,822,1489,1530,1738,13920,719,797,715,1506,1544,1548,1114,1493,712,717,1825,1523,713,923,1519,706,1512,922,1524,1525,1322,14901,711,1521,1568,1811,1491,705,1490,1533,1574,1527,714,718,1488,709,1492,791,716}'::integer[])))
         ->  Bitmap Heap Scan on par_fintrac_2012_02 fintrac  (cost=21733.75..68140.80 rows=1365 width=0) (actual time=138070.933..200613.841 rows=1933 loops=1)
               Recheck Cond: ((date_transaction >= '2012-02-29 00:00:00'::timestamp without time zone) AND (date_transaction <= '2012-03-01 23:59:59'::timestamp without time zone) AND (id_org = ANY ('{1686,1495,502,708,10691,921,1219,707,704,1494,710,1576,1536,1539,506,1218,504,500,1540,1545,1510,1217,1578,822,1489,1530,1738,13920,719,797,715,1506,1544,1548,1114,1493,712,717,1825,1523,713,923,1519,706,1512,922,1524,1525,1322,14901,711,1521,1568,1811,1491,705,1490,1533,1574,1527,714,718,1488,709,1492,791,716}'::integer[])))
               Filter: ((id_type = ANY ('{4}'::smallint[])) AND (idc = 196))
               ->  BitmapAnd  (cost=21733.75..21733.75 rows=23285 width=0) (actual time=128014.793..128014.793 rows=0 loops=1)
                     ->  Bitmap Index Scan on par_fintrac_2012_02_ndx1  (cost=0.00..9665.01 rows=432131 width=0) (actual time=4152.068..4152.068 rows=418206 loops=1)
                           Index Cond: ((date_transaction >= '2012-02-29 00:00:00'::timestamp without time zone) AND (date_transaction <= '2012-03-01 23:59:59'::timestamp without time zone))
                     ->  Bitmap Index Scan on par_fintrac_2012_02_ndx3  (cost=0.00..12067.81 rows=632219 width=0) (actual time=123725.475..123725.475 rows=704808 loops=1)
                           Index Cond: (id_org = ANY ('{1686,1495,502,708,10691,921,1219,707,704,1494,710,1576,1536,1539,506,1218,504,500,1540,1545,1510,1217,1578,822,1489,1530,1738,13920,719,797,715,1506,1544,1548,1114,1493,712,717,1825,1523,713,923,1519,706,1512,922,1524,1525,1322,14901,711,1521,1568,1811,1491,705,1490,1533,1574,1527,714,718,1488,709,1492,791,716}'::integer[]))
         ->  Bitmap Heap Scan on par_fintrac_2012_03 fintrac  (cost=22877.18..70784.35 rows=1381 width=0) (actual time=177594.088..236774.372 rows=1720 loops=1)
               Recheck Cond: ((date_transaction >= '2012-02-29 00:00:00'::timestamp without time zone) AND (date_transaction <= '2012-03-01 23:59:59'::timestamp without time zone) AND (id_org = ANY ('{1686,1495,502,708,10691,921,1219,707,704,1494,710,1576,1536,1539,506,1218,504,500,1540,1545,1510,1217,1578,822,1489,1530,1738,13920,719,797,715,1506,1544,1548,1114,1493,712,717,1825,1523,713,923,1519,706,1512,922,1524,1525,1322,14901,711,1521,1568,1811,1491,705,1490,1533,1574,1527,714,718,1488,709,1492,791,716}'::integer[])))
               Filter: ((id_type = ANY ('{4}'::smallint[])) AND (idc = 196))
               ->  BitmapAnd  (cost=22877.18..22877.18 rows=23980 width=0) (actual time=176786.846..176786.846 rows=0 loops=1)
                     ->  Bitmap Index Scan on par_fintrac_2012_03_ndx1  (cost=0.00..9651.17 rows=447937 width=0) (actual time=3576.379..3576.379 rows=460007 loops=1)
                           Index Cond: ((date_transaction >= '2012-02-29 00:00:00'::timestamp without time zone) AND (date_transaction <= '2012-03-01 23:59:59'::timestamp without time zone))
                     ->  Bitmap Index Scan on par_fintrac_2012_03_ndx3  (cost=0.00..13225.07 rows=716892 width=0) (actual time=173106.841..173106.841 rows=812583 loops=1)
                           Index Cond: (id_org = ANY ('{1686,1495,502,708,10691,921,1219,707,704,1494,710,1576,1536,1539,506,1218,504,500,1540,1545,1510,1217,1578,822,1489,1530,1738,13920,719,797,715,1506,1544,1548,1114,1493,712,717,1825,1523,713,923,1519,706,1512,922,1524,1525,1322,14901,711,1521,1568,1811,1491,705,1490,1533,1574,1527,714,718,1488,709,1492,791,716}'::integer[]))
Total runtime: 437395.251 ms
(22 rows)

Dernière modification par Postgres.0 (21/08/2012 18:15:28)

Hors ligne

#2 22/08/2012 09:06:27

Marc Cousin
Membre

Re : BitmapAnd

Comme les bitmap sont de grandes tailles, je pense qu'il est passé en bitmap de blocs et non plus d'enregistrements, d'où le 0 (ne pas s'en soucier, c'est juste de l'affichage).

Pour aller plus vite:

- Déjà essayer avec des IN plutôt que des ANY (je ne suis pas sûr que ça n'ait pas un impact sur les performances, et utiliser ANY n'a pas trop de sens ici, ANY c'est pour chercher des données dans les éléments d'un tableau d'une table, pas pour fournir un tableau constant à comparer avec un scalaire d'une table).
- Si ce n'est pas suffisant, un index multi-colonnes bien ciblé pourrait aider (en sélection, il va coûter en insertion).


Marc.

Hors ligne

#3 22/08/2012 11:25:35

Postgres.0
Membre

Re : BitmapAnd

Ok, je vais ressayer encore le IN à la place du ANY.

Que fait exactement cette ligne :

Append  (cost=0.00..138929.52 rows=2747 width=0) (actual time=138070.950..437390.474 rows=3653 loops=1)


Je ne comprends pas l'uitilité du Append.

Une auttre question :

Postgres utilise des bloc de 8 ko, est-ce-qu'il faut remplir les blocs ou bien laiseer une partie vide au cas où y aurai un update, comme ça la nouvelle ligne soit dans le meme bloc que l'ancienne.


Serait-il possible de modifier le paramètre default_statistics_target pour une table donnée ?

Dernière modification par Postgres.0 (22/08/2012 11:28:37)

Hors ligne

#4 22/08/2012 13:17:38

rjuju
Administrateur

Re : BitmapAnd

Le nœud Append ajoute les lignes trouvées dans les nœuds en dessous, ici les 2 partitions  par_fintrac_2012_02 et par_fintrac_2012_03


Pour votre 2ème question, cela dépend de l'utilisation de votre base ou d'une table spécifique, et de l'espace disque supplémentaire que  vous êtes prêt à utiliser pour ça. C'est surtout utile pour les mises à jour HOT, donc mise à jour de champs non indexés. Cela ralentira par contre d'autres choses (tables plus grosses, besoin de plus de ram, parcours séquentiels plus long etc).


Non, on ne peut le faire qu'à la colonne. Vous pouvez néanmoins créer une procédure stockée qui appellera "ALTER TABLE nom_table ALTER nom_colonne SET STATISTICS x;" sur toutes les colonnes d'une table.

En ligne

#5 22/08/2012 13:56:53

Postgres.0
Membre

Re : BitmapAnd

Merci bcp julien !

Hors ligne

Pied de page des forums