I am working on a research paper which addresses techniques to optimize queries which spend most of time in IO. By reducing IO, queries speed can be improved. IO can be reduced by

1- merging subqueries operating on same data
2- elimination of unary/binary operator
3- by adding custom logical and physical operators.

In this pull request there is implementation to eliminate join. These changes have been tested for Q28 , Q88 and Q90 , This increases query performance and also does not have negative impact on other queries.

For example Q90

SELECT cast(amc AS DECIMAL(15, 4)) / cast(pmc AS DECIMAL(15, 4)) am_pm_ratio
FROM (SELECT count(*) amc
FROM web_sales, household_demographics, time_dim, web_page
WHERE ws_sold_time_sk = time_dim.t_time_sk
  AND ws_ship_hdemo_sk = household_demographics.hd_demo_sk
  AND ws_web_page_sk = web_page.wp_web_page_sk
  AND time_dim.t_hour BETWEEN 8 AND 8 + 1
  AND household_demographics.hd_dep_count = 6
  AND web_page.wp_char_count BETWEEN 5000 AND 5200) at,
  (SELECT count(*) pmc
  FROM web_sales, household_demographics, time_dim, web_page
  WHERE ws_sold_time_sk = time_dim.t_time_sk
    AND ws_ship_hdemo_sk = household_demographics.hd_demo_sk
    AND ws_web_page_sk = web_page.wp_web_page_sk
    AND time_dim.t_hour BETWEEN 19 AND 19 + 1
    AND household_demographics.hd_dep_count = 6
    AND web_page.wp_char_count BETWEEN 5000 AND 5200) pt
ORDER BY am_pm_ratio
LIMIT 100

can be optimized to following form

SELECT cast(amc AS DECIMAL(15, 4)) / cast(pmc AS DECIMAL(15, 4)) am_pm_ratio
FROM (SELECT count(*)  FILTER (WHERE time_dim.t_hour BETWEEN 8 AND 8 + 1) amc, 
             count(*)  FILTER (WHERE time_dim.t_hour BETWEEN 19 AND 19 + 1) pmc
FROM web_sales, household_demographics, time_dim, web_page
WHERE ws_sold_time_sk = time_dim.t_time_sk
  AND ws_ship_hdemo_sk = household_demographics.hd_demo_sk
  AND ws_web_page_sk = web_page.wp_web_page_sk
  AND ((time_dim.t_hour BETWEEN 8 AND 8 + 1) OR (time_dim.t_hour BETWEEN 19 AND 19 + 1) )
  AND household_demographics.hd_dep_count = 6
  AND web_page.wp_char_count BETWEEN 5000 AND 5200)
ORDER BY am_pm_ratio
LIMIT 100

Image description