sábado, 25 de abril de 2026

Cómo crear embeddings desde SQL en Oracle AI Database 26ai usando modelos ONNX?





Para implementar modelos de Machine Learning en Oracle Database 23ai On-premises, el enfoque más moderno y potente es la importación de modelos en formato ONNX para habilitar AI Vector Search.

Qué es ONNX?
Significa Open Neural Network Exchange y corresponde un formato abierto y estándar para representar modelos de Machine Learning e Inteligencia Artificial, diseñado para que un modelo entrenado en una herramienta pueda ejecutarse en otra.

Si haces una conexión a tu base de datos y ejecutas el siguiente comando y no recibes ningún registro de vuelta, es que no tienes ningún modelo cargado en tu base de datos.

SELECT model_name, mining_function, algorithm 
FROM user_mining_models

Al ejecutar la siguiente consulta buscando crear un embedding para una línea de texto, vas a recibir un error ORA-40284 indicando que el modelo no existe.

SQL> SELECT VECTOR_EMBEDDING(MI_MODELO_EMBEDDINGS USING 'Hola, esto es una prueba' AS DATA) AS vector
FROM DUAL;  2
FROM DUAL
     *
ERROR at line 2:
ORA-40284: model does not exist
Help: https://docs.oracle.com/error-help/db/ora-40284/

Así que vamos a preparar nuestra base de datos para poder crear a través de la función VECTOR_EMBEDDING, una representación vectorial de un texto.

Lo primero, vamos a brindar los permisos necesarios al esquema en el cuál vamos a trabajar.
En este caso he escogido el esquema de ejemplo de SH.

GRANT DB_DEVELOPER_ROLE TO SH;
GRANT CREATE MINING MODEL TO SH;

Luego vamos a crear un directorio en nuestro servidor de base de datos, que va a hacer referencia a un punto en el sistema operativo, en donde vamos a descargar el modelo que queremos importar dentro de la base de datos.

create directory models as '/u01/app/oracle/models';

En este caso, el directorio "MODELS" apuntará a la ruta indicada a nivel de sistema operativo.

Ahora vamos a brindar permisos de lectura y escritura sobre el directorio creado a nuestro esquema SH.

grant read,write on directory models to sh;

Para este ejemplo es elegido el modelo all-MiniLM-L12-v2 que es uno de los modelos de embeddings más usados por su equilibrio entre tamaño, velocidad y precisión.

El modelo all_MiniLM_L12_v2.onnx es una versión exportada a ONNX del modelo Sentence Transformers sentence-transformers/all-MiniLM-L12-v2, utilizado principalmente para generar embeddings semánticos de texto. Es uno de los modelos que Oracle ha recomendado para integrarlo con AI Vector Search en Oracle AI Database 26ai.

Características técnicas principales

CaracterísticaValor aproximado
Arquitectura baseMiniLM (Transformer liviano)
Número de capas12 layers
Parámetros~33 millones
Dimensión del embedding384
Longitud máxima de tokens256 tokens (algunas implementaciones 128/256)
Tipo de salidaVector denso normalizado
Similaridad recomendadaCOSINE
FormatoONNX
LicenciaApache 2.0


¿Qué hace exactamente?

Convierte frases, párrafos o documentos cortos en vectores de 384 dimensiones donde: textos con significado similar → vectores cercanos textos distintos → vectores alejados

Ejemplo:
"Oracle Database 26ai supports vector search"
"Oracle AI DB includes semantic search"
ambos producirán embeddings cercanos.

Casos de uso típicos
Este modelo funciona bien para:

Semantic Search
Buscar documentos “por significado” y no por coincidencia exacta.

RAG (Retrieval-Augmented Generation)
Buscar fragmentos relevantes antes de enviar contexto a un LLM.

Clustering de texto
Agrupar tickets, incidentes, logs, correos.

Detección de similitud
Comparar preguntas/respuestas.

Clasificación semántica
Asignar categorías por cercanía vectorial.



Ventajas

Comparado con modelos más grandes como MPNet o BERT-base:
  • Más rápido en CPU.
  • Menor consumo de RAM.
  • Menor tamaño en disco (~90MB a ~130MB dependiendo de exportación).
  • Ideal para ejecutarse dentro de Oracle Database.
