geoffreyclaude opened a new issue, #15529:
URL: https://github.com/apache/datafusion/issues/15529

   ### Is your feature request related to a problem or challenge?
   
   DataFusion currently has a "TopK early termination" optimization, which 
speeds up queries that involve `ORDER BY` and `LIMIT` if the input data is 
already sorted by the full ordering requested in the query.
   
   However, many real-world scenarios involve datasets that are only partially 
sorted.
   
   For example, consider a time-series dataset that's pre-sorted by `day` but 
not sorted within each day. Queries requesting data sorted by `day, timestamp` 
should still benefit significantly from optimization because once DataFusion 
has collected the required number of rows from the most recent day(s), it could 
safely ignore data from earlier days.
   
   Today, DataFusion does not take advantage of such partial ordering, 
resulting in unnecessary scans and sorts.
   
   Example query affected by this:
   
   ```sql
   SELECT day, sensor_id, reading, timestamp
   FROM sensor_readings
   WHERE sensor_id = 1002
   ORDER BY day DESC, timestamp DESC
   LIMIT 10;
   ```
   
   If the data source providing `sensor_readings` can guarantee a `day DESC` 
ordering, this query should quickly finish after scanning enough rows from the 
most recent days, but currently DataFusion will continue scanning unnecessarily 
the full `sensor_readings`.
   
   
   
   ### Describe the solution you'd like
   
   I propose extending DataFusion's existing "TopK early termination" 
optimization to handle cases where the input data is partially sorted by a 
prefix of the requested ordering.
   
   Specifically, DataFusion should detect:
   
   - When the input ordering has a non-empty common prefix with the query's 
requested ordering.
   - When the top-K buffer is full.
   - If all still pending rows are guaranteed to be strictly worse than the 
top-K's max value, comparing only on the common prefix.
   
   Under these conditions, DataFusion can safely terminate scanning early, 
significantly improving query performance and reducing resource consumption.
   
   ### Describe alternatives you've considered
   
   _No response_
   
   ### Additional context
   
   I wasn't able to find benchmarks on already sorted data.
   
   However, a simple reproducer from the TPCH dataset could be:
   ```sql
   CREATE EXTERNAL TABLE lineitem_ship (
       l_shipdate     DATE,
       l_commitdate   DATE,
       l_shipmode     VARCHAR,
       l_quantity     INT
   )
   STORED AS PARQUET
   LOCATION 'scratch/topk'
   WITH ORDER (l_shipdate);
   
   INSERT INTO lineitem_ship
   SELECT
       l_shipdate,
       l_commitdate,
       l_shipmode,
       l_quantity
   FROM lineitem
   ORDER BY l_shipdate;
   
   SELECT
       l_shipdate,
       l_commitdate,
       l_quantity
   FROM lineitem_ship
   WHERE l_shipmode IN ('MAIL', 'AIR')
   ORDER BY l_shipdate, l_commitdate, l_quantity
   LIMIT 10;
   ```
   
   This query today scans the full `lineitem_ship` table. I'd expect it to be 
orders of magnitude faster with the sort prefix enhancement.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org
For additional commands, e-mail: github-h...@datafusion.apache.org

Reply via email to