No soy muy experto, pero creo que podrias mejorar bastante en 2 puntos:
1. para calcular la edad, mejor utiliza DateDiff, en vez del codigo de calculo de meses y años que utiliza tu SP
ejemplo
select DateDiff(year, FechaNacimiento, FechaActual)
2.- puedes usar inner join en vez de select para obtener la informacion de las demas tablas. el inner hace lo mismo que tus select anidados, pero es mas eficiente, ademas, al hacer el ON, ya estas haciendo un where implicito que no necesitas filtrar despues. esto te ahorra una buena cantidad de registros que despues de todas formas eliminas
de esta forma
Código:
SELECT P.COD_PERSONA,
P.APE_PATERNO,
P.APE_MATERNO,
P.NOMBRES,
P.SEXO ,
datediff(year, FEC_NACIMIENTO, TimeStamp) as edad,
UB.REGION AS LUGAR_NAC,
D.NRO_DOCUMENTO AS DNI,
R.NRO_RUC AS RUC,
E.AUTOGENERADO as ESSALUD,
FROM TB_PERSONA P
inner join UBIGEO UB on D.COD_PERSONA=P.COD_PERSONA
UB.COD_UBIGEO = D.UBIGEO_NAC
inner join DNI_PERSONA D on D.COD_PERSONA=P.COD_PERSONA
inner join RUC_PERSONA R R.COD_PERSONA=P.COD_PERSONA
inner join ESSALUD_PERSONA E on E.COD_PERSONA=P.COD_PERSONA
los inner tienen la particularidad que puedes decidir que accion tomar, dependendo de que lado de la consulta se encuentre disponible, por ejemplo, si la region donde nacio la persona no existe, (que es un dato al lado derecxho de la consulta) puedes pespecificar con right join que no aparezca el registro si el dato no esta. Tb puedes hacer al contratrio con left outer join
espero te sirva de algo
slds
plch