Ahora, será necesario que hagamos la descarga del modelo que hemos escogido para utilizar.

[oracle@oracle-server-26ai models]$ pwd
/u01/app/oracle/models

[oracle@oracle-server-26ai models]$ wget -O all_MiniLM_L12_v2.onnx \
"https://adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com/p/iPX9W0MZeRkwJKWdFmdJCemmN-iKAl_bFvNGYLW7YqIrw4kKsukL24J2q93Beb9S/n/adwc4pm/b/OML-ai-models/o/all_MiniLM_L12_v2.onnx"

--2026-04-25 14:17:09--  https://adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com/p/iPX9W0MZeRkwJKWdFmdJCemmN-iKAl_bFvNGYLW7YqIrw4kKsukL24J2q93Beb9S/n/adwc4pm/b/OML-ai-models/o/all_MiniLM_L12_v2.onnx
Resolving adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com (adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com)... 134.70.32.1, 134.70.28.1, 134.70.24.1
Connecting to adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com (adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com)|134.70.32.1|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 133322334 (127M) []
Saving to: ‘all_MiniLM_L12_v2.onnx’

all_MiniLM_L12_v2.onnx                      100%[========================================================================================>] 127.15M   310MB/s    in 0.4s

2026-04-25 14:17:09 (310 MB/s) - ‘all_MiniLM_L12_v2.onnx’ saved [133322334/133322334]

[oracle@oracle-server-26ai models]$ ls -lat
total 130200
drwxr-xr-x.  2 oracle oinstall        36 Apr 25 14:17 .
drwxrwx---. 10 oracle oinstall       118 Apr 25 14:15 ..
-rw-r--r--.  1 oracle oinstall 133322334 Oct  7  2025 all_MiniLM_L12_v2.onnx

Listo ya tenemos descargado nuestro modelo y ahora es necesario que carguemos el modelo dentro de la base de datos.

BEGIN
  DBMS_VECTOR.LOAD_ONNX_MODEL(
    directory => 'models',
    file_name => 'all_MiniLM_L12_v2.onnx',
    model_name => 'MI_MODELO_EMBEDDINGS'
  );
END;
/

Luego podemeos validar que el modelo efectivamente ha sido cargado.

SELECT model_name, mining_function, algorithm 
FROM user_mining_models

MODEL_NAME           MINING_FUNCTION                ALGORITHM
-------------------- ------------------------------ ------------------------------
MI_MODELO_EMBEDDINGS EMBEDDING                      ONNX

Ahora probemos a ver si es posible crear nuestro vector.

SELECT VECTOR_EMBEDDING(MI_MODELO_EMBEDDINGS USING 'Hola, esto es una prueba' AS DATA) AS vector
FROM DUAL;

