Dado que a consulta já é bastante simples, as opções que eu procuraria são ...
- Plano de execução (para encontrar quaisquer índices ausentes que você possa adicionar)
- caching (para garantir que o SQL já tenha todos os dados na ram)
- desnormalização (para transformar a consulta em seleção simples)
- coloque os dados em cache no aplicativo (para que você possa usar algo como PLINQ nele)
- Use um armazenamento baseado em RAM (redis, elastic)
- Ajustes do grupo de arquivos (mover fisicamente o db para discos mais rápidos)
- Particione suas tabelas (para distribuir os dados brutos em vários discos físicos)
Quanto mais você desce nesta lista, mais envolvidas as soluções se tornam. Acho que depende de quão rápido você precisa que a consulta seja e de quanto você precisa que sua solução seja dimensionada.