```sql

CREATE MATERIALIZED VIEW player_champ_counts_mv
ENGINE = AggregatingMergeTree() ORDER BY (patch_num, my_account_id, champ_id)
as select patch_num, my_account_id, champ_id, countState() as c_state
from full_info
group by patch_num, my_account_id, champ_id;

create view player_champ_counts as
select patch_num, my_account_id, champ_id, countMerge(c_state) as c
from player_champ_counts_mv
group by patch_num, my_account_id, champ_id;
```

2.4s:
`select * from player_champ_counts`

900ms:
```
select patch_num, my_account_id, champ_id, countMerge(c_state) as c
from player_champ_counts_mv
group by patch_num, my_account_id, champ_id;
```

In other words, just inlining the definition of the view is doing something different than querying the view itself.
void addPipe(Processors pipe);
    
    void addTotalsHavingTransform(ProcessorPtr transform);
    
    void addExtremesTransform();
    
    void addCreatingSetsTransform(ProcessorPtr transform);
    
    void setOutputFormat(ProcessorPtr output);
    
    
    void setSinks(const ProcessorGetterWithStreamKind & getter);
    
    void addDefaultTotals();
    
    void addTotals(ProcessorPtr source);
    
    void dropTotalsAndExtremes();
    
    void addDelayedStream(ProcessorPtr source);
    
    bool hasMixedStreams() const { return has_resize || hasMoreThanOneStream(); }
    
    void resize(size_t num_streams, bool force = false, bool strict = false);
    void enableQuotaForCurrentStreams();
    void unitePipelines(std::vector<std::unique_ptr<QueryPipeline>> pipelines, const Block & common_header);
    PipelineExecutorPtr execute();
    size_t getNumStreams() const { return streams.size(); }