[1.3900646E-003,6.4947255E-002,-3.41739021E-002,3.00823897E-002,-1.3453302E-002,-1.87666081E-002,-4.35688905E-002,4.46249396E-002,6.3403599E-002,-4.62511182E-002,3.3260759E-002,-1.44735333E-002,-2.21015308E-002,1.40913026E-002,7.5034E-002,3.59462239E-002,6.43426031E-002,1.98624283E-002,1.90574955E-002,-2.13727448E-002,7.24871606E-002,6.8553783E-002,-2.48328503E-002,2.43773255E-002,-2.34660842E-002,-5.5200249E-002,3.9385803E-002,7.0384331E-002,-5.28017692E-002,-5.48376963E-002,-1.94696989E-002,4.1839987E-002,7.37491548E-002,-2.21404079E-002,-5.96100725E-002,-4.02953289E-002,7.35913664E-002,-9.62668285E-002,1.56864934E-002,1.2650843E-001,-8.29633791E-003,-5.34933135E-002,-6.29290864E-002,-4.25488316E-002,2.33139982E-003,-1.02485389E-001,-3.00091389E-003,8.56035948E-002,7.16768205E-002,2.89637297E-002,2.96710469E-002,-4.93476242E-002,-3.28859203E-002,1.27376709E-002,4.25983733E-003,5.24660461E-002,7.47554079E-002,-9.9608168E-002,-6.88042492E-002,8.87526199E-002,-1.80443178E-003,2.61041019E-002,3.81092168E-002,6.49420405E-003,-7.15156458E-003,3.77375836E-004,6.56677037E-002,-5.78824989E-002,-2.22714376E-002,4.38990667E-002,3.11253797E-002,-1.50656011E-002,4.09434102E-002,5.47525883E-002,2.77292971E-002,-7.04061687E-002,1.6800079E-003,-9.08812806E-002,-8.92041251E-003,5.46105094E-002,-2.05046106E-002,-1.2373329E-001,-3.45300809E-002,-4.78763729E-002,-8.85539651E-002,-7.20430613E-002,-1.7484704E-002,4.76256311E-002,-3.64556946E-002,-6.55404404E-002,-5.06183552E-003,1.35141434E-002,-3.6078237E-002,-4.76635993E-004,3.7716683E-002,3.38687003E-002,-6.03729934E-002,-4.40221317E-002,1.00445992E-003,6.26754761E-002,1.9100951E-002,-4.17933352E-002,7.84236044E-002,-6.76141009E-002,-1.58108363E-003,8.11111853E-002,5.22661954E-002,3.96392047E-002,-7.88598787E-003,1.40044698E-002,-1.8102048E-002,-5.93436025E-002,-4.04904895E-002,4.09404673E-002,-3.24861035E-002,-1.36348559E-002,-7.20573664E-002,-3.92829888E-002,-7.74733722E-002,-6.04367889E-002,1.48849776E-002,-2.17362046E-002,-1.37405088E-002,-1.40654035E-002,5.28604463E-002,-8.58230144E-002,8.2690537E-002,-1.5872702E-002,2.59843729E-002,-1.89039744E-002,-4.1163303E-003,-3.26678306E-002,-5.90283051E-002,1.78802516E-002,-1.49752768E-002,6.13624938E-002,-2.13406868E-002,4.18959334E-002,-2.84545049E-002,2.55872235E-002,-1.41871767E-002,-7.05784326E-003,7.58661628E-002,5.12781693E-003,2.65482161E-002,-2.98756734E-002,6.20706081E-002,6.97502196E-002,-4.34035808E-002,6.63504153E-002,-1.63700934E-002,2.19134353E-002,-4.25044447E-002,-4.44938778E-004,-8.99366662E-002,-4.5101922E-002,-2.94682924E-002,6.38995096E-002,1.22462576E-002,-7.70974485E-003,-5.87149225E-002,3.07904016E-002,7.1540691E-002,-9.26405471E-003,3.59040033E-003,2.65567563E-003,-1.45466123E-002,3.51659209E-002,-6.44643903E-002,3.22895348E-002,-3.17530781E-002,8.62621609E-003,4.65120748E-002,-5.58609096E-003,-3.77367511E-002,4.18439917E-002,9.31436718E-002,-3.05033475E-002,-9.26166251E-002,1.64704993E-002,-2.0406669E-002,4.81320225E-004,-9.45158228E-002,-6.67981952E-002,-8.91887397E-002,2.49027461E-002,-6.48279041E-002,-4.72947806E-002,2.46572159E-002,5.50275706E-002,2.57982686E-002,-4.67213206E-002,-2.69834343E-002,8.45892653E-002,-5.38872145E-002,6.37916997E-002,5.9427578E-002,5.21879494E-002,-1.48437489E-002,-2.74545904E-002,-1.90172456E-002,2.9384179E-002,-8.22653249E-002,-2.33890284E-002,7.54830614E-002,-6.06272332E-002,5.65813715E-003,8.76496881E-002,-4.60354798E-002,-4.1076811E-003,2.31930427E-002,2.79998016E-002,-2.04425808E-002,1.55423552E-001,5.11384718E-002,1.07636675E-001,6.04426637E-002,1.50089845E-001,-5.39999828E-002,1.02401003E-001,3.16832936E-003,-6.32362515E-002,2.88271345E-002,-1.32585654E-032,1.38411419E-002,-5.69943376E-002,3.07825487E-002,-6.2084619E-002,4.73874994E-003,-5.29002324E-002,-6.90745264E-002,8.36086571E-002,7.66877756E-002,3.37841697E-002,-6.46747053E-002,-5.57038672E-002,7.92162195E-002,-8.3183445E-002,6.84358031E-002,1.10465817E-005,-4.53029294E-003,-2.83081327E-002,-2.04892661E-002,-9.35557634E-002,-5.7014741E-002,2.72388998E-002,7.82605112E-002,-1.20674539E-002,6.11994267E-002,9.75737348E-003,-3.0896483E-002,-3.74141373E-002,-2.18903963E-002,-7.92545453E-002,-8.68051965E-003,1.11484644E-003,-3.59221697E-002,1.31579891E-001,-1.28166946E-002,-2.35027988E-002,-1.26797035E-002,2.87881829E-002,4.12984751E-002,9.91139933E-003,-1.12441219E-002,1.65291037E-002,-9.90293324E-002,1.9596843E-002,-5.19916788E-002,-3.85330012E-003,1.16031997E-001,-3.30846384E-002,1.01698637E-002,-6.02884032E-002,-4.50805342E-003,2.04256666E-003,1.87034942E-002,5.2292333E-003,8.39919224E-002,-6.04134798E-002,-7.75140002E-002,-4.72206511E-002,4.50489484E-002,7.22124577E-002,2.7057562E-002,4.34556231E-002,-2.32761689E-002,-2.01885235E-002,3.4009587E-002,2.4763735E-002,-4.55132462E-002,1.18991081E-002,5.8908958E-002,7.33381808E-002,7.92638883E-002,-7.41918385E-002,-1.34471074E-001,-3.27881388E-002,-5.01030199E-002,5.87125532E-002,-9.05613378E-002,5.67616522E-003,-3.68121415E-002,-4.14253287E-002,3.20088374E-003,-2.77393535E-002,-8.57385434E-003,-4.5528993E-002,-4.96782809E-002,-2.40529813E-002,-1.36366487E-002,-7.79022556E-003,9.82291345E-003,5.79915568E-002,-9.82802012E-004,3.76926661E-002,-3.59502137E-002,-4.84997742E-002,-1.41461603E-002,4.12206343E-032,-2.22963225E-002,7.83920195E-003,-6.78976113E-003,2.47782543E-002,7.05694035E-002,3.58279049E-002,-6.50222152E-002,-6.46860227E-002,-1.02872102E-004,-3.98172028E-002,9.73907858E-003,-8.38956162E-002,-5.45164645E-002,-2.14765649E-002,3.25041562E-002,2.91623659E-002,4.62868623E-002,7.13896453E-002,2.59754043E-002,-1.16456635E-002,-1.39092626E-002,-7.8247726E-002,8.32773093E-003,-3.50259878E-002,4.80484255E-002,3.37976627E-002,-3.08791045E-002,-1.19398562E-002,6.18945323E-002,-9.94550586E-002,-9.02341772E-003,1.11277113E-002,-8.27196687E-002,-7.58799762E-002,1.68302748E-002,-6.02526218E-002,4.47138511E-002,-5.04813492E-002,-6.43555447E-002,-1.25823811E-001,-1.9547062E-002,7.96526521E-002,1.28585175E-002,2.31666751E-002,-2.69731451E-002,-5.82041442E-002,3.8045086E-002,-8.97646844E-002,3.40791396E-003,2.25604866E-002,-5.89550175E-002,-3.92772555E-002,7.14555234E-002,3.20473276E-002,8.6180523E-002,-3.58830206E-002,-1.6021559E-002,-2.47178948E-003,-4.43300009E-002,1.32946577E-002,8.7638922E-002,5.74000552E-002,-1.10163353E-002,1.13602327E-002]

