**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 :(
{
    if (!block)
        return;
    proc= block.rows(
    /// Even if all blocks are empty, we still need to initialize the output stream to write empty resultset.
    initBlockOutputStream(block, parsed_query
    /// The header block containing zero rows was used to initialize
    /// output_format, do not output it.
     data if we're fuzzing.
    if (block.rows() == 0 || (query_fuzzer_runs != 0 && processed_rows >= 100))
        return;
    if (need_render_progress && (stdout_is_a_tty || is_interactive))
        progress_indication.clearProgressOutput(
    output_format->write(materializeBlock(block)
    written_first_block = true;
    /// Received data block is immediately displayed to the user.
    output_format->flush(
    /// Restore progress bar after data block.
    if (need_render_progress && (stdout_is_a_tty || is_interactive))
        progress_indication.writeProgress(
}
void ClientBase::onLogData(Block & block)
{
    initLogsOutputStream(
    progress_indication.clearProgressOutput(
    logs_out_stream->writeLogs(block
    logs_out_stream->flush(
}
void ClientBase::onTotals(Block & block, ASTPtr parsed_query)
{