**Describe the situation**

```
SELECT * FROM test.hits INTO OUTFILE 'dump.csv' FORMAT CSV

8873898 rows in set. Elapsed: 32.487 sec. Processed 8.87 million rows, 8.46 GB (273.15 thousand rows/s., 260.42 MB/s.)
```

is bounded by single CPU core. Too slow :(
/// Poll for changes after a cancellation check, otherwise it never reached
            /// because of progress updates from server.
            if (connection->poll())
                break;
        }
        if (!receiveAndProcessPacket(parsed_query, cancelled))
            break;
    }
    if (cancelled && is_interactive)
        std::cout << "Query was cancelled." << std::endl;
}
/// Receive a part of the result, or progress info or an exception and process it.
/// Returns true if one should continue receiving packets.
/// Output of result is suppressed if query was cancelled.
bool ClientBase::receiveAndProcessPacket(ASTPtr parsed_query, bool cancelled)
{
    Packet packet = connection->receivePacket(
    switch (packet.type)
    {
        case Protocol::Server::PartUUIDs:
            return true;
        case Protocol::Server::Data:
            
                onData(packet.block, parsed_query
            return true;
        case Protocol::Server::Progress:
            onProgress(packet.progress
            return true;
        case Protocol::Server::ProfileInfo:
            onProfileInfo(packet.profile_info