@@ -813,7 +813,6 @@ cost_bitmap_heap_scan(Path *path, PlannerInfo *root, RelOptInfo *baserel,
813
813
Cost startup_cost = 0 ;
814
814
Cost run_cost = 0 ;
815
815
Cost indexTotalCost ;
816
- Selectivity indexSelectivity ;
817
816
QualCost qpqual_cost ;
818
817
Cost cpu_per_tuple ;
819
818
Cost cost_per_page ;
@@ -837,54 +836,18 @@ cost_bitmap_heap_scan(Path *path, PlannerInfo *root, RelOptInfo *baserel,
837
836
if (!enable_bitmapscan )
838
837
startup_cost += disable_cost ;
839
838
840
- /*
841
- * Fetch total cost of obtaining the bitmap, as well as its total
842
- * selectivity.
843
- */
844
- cost_bitmap_tree_node (bitmapqual , & indexTotalCost , & indexSelectivity );
839
+ pages_fetched = compute_bitmap_pages (root , baserel , bitmapqual ,
840
+ loop_count , & indexTotalCost ,
841
+ & tuples_fetched );
845
842
846
843
startup_cost += indexTotalCost ;
844
+ T = (baserel -> pages > 1 ) ? (double ) baserel -> pages : 1.0 ;
847
845
848
846
/* Fetch estimated page costs for tablespace containing table. */
849
847
get_tablespace_page_costs (baserel -> reltablespace ,
850
848
& spc_random_page_cost ,
851
849
& spc_seq_page_cost );
852
850
853
- /*
854
- * Estimate number of main-table pages fetched.
855
- */
856
- tuples_fetched = clamp_row_est (indexSelectivity * baserel -> tuples );
857
-
858
- T = (baserel -> pages > 1 ) ? (double ) baserel -> pages : 1.0 ;
859
-
860
- if (loop_count > 1 )
861
- {
862
- /*
863
- * For repeated bitmap scans, scale up the number of tuples fetched in
864
- * the Mackert and Lohman formula by the number of scans, so that we
865
- * estimate the number of pages fetched by all the scans. Then
866
- * pro-rate for one scan.
867
- */
868
- pages_fetched = index_pages_fetched (tuples_fetched * loop_count ,
869
- baserel -> pages ,
870
- get_indexpath_pages (bitmapqual ),
871
- root );
872
- pages_fetched /= loop_count ;
873
- }
874
- else
875
- {
876
- /*
877
- * For a single scan, the number of heap pages that need to be fetched
878
- * is the same as the Mackert and Lohman formula for the case T <= b
879
- * (ie, no re-reads needed).
880
- */
881
- pages_fetched = (2.0 * T * tuples_fetched ) / (2.0 * T + tuples_fetched );
882
- }
883
- if (pages_fetched >= T )
884
- pages_fetched = T ;
885
- else
886
- pages_fetched = ceil (pages_fetched );
887
-
888
851
/*
889
852
* For small numbers of pages we should charge spc_random_page_cost
890
853
* apiece, while if nearly all the table's pages are being read, it's more
@@ -4820,3 +4783,69 @@ get_parallel_divisor(Path *path)
4820
4783
4821
4784
return parallel_divisor ;
4822
4785
}
4786
+
4787
+ /*
4788
+ * compute_bitmap_pages
4789
+ *
4790
+ * compute number of pages fetched from heap in bitmap heap scan.
4791
+ */
4792
+ double
4793
+ compute_bitmap_pages (PlannerInfo * root , RelOptInfo * baserel , Path * bitmapqual ,
4794
+ int loop_count , Cost * cost , double * tuple )
4795
+ {
4796
+ Cost indexTotalCost ;
4797
+ Selectivity indexSelectivity ;
4798
+ double T ;
4799
+ double pages_fetched ;
4800
+ double tuples_fetched ;
4801
+
4802
+ /*
4803
+ * Fetch total cost of obtaining the bitmap, as well as its total
4804
+ * selectivity.
4805
+ */
4806
+ cost_bitmap_tree_node (bitmapqual , & indexTotalCost , & indexSelectivity );
4807
+
4808
+ /*
4809
+ * Estimate number of main-table pages fetched.
4810
+ */
4811
+ tuples_fetched = clamp_row_est (indexSelectivity * baserel -> tuples );
4812
+
4813
+ T = (baserel -> pages > 1 ) ? (double ) baserel -> pages : 1.0 ;
4814
+
4815
+ if (loop_count > 1 )
4816
+ {
4817
+ /*
4818
+ * For repeated bitmap scans, scale up the number of tuples fetched in
4819
+ * the Mackert and Lohman formula by the number of scans, so that we
4820
+ * estimate the number of pages fetched by all the scans. Then
4821
+ * pro-rate for one scan.
4822
+ */
4823
+ pages_fetched = index_pages_fetched (tuples_fetched * loop_count ,
4824
+ baserel -> pages ,
4825
+ get_indexpath_pages (bitmapqual ),
4826
+ root );
4827
+ pages_fetched /= loop_count ;
4828
+ }
4829
+ else
4830
+ {
4831
+ /*
4832
+ * For a single scan, the number of heap pages that need to be fetched
4833
+ * is the same as the Mackert and Lohman formula for the case T <= b
4834
+ * (ie, no re-reads needed).
4835
+ */
4836
+ pages_fetched =
4837
+ (2.0 * T * tuples_fetched ) / (2.0 * T + tuples_fetched );
4838
+ }
4839
+
4840
+ if (pages_fetched >= T )
4841
+ pages_fetched = T ;
4842
+ else
4843
+ pages_fetched = ceil (pages_fetched );
4844
+
4845
+ if (cost )
4846
+ * cost = indexTotalCost ;
4847
+ if (tuple )
4848
+ * tuple = tuples_fetched ;
4849
+
4850
+ return pages_fetched ;
4851
+ }
0 commit comments