Olá Douglas,
Eu não sou o Guilherme mas se você e ele não se importarem, eu vou responder.
Se seus registros são tipados: entrada e saída (colunas diferentes) então você deve.
Somar todas as entradas e subtrair as saídas na mesma query
select sum(m.entrada) - sum(m.saidas) from Movimento m where m.conta = :conta
Se seus registros são sem tipo: Entrada e saída é uma mera variação de sinal presente no valor (positivo ou negativo em uma coluna apenas)
Somar todos os registros na mesma query e o resultado esta pronto.
select sum(m.valor) from Movimento m where m.conta = :conta
E os índices?
Imagine que vc tem uma tabela única de movimentos, ok?
Quando o usuário X entrar, ele vai ver movimentações sobre alguns filtros, como no exemplo:
1) Empresa
2) Setor ou departamento
3) Por estado do movimento
4) Por tipo ou status de movimento
...
Se esses são exemplos de pesquisas que podem ser feitas, é fundamental criar um índice com os campos em que lhe fizerem sentido.
Não precisa ser indice individual, os bancos de dados relacionais já são espertos o suficiente para aproveitar o índice por todas as colunas, no caso de não haver um índice específico para sua query.
Recomendo não se preocupar com pessoas inserindo registros ao mesmo tempo. Se sua solução utilizar o SUM, isso não seria um problema.
Caso queira saber mais sobre controle de concorrência, estude estratégias de lock. Elas existem no JPA/Hibernate (Lock Otimista e Pessimista) e no Banco de Dados (Locks de Tabela, Página, Bloco e Registro).
@Entity
@Indices({
@Index(members={"idMovimento"}, unique = true),
@Index(members={"idConta"}),
@Index(members={"idConta", "tipoMovimento"}
}
public class Movimento {
String idMovimento;
String idConta;
String tipoMovimento;
}
Espero ter ajudado,
Abraço,
Rodrigo