Hola.
Lo primero que te recomiendo es que utilices Joins explícitos, como te recomienda el compañero. Facilita mucho la comprensión de la consulta, y por tanto la optimización de la misma.
Respecto a los índices, el hecho de que la consulta utilice índices para todas las tablas no quiere decir que esos índices sean óptimos. Está claro que en alguna tabla se podría crear una índice que agilizaría mucho más la consulta de lo que hacen los índices actuales.
En todo caso, ante una consulta tan sencilla. Puedes simplemente ir por partes.
Empieza por :
Código SQL
[-]select cabalbcli.ncentro
from cabalbcli
where cabalbcli.lfacturable=0 and cabalbcli.ntipoop=2 and
(cabalbcli.dfecha >= '10/01/10' and cabalbcli.dfecha <= '10/31/10')
Y después le vas añadiendo una a una las tablas relacionadas.
Código SQL
[-]select cabalbcli.ncentro
from cabalbcli
inner join linalbcli on cabalbcli.ncod_albaran = linalbcli.ncod_albaran and cabalbcli.ccod_serie = linalbcli.ccod_serie
where cabalbcli.lfacturable=0 and cabalbcli.ntipoop=2 and
(cabalbcli.dfecha >= '10/01/10' and cabalbcli.dfecha <= '10/31/10') and
linalbcli.lenvase=0 and linalbcli.ncantidadvalor < 0 and
(linalbcli.ctipolinea='V' or linalbcli.ctipolinea='P' or linalbcli.ctipolinea='R') and
linalbcli.nenlacefab is null
Cuando la consulta se bloquee, ya sabes en que unión tienes que añadir un índice que permita localizar rapidamente sus registros.