```sql
SELECT count()
FROM 
(
    SELECT number
    FROM numbers_mt(100000000)
    ORDER BY number DESC
    LIMIT 100
    UNION ALL
    SELECT number
    FROM numbers_mt(100000000)
    ORDER BY number DESC
    LIMIT 100
    UNION ALL
    SELECT number
    FROM numbers_mt(100000000)
    ORDER BY number DESC
    LIMIT 100
)


SET experimental_use_processors = 0;
-- 1 rows in set. Elapsed: 1.581 sec. Processed 300.00 million rows, 2.40 GB (189.78 million rows/s., 1.52 GB/s.) 

SET experimental_use_processors = 1;
-- 1 rows in set. Elapsed: 3.569 sec. Processed 300.00 million rows, 2.40 GB (84.06 million rows/s., 672.50 MB/s.) 
```

Similar for MergeTree:

```sql
create table test engine=MergeTree order by tuple() as select * from numbers(30000000);

select count() from (select number from test group by number order by number limit 10 union all select number from test group by number order by number limit 10);

set experimental_use_processors=0;
-- Elapsed: 2.664 sec

set experimental_use_processors=1;
-- Elapsed: 3.656 sec
```
std::vector<std::shared_ptr<Context>> interpreter_context;
    std::vector<StoragePtr> storage_holders;
    TableLockHolders table_locks;
    
    Block current_header;
    ProcessorsContainer processors;
    
    Streams streams;
    
    OutputPort * totals_having_port = nullptr;
    OutputPort * extremes_port = nullptr;
    
    bool has_resize = false;
    IOutputFormat * output_format = nullptr;
    
    
    size_t max_threads = 0;
    QueryStatus * process_list_element = nullptr;
    void checkInitialized();
    void checkInitializedAndNotCompleted();
    static void checkSource(const ProcessorPtr & source, bool can_have_totals);
    template <typename TProcessorGetter>
    void addSimpleTransformImpl(const TProcessorGetter & getter);
    void initRowsBeforeLimit();
    friend class QueryPipelineProcessorsCollector;
};
class QueryPipelineProcessorsCollector