Para el modelo all_MiniLM_L12_v2.onnx, la entrada principal esperada es: VARCHAR2.

Oracle hace conversiones automáticas desde otros tipos:
  • CHAR
  • NCHAR
  • NVARCHAR2
  • CLOB
  • NCLOB → convertido a NVARCHAR2
  • NUMBER, DATE, etc. → convertidos a texto si la conversión es válida
Ejemplo:
SELECT VECTOR_EMBEDDING(modelo USING employee_id) FROM hr.employees;

internamente sería algo similar a:  TO_CHAR(employee_id)

Restricciones
Aunque Oracle permita convertir: CLOB, no es recomendable si el contenido excede la ventana del modelo.

Ejemplo: MiniLM:
  • 256 tokens aprox.
  • algunos modelos 512
Si envías 20 páginas de texto, Oracle lo puede convertir, pero el modelo truncará internamente.
Eso puede degradar la semántica.

Ahora si, ya puedes desde tu base de datos crear "embeddings" para texto sin ncesidad de salir de la base de datos.


miércoles, 22 de abril de 2026

Oracle ACE Connect Costa Rica, 09 de mayo Universidad Cenfotec.

 


Hoy estamos viviendo un cambio silencioso, pero profundo, en la forma en que trabajamos con los datos.

Durante años hemos estructurado, normalizado y consultado información utilizando modelos relacionales tradicionales. Hemos sido expertos en responder preguntas exactas: ¿cuánto?, ¿cuándo?, ¿quién? Pero el mundo actual nos exige algo distinto.
 
