Increasing processing threads can only help if you have idle CPU/memory. More threads also means more direct memory, so make sure you allocate that as well. Group by queries are affected by the druid.processing.numMergeBuffers which also use direct memory, so you might want to increase this instead if the query workload is group by heavy.
At some point, the resources will be exhausted and you will need more historicals.
You can figure out where the time is being spent by looking at
metrics.
query/segment/time
and
segment/scan/active
,
segment/scan/pending
are useful to determine how much work is being done and how much is pending.
Segment size optimization can make this more efficient by having less segments of larger sizes. Large segments will have higher segment scan times. So it is a trade off.