**Describe the situation**
```
$ ./clickhouse-21.3.3 client --query "SELECT * FROM system.numbers_mt FORMAT Native" | pv > /dev/null
^C,1GiB 0:00:45 [ 710MiB/s] [                                                                                                                                                                                               <=>                      ]

$ ./clickhouse-21.3.3 client --compress 0 --query "SELECT * FROM system.numbers_mt FORMAT Native" | pv > /dev/null
^C,2GiB 0:00:12 [1,48GiB/s] [                                                   <=>                                                                                                                                                                  ]
```

void sendData(const Block & block, const String & name = "", bool scalar = false);
    
    void sendScalarsData(Scalars & data);
    
    void sendExternalTablesData(ExternalTablesData & data);
    
    void sendIgnoredPartUUIDs(const std::vector<UUID> & uuids);
    void sendReadTaskResponse(const String &);
    
    
    void sendPreparedData(ReadBuffer & input, size_t size, const String & name = "");
    
    bool poll(size_t timeout_microseconds = 0);
    
    bool hasReadPendingData() const;
    
    std::optional<UInt64> checkPacket(size_t timeout_microseconds = 0);
    
    Packet receivePacket();
    
    void forceConnected(const ConnectionTimeouts & timeouts);
    bool isConnected() const { return connected; }
    TablesStatusResponse getTablesStatus(const ConnectionTimeouts & timeouts,
                                         const TablesStatusRequest & request);
    /** Disconnect.
      * This may be used, if connection is left in unsynchronised state
      *  (when someone continues to wait for something) after an exception.
      */
    void disconnect();
    size_t outBytesCount() const { return out ? out->count() : 0; }