Ahora necesitamos responder preguntas como:
• ¿qué se parece a esto?
• ¿qué significa esta imagen?
• ¿qué información relevante existe, aunque no esté explícitamente relacionada?

La inteligencia artificial está transformando la naturaleza del dato, y ya no hablamos solo de filas y columnas, sino de contexto, similitud y significado. Imágenes, documentos, registros médicos, diagramas, evidencia visual… todos contienen información valiosa que antes quedaba fuera del alcance del SQL tradicional.

Inscripción gratuita https://lnkd.in/ecpKn8jw
Habrá parqueo disponible y refrigerio.


martes, 21 de abril de 2026

Actualización crítica de parches de Oracle para abril de 2026


21 de abril de 2026
Actualización crítica de parches de Oracle para abril de 2026

Estimado cliente de Oracle:

La actualización crítica correspondiente a abril de 2026 se publicó el 21 de abril de 2026.

Oracle recomienda encarecidamente aplicar los parches lo antes posible.

El aviso está disponible en la siguiente ubicación:
https://lnkd.in/e6bZgv3j

Puede encontrar recursos adicionales de seguridad de Oracle en los siguientes enlaces:
https://lnkd.in/eUUcqB9i
https://lnkd.in/eruhdAuA
https://lnkd.in/eUdy_yrP

Las próximas cuatro fechas para las actualizaciones de parches críticos son:

21 de julio de 2026
20 de octubre de 2026
19 de enero de 2027
20 de abril de 2027

Si no puede determinar si necesita una actualización de software o cómo aplicarla, póngase en contacto con el soporte técnico de Oracle.

Gracias,
Seguridad de Oracle

domingo, 5 de abril de 2026

Quality: característica de Oracle AI Database 26ai que te facilita la existencia.

 

Cláusula QUALITY

Veamos como podemos solucionar un problema simple del día a día.

Definición del problema:
Necesitamos conocer, cuál es el empleado mejor pagado en cada departamento.?

Tomemos para este ejemplo la clásica tabla del esquema de ejemplos HR.EMPLOYEES.

Tradicionalmente en Oracle (hasta 19c/21c) este problema se podría haber solucionado de esta manera:

SELECT *FROM (
SELECT employee_id,
department_id,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) rn
FROM hr.employees
)
WHERE rn = 1;

EMPLOYEE_ID DEPARTMENT_ID         RN
----------- ------------- ----------
        200            10          1
        201            20          1
        114            30          1
        203            40          1
        121            50          1
        103            60          1
        204            70          1
        145            80          1
        100            90          1
        108           100          1
        205           110          1
        178                        1

12 rows selected.

Explicación de la función analítica ROW_NUMBER()

PARTITION BY department_id ==> divide el conjunto de datos en grupos por departamento
ORDER BY salary DESC ==> ordena los empleados dentro de cada departamento desde el salario mayor al menor
ROW_NUMBER() ==> asigna una numeración secuencial empezando en 1 para cada grupo

Desde Oracle AI Database 26ai, existe una nueva cláusula que resulta especialmente relevante desde la perspectiva del lenguaje de programación SQL/PLSQL y el modelo de programción: QUALIFY (filtrado post-analítico sin subquery), que permite simplificar el filtrado de resultados de funciones analíticas (window functions) sin necesidad de realizar una subconsulta.

La consulta inicial se puede expresar directamente en 26ai de la siguiente manera:

SELECT employee_id,
           department_id,
           ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) rn
FROM hr.employees
QUALIFY rn = 1;

