É porque se o DB não estiver no mesmo servidor que o frontend, você terá que fazer uma viagem de ida e volta para cada consulta (possivelmente mais, dependendo do tamanho da resposta). Pode facilmente levar até 1 ms para executar ping em outro servidor no mesmo datacenter. Muito menos se os dois servidores estiverem no mesmo rack, mas 1 ms é uma boa regra prática.
Isso significa que, para ~ 300 consultas pequenas, você deve esperar ~ 300 ms, muito próximo do que está vendo.
Se os dois servidores estiverem na mesma máquina, você só precisará fazer algumas alternâncias de contexto entre os processos para mover os dados do processo de banco de dados para o frontend. Normalmente, um switch de contexto (com todos os flushes típicos) leva ~ 40us (muito amplamente falando), e você precisa de pelo menos um par deles (frontend pede dados, DB lê requisições e prepara e serve os dados, e frontend lê de volta o dados). Então eu esperaria ~ 80us para cada consulta (vamos arredondar para 0.1ms para tornar a matemática mais fácil). Assim, você pode esperar ~ 30 ms por 300 consultas pequenas, o que também é muito parecido com o que você está vendo.