Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
1.13.0
-
None
Description
Disk cost for Hbase scan is calculated based on scan size in bytes.
float diskCost = scanSizeInBytes * ((columns == null || columns.isEmpty()) ? 1 : columns.size() / statsCalculator.getColsPerRow());
Scan size is bytes is estimated using TableStatsCalculator with the help of sampling.
When we estimate size for the first time (before applying filter push down), for sampling we use random rows. When estimating rows after filter push down, for sampling we use rows that qualify filter condition. It can happen that average row size can be higher after filter push down
than before. Unfortunately since disk cost depends on these calculations, plan with filter push down can give higher cost then without it.
Possible enhancements:
1. Currently default row count is 1 million but if during sampling we return less rows then expected, it means that our query will return not more rows then this number. We can use this number instead of default row count to achieve better cost estimations.
2. When filter push down was applied, row number was reduced by half in order to ensure plan with filter push down will have less cost. Then same should be done for disk cost as well.
Attachments
Issue Links
- links to