EMPLOYEE_ID DEPARTMENT_ID         RN
----------- ------------- ----------
        200            10          1
        201            20          1
        114            30          1
        203            40          1
        121            50          1
        103            60          1
        204            70          1
        145            80          1
        100            90          1
        108           100          1
        205           110          1
        178                        1

12 rows selected.

La cláusula QUALIFY filtra el resultado después de calcular la función analítica.

Relevancia técnica
Desde la perspectiva del optimizador:
  • elimina subqueries artificiales
  • mejora legibilidad declarativa
  • facilita generación automática de SQL por LLMs
  • simplifica pipelines de analytics y feature engineering
Oracle posiciona QUALIFY como el equivalente analítico de HAVING, pero aplicado a funciones window.

Este tipo de mejora suele pasar desapercibida frente a AI Vector Search, pero impacta directamente el diseño de consultas complejas, especialmente en:

scoring de fraude
ranking de embeddings
top-K similarity search
deduplicación basada en ventanas

A nivel del plan de ejecución podemos ver que ambas consultas a pesar de brindar el mismo resultado, no son equivalentes de cara al optimizador, aunque a nivel de costo, son equivalentes.

[oracle@oracle-server-26ai ~]$ sqlplus /nolog

SQL*Plus: Release 23.26.1.0.0 - Production on Mon Apr 6 02:50:48 2026
Version 23.26.1.0.0

Copyright (c) 1982, 2025, Oracle.  All rights reserved.

SQL> connect einsten/oracle@pdb1
Connected.
SQL> set linesize 200
SQL> set pagesize 20
SQL> explain plan for
  2  SELECT *
FROM (
    SELECT employee_id,
           department_id,
           ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) rn
    FROM hr.employees
)
WHERE rn = 1;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------
Plan hash value: 2698234872

--------------------------------------------------------------------------------------
| Id  | Operation                | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |           |    11 |   220 |     4  (25)| 00:00:01 |
|*  1 |  VIEW                    |           |    11 |   220 |     4  (25)| 00:00:01 |
|*  2 |   WINDOW SORT PUSHED RANK|           |   107 |  1177 |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL     | EMPLOYEES |   107 |  1177 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("RN"=1)
   2 - filter(ROW_NUMBER() OVER ( PARTITION BY "DEPARTMENT_ID" ORDER BY
              "SALARY" DESC )<=1)

17 rows selected.

SQL> explain plan for
  2  SELECT employee_id,
           department_id,
           ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) rn
FROM hr.employees
QUALIFY rn = 1;

Explained.

SQL>  select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------
Plan hash value: 2698234872

--------------------------------------------------------------------------------------
| Id  | Operation                | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |           |    11 |   242 |     4  (25)| 00:00:01 |
|*  1 |  VIEW                    |           |    11 |   242 |     4  (25)| 00:00:01 |
|*  2 |   WINDOW SORT PUSHED RANK|           |   107 |  1177 |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL     | EMPLOYEES |   107 |  1177 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("from$_subquery$_002"."sys_qualify$_h$_predex$_0"=TRUE)
   2 - filter(ROW_NUMBER() OVER ( PARTITION BY "DEPARTMENT_ID" ORDER BY
              "SALARY" DESC )<=1)

17 rows selected.

SQL>

Si observamos detenidamente, veremos que con el uso de la cláusula "QUALITY" el optimizador realiza un filtro en la creación de la vista con  "filter("from$_subquery$_002"."sys_qualify$_h$_predex$_0"=TRUE)
  • from$_subquery$_002: Es un alias interno generado por Oracle para una subconsulta (inline view) que el optimizador ha creado o transformado para procesar la lógica de tu SQL.
  • sys_qualify: Se refiere a la operación de filtrado sobre funciones de ventana. En versiones recientes de Oracle (como la 23ai), se introdujo formalmente la cláusula QUALIFY de Oracle, que permite filtrar directamente por funciones analíticas.
  • _h$_predex$_0=TRUE: Es un predicado interno de "pre-ejecución" (predex). Indica que el optimizador ha determinado una condición que debe cumplirse (ser TRUE) para que las filas pasen a la siguiente etapa del plan.
Aquí lo importante de tener en cuenta, es la eliminación de la subconsulta y la simplificación de la misma.


Todos los Sábados a las 8:00PM