Para verificar la existencia de un registro es mucho mejor usar una función ad-hoc
existe, que verifique la existencia en vez de contar la cantidad de registros con un select count y preguntar si la cantidad de registros es mayor que cero. Esto es más dramático cuando usamos un where por un campo con valor no único o una clausula like. Por ejemplo, si deseamos saber si existe un registro con tipo de objeto = 'SYNONYM' , una alternativa (generalmente usada) es hacer:
SELECT COUNT (*)
FROM objetos
WHERE object_type = 'SYNONYM';
Una mejor alternativa es hacer una función:
FUNCTION existe (
p_object_type IN objetos.object_type%TYPE
)
RETURN BOOLEAN IS
CURSOR c_existe IS
SELECT 'x'
FROM objetos
WHERE object_type = p_object_type;
v_dummy VARCHAR2 (1);
v_existe BOOLEAN;
BEGIN
OPEN c_existe;
FETCH c_existe
INTO v_dummy;
v_existe := c_existe%FOUND;
CLOSE c_existe;
RETURN v_existe;
END existe;
El primer caso recorre todos los registros, en el segundo caso, solo llega al primer registro y retorna la existencia. Si creamos un bloque anónimo con llamadas iterativas a estas dos instrucciones, tenemos que el tiempo de ejecución es mucho menor para el código ad-hoc
eEvalua_Count_vs_Existencia.sql
La salida de este script es:
Select vía Count:Tiempo en segundos:TF-TI:147 segundos.
Función existe:Tiempo en segundos:TF-TI:2 segundos.
Por lo tanto, el tiempo de respuesta y el uso de recursos son mucho mejores en el segundo caso. Además, la función de existencia es fácil de implementar programáticamente usando el diccionario de la base de datos.