Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#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.
Julien.
https://rjuju.github.io/
Hors ligne
#5 22/08/2012 13:56:53
- Postgres.0
- Membre
Re : BitmapAnd
Merci bcp julien !
Hors ligne