rickvdbosch's answer is spot on.
Here are some additional thoughts assuming this is an application. One approach would to read smaller PartitionKey ranges in parallel. For example, assuming the range being processed is June/2018, we would have:
- Thread-1 => PartitionKey ge '20180601' && PartitionKey lt '20180605'
- Thread-2 => PartitionKey ge '20180605' && PartitionKey lt '20180610'
- Thread-3 => PartitionKey ge '20180610' && PartitionKey lt '20180615'
- Thread-4 => PartitionKey ge '20180615' && PartitionKey lt '20180620'
- Thread-5 => PartitionKey ge '20180620' && PartitionKey lt '20180725'
- Thread-6 => PartitionKey ge '20180625' && PartitionKey lt '20180701'
Moreover, it is possible to be even more aggressive and read smaller partitions (e.g. daily) in parallel without using the TableQuery constructs.
Note that neither approach described above handles a partitioning strategy that is highly unbalanced. For example, assume that 95% of the data for June/2018 is stored on range '20180605' to '20180610' or in a single day, there may or may not be perceived improvement on the overall execution time compared to a serial read in this case, specially because of the parallelism overhead (e.g. threads, memory allocation, synchronization, etc.).
Now, assuming this is .NET application running on Windows OS and the approach described above is appealing to your scenario, consider:
- Increasing the max number of connections;
- Disabling the Nagle algorithm;
Find below a code snippet to change in the application configuration. Please note that:
Find more details about the connection management at https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/network/connectionmanagement-element-network-settings.