SQL

En este capítulo se proporciona una visión general del lenguaje de consulta estructurado (SQL) y cómo Oracle AI Database procesa las sentencias SQL.

Introducción a SQL

SQL (que se pronuncia sequel) es el lenguaje informático de alto nivel basado en juegos con los que todos los programas y usuarios acuerdan a datos de una base de datos Oracle.

Aunque algunas herramientas y aplicaciones de Oracle enmascaran el uso de SQL, todas las tareas de la base de datos se realizan con SQL. Cualquier otro método de acceso a datos elude la seguridad integrada en Oracle AI Database y potencialmente compromete la seguridad y la integridad de los datos.

SQL proporciona una interfaz a una base de datos relacional como Oracle AI Database. SQL unifica tareas como las siguientes en un lenguaje consistente:

SQL se puede utilizar de forma interactiva, lo que significa que las sentencias se introducen manualmente en un programa. Las sentencias SQL también se pueden embeber en un programa escrito en un lenguaje diferente, como C o Java.

Consulte además:

Acceso a datos SQL

Hay dos familias amplias de lenguajes informáticos: lenguajes declarativos que no son de procedimiento y describen qué se debe hacer, y lenguajes de procedimiento como C++ y Java que describen cómo se deben hacer las cosas.

SQL es declarativo en el sentido de que los usuarios especifican el resultado que desean, no cómo derivarlo. Por ejemplo, la siguiente sentencia consulta los registros de los empleados cuyo apellido empiece por K:

La base de datos realiza el trabajo de generar un procedimiento para navegar por los datos y recuperar los resultados solicitados. La naturaleza declarativa de SQL permite trabajar con datos en el nivel lógico. Solo tiene que preocuparse de los detalles de implantación cuando manipule los datos.

SELECT   last_name, first_name
FROM     hr.employees
WHERE    last_name LIKE 'K%'
ORDER BY last_name, first_name;

La base de datos recupera todas las filas que cumplen la condición WHERE, también denominada predicado, en un solo paso. La base de datos puede transferir estas filas como una unidad al usuario, a otra sentencia SQL o a una aplicación. La aplicación no necesita procesar las filas una por una, ni el desarrollador necesita saber cómo se almacenan o recuperan físicamente las filas.

Todas las sentencias SQL utilizan el optimizador, un componente de la base de datos que determina el medio más eficaz para acceder a los datos solicitados. Oracle Database también soporta técnicas que puede utilizar para que el optimizador realice mejor su trabajo.

Consulte también: Referencia de lenguaje SQL de Oracle AI Database para obtener información detallada sobre sentencias SQL y otras partes de SQL (como operadores, funciones y modelos de formato)

Estándares SQL

Oracle se esfuerza por seguir los estándares aceptados por el sector y participa activamente en los comités de estándares SQL.

Los comités aceptados por la industria son el American National Standards Institute (ANSI) y la Organización Internacional de Normalización (ISO). Tanto ANSI como ISO/IEC han aceptado SQL como lenguaje estándar para bases de datos relacionales.

El estándar SQL consta de diez partes. Una parte (SQL/RPR:2012) es nueva en 2012. Otras cinco partes fueron revisadas en 2011. Para las otras cuatro partes, la versión de 2008 sigue en su lugar. Oracle SQL incluye muchas extensiones del lenguaje SQL estándar ANSI/ISO, y las herramientas y aplicaciones de Oracle AI Database proporcionan sentencias adicionales. Las herramientas SQL*Plus, SQL Developer y Oracle Enterprise Manager permiten ejecutar cualquier sentencia SQL estándar ANSI/ISO en una base de datos Oracle y cualquier sentencia o función adicional disponible para dichas herramientas.

Consulte además:

Visión General de Sentencias SQL

Todas las operaciones realizadas en la información de una base de datos Oracle se ejecutan mediante sentencias SQL. Una sentencia SQL es un programa informático o instrucción que consta de identificadores, parámetros, variables, nombres, tipos de dato y palabras reservadas SQL. Nota: Las palabras reservadas SQL tienen un significado especial en SQL y no se deben utilizar para ningún otro fin. Por ejemplo, SELECT y UPDATE son palabras reservadas y no se deben utilizar como nombres de tabla.

Una sentencia SQL debe ser el equivalente a una sentencia SQL completa, como:

SELECT last_name, department_id FROM employees

Oracle AI Database solo ejecuta sentencias SQL completas. Un fragmento como el siguiente genera un error que indica que se necesita más texto:

SELECT last_name;

Las sentencias SQL de Oracle se dividen en las siguientes categorías:

sentencias de Lenguaje de Definición de Datos (DDL)

Las sentencias de lenguaje de definición de datos (DLL) definen, cambian estructuralmente y borran objetos de esquema.

DDL permite modificar los atributos de un objeto sin modificar las aplicaciones que acceden al objeto. Por ejemplo, puede agregar una columna a una tabla a la que acceda una aplicación de recursos humanos sin volver a escribir la aplicación. También puede utilizar DDL para modificar la estructura de objetos mientras los usuarios de la base de datos realizan trabajos en la base de datos.

Más concretamente, las sentencias DDL permiten:

Ejemplo 10-1 Sentencias DDL

En el siguiente ejemplo se utilizan sentencias DDL para crear la tabla plants y, a continuación, se utiliza DML para insertar dos filas en la tabla. A continuación, el ejemplo utiliza DDL para modificar la estructura de la tabla, otorgar y revocar privilegios de lectura en esta tabla a un usuario y, a continuación, borrar la tabla.

CREATE TABLE plants
    ( plant_id    NUMBER PRIMARY KEY,
      common_name VARCHAR2(15) );

INSERT INTO plants VALUES (1, 'African Violet'); # DML statement

INSERT INTO plants VALUES (2, 'Amaryllis'); # DML statement

ALTER TABLE plants ADD
    ( latin_name VARCHAR2(40) );

GRANT READ ON plants TO scott;

REVOKE READ ON plants FROM scott;

DROP TABLE plants;

Una COMMIT implícita se produce inmediatamente antes de que la base de datos ejecute una sentencia DDL y una COMMIT o ROLLBACK se produce inmediatamente después. En el ejemplo anterior, dos sentencias INSERT van seguidas de una sentencia ALTER TABLE, por lo que la base de datos confirma las dos sentencias INSERT. Si la sentencia ALTER TABLE se realiza correctamente, la base de datos confirma esta sentencia; de lo contrario, la base de datos realiza un rollback de esta sentencia. En cualquier caso, las dos sentencias INSERT ya se han confirmado.

Consulte además:

sentencias de Lenguaje de Manipulación de Datos (DML)

Las sentencias de lenguaje de manipulación de datos (DML) consultan o manipulan datos en objetos de esquema existentes.

Mientras que las sentencias DDL cambian la estructura de la base de datos, las sentencias DML consultan o cambian el contenido. Por ejemplo, ALTER TABLE cambia la estructura de una tabla, mientras que INSERT agrega una o más filas a la tabla.

Las sentencias DML son las sentencias SQL utilizadas con más frecuencia y le permiten:

En el siguiente ejemplo se utiliza DML para consultar la tabla employees. En el ejemplo se utiliza DML para insertar una fila en employees, actualizar esta fila y, a continuación, suprimirla:

SELECT * FROM employees;

INSERT INTO employees (employee_id, last_name, email, job_id, hire_date, salary)
  VALUES (1234, 'Mascis', 'JMASCIS', 'IT_PROG', '14-FEB-2008', 9000);

UPDATE employees SET salary=9100 WHERE employee_id=1234;

DELETE FROM employees WHERE employee_id=1234;

Una recopilación de sentencias DML que forma una unidad lógica de trabajo se denomina transacción. Por ejemplo, una transacción para transferir dinero podría implicar tres operaciones discretas: disminuir el saldo de la cuenta de ahorros, aumentar el saldo de la cuenta corriente y registrar la transferencia en una tabla de historial de cuentas. A diferencia de las sentencias DDL, las sentencias DML no confirman implícitamente la transacción actual.

Consulte además:

Sentencias SELECT

Una consulta es una operación que recupera datos de una tabla o vista.

SELECT es la única sentencia SQL que puede utilizar para consultar datos. El juego de datos recuperado de la ejecución de una sentencia SELECT se conoce como juego de resultados.

La siguiente tabla muestra una palabra clave necesaria y tres palabras clave que se encuentran normalmente en una sentencia SELECT. La tabla también asocia las capacidades de una sentencia SELECT con las palabras clave.

Tabla 1 Palabras clave en una sentencia SQL

Palabra clave Necesario Descripción Capacidad
SELECT Sí

Especifica qué columnas se deben mostrar en el resultado. La proyección produce un subjuego de las columnas de la tabla.

Una expresión es una combinación de uno o más valores, operadores y funciones SQL que se resuelven en un valor. La lista de expresiones que aparece después de la palabra clave SELECT y antes de la cláusula FROM se denomina select list.

Proyecto
FROM No Especifica las tablas o vistas desde las que se deben recuperar los datos. Unión
WHERE No Especifica una condición para filtrar filas, produciendo un subjuego de las filas de la tabla. Una condición especifica una combinación de una o más expresiones y operadores lógicos (booleanos) y devuelve un valor de TRUE, FALSE o UNKNOWN. Selección
ORDER BY No Especifica el orden en el que se deben mostrar las filas.  

Consulte también: Referencia de lenguaje SQL de Oracle AI Database para la sintaxis y la semántica de SELECT

Uniones

Una unión es una consulta que combina filas de dos o más tablas, vistas o vistas materializadas.

El siguiente ejemplo une las tablas employees y departments (cláusula FROM), selecciona solo las filas que cumplen los criterios especificados (cláusula WHERE) y utiliza la proyección para recuperar datos de dos columnas (SELECT). La salida de ejemplo sigue la sentencia SQL.

SELECT email, department_name
FROM   employees
JOIN   departments
ON     employees.department_id = departments.department_id
WHERE  employee_id IN (100,103)
ORDER BY email;

EMAIL                     DEPARTMENT_NAME
------------------------- ------------------------------
AHUNOLD                   IT
SKING                     Executive

El siguiente gráfico representa las operaciones de proyección y selección en la unión que se muestra en la consulta anterior.

Figura 1: Proyección y selección

Descripción de la ilustración cncpt290.gif

La mayoría de las uniones tienen al menos una condición de unión, ya sea en la cláusula FROM o en la cláusula WHERE, que compara dos columnas, cada una de una tabla diferente. La base de datos combina pares de filas, cada una con una fila de cada tabla, para las que la condición de unión se evalúa como TRUE. El optimizador determina el orden en el que la base de datos une tablas en función de las condiciones de unión, los índices y las estadísticas disponibles para las tablas.

Los tipos de unión incluyen los siguientes:

Consulte además:

Subconsultas

Una subconsulta es una sentencia SELECT anidada en otra sentencia SQL. Las subconsultas son útiles cuando se deben ejecutar varias consultas para resolver un único problema.

Cada parte de la consulta de una sentencia se denomina bloque de consulta. En la siguiente consulta, la subconsulta entre paréntesis es el bloque de consulta interno:

SELECT first_name, last_name
FROM   employees
WHERE  department_id
IN     ( SELECT department_id
         FROM departments
         WHERE location_id = 1800 );

La sentencia SELECT interna recupera los ID de los departamentos con el ID de ubicación 1800. Estos ID de departamento son necesarios para el bloque de consulta externo, que recupera los nombres de los empleados de los departamentos cuyos ID fueron proporcionados por la subconsulta.

La estructura de la sentencia SQL no obliga a la base de datos a ejecutar primero la consulta interna. Por ejemplo, la base de datos podría reescribir toda la consulta como una unión de employees y departments, para que la subconsulta nunca se ejecute por sí misma. Como otro ejemplo, la función de base de datos privada virtual (VPD) podría restringir la consulta de los empleados mediante una cláusula WHERE, de modo que la base de datos consulte primero a los empleados y, a continuación, obtenga los ID de departamento. El optimizador determina la mejor secuencia de pasos para recuperar las filas solicitadas.

Consulte también: Guía de seguridad de Oracle AI Database para obtener más información sobre la VPD

Sentencias de Control de Transacciones

Las sentencias de control de transacciones gestionan los cambios realizados por las sentencias DML y agrupan las sentencias DML en transacciones.

Estas sentencias permiten:

En el siguiente ejemplo se inicia una transacción denominada Update salaries. En el ejemplo se crea un punto de grabación, se actualiza un salario de empleado y, a continuación, se realiza un rollback de la transacción al punto de grabación. En el ejemplo, se actualiza el salario a un valor diferente y se confirman.

SET TRANSACTION NAME 'Update salaries';

SAVEPOINT before_salary_update;

UPDATE employees SET salary=9100 WHERE employee_id=1234 # DML

ROLLBACK TO SAVEPOINT before_salary_update;

UPDATE employees SET salary=9200 WHERE employee_id=1234 # DML

COMMIT COMMENT 'Updated salaries';

Consulte además:

Sentencias de Control de Sesión

Las sentencias de control de sesión gestionan dinámicamente las propiedades de una sesión de usuario.

Una sesión es una entidad lógica en la memoria de la instancia de base de datos que representa el estado de una conexión de usuario actual a una base de datos. Una sesión dura desde el momento en que la base de datos autentica al usuario hasta que el usuario se desconecta o sale de la aplicación de base de datos.

Las sentencias de control de sesión permiten:

La siguiente sentencia cambia dinámicamente el formato de fecha por defecto para la sesión a 'YYYY MM DD-HH24:MI:SS':

ALTER SESSION
   SET NLS_DATE_FORMAT = 'YYYY MM DD HH24:MI:SS';

Las sentencias de control de sesión no confirman implícitamente la transacción actual.

Consulte además:

Sentencia de control del sistema

Una sentencia de control del sistema cambia las propiedades de la instancia de base de datos.

La única sentencia de control del sistema es ALTER SYSTEM. Permite cambiar la configuración, como el número mínimo de servidores compartidos, terminar una sesión y realizar otras tareas de nivel de sistema.

Entre los ejemplos de la sentencia de control del sistema se incluyen:

ALTER SYSTEM SWITCH LOGFILE;

ALTER SYSTEM KILL SESSION '39, 23';

La sentencia ALTER SYSTEM no confirma implícitamente la transacción actual.

Consulte también: Referencia de lenguaje SQL de Oracle AI Database para la sintaxis y la semántica de ALTER SYSTEM

Sentencias SQL Embebidas

Las sentencias SQL embebidas incorporan sentencias de control de transacciones, DML y DDL dentro de un programa de lenguaje de procedimiento.

Las sentencias embebidas se utilizan con los precompiladores de Oracle. Embedded SQL es un enfoque para incorporar SQL en las aplicaciones de lenguaje de procedimiento. Otro enfoque es utilizar una API de procedimiento como Open Database Connectivity (ODBC) o Java Database Connectivity (JDBC).

Las sentencias SQL embebidas permiten:

Consulte además:

Visión General del Optimizador

Para comprender cómo Oracle AI Database procesa las sentencias SQL, es necesario comprender la parte de la base de datos denominada optimizador (también conocido como optimizador de consultas o optimizador basado en costos). Todas las sentencias SQL utilizan el optimizador para determinar el medio más eficaz para acceder a los datos especificados.

Uso del Optimizador

El optimizador genera planes de ejecución que describen los posibles métodos de ejecución.

El optimizador determina qué plan de ejecución es más eficaz teniendo en cuenta varios orígenes de información. Por ejemplo, el optimizador tiene en cuenta las condiciones de consulta, las rutas de acceso disponibles, las estadísticas recopiladas para el sistema y las indicaciones.

Para ejecutar una sentencia DML, puede que Oracle AI Database tenga que realizar muchos pasos. Cada paso recupera filas de datos físicamente de la base datos o los prepara para el usuario que emite la sentencia. Los pasos que utiliza la base de datos para ejecutar una sentencia afectan en gran medida a la rapidez con la que se ejecuta la sentencia. Muchas formas diferentes de procesar una sentencia DML suelen ser posibles. Por ejemplo, el orden en el que se accede a las tablas o índices puede variar.

Al determinar el mejor plan de ejecución para una sentencia SQL, el optimizador realiza las siguientes operaciones:

El optimizador genera la mayoría de las formas posibles de procesar una consulta y asigna un costo a cada paso del plan de ejecución generado. El plan con el costo más bajo se selecciona como el plan de consulta que se va a ejecutar.

Nota: Puede obtener un plan de ejecución para una sentencia SQL sin ejecutar el plan. Sólo un plan de ejecución que la base de datos realmente utiliza para ejecutar una consulta se denomina correctamente un plan de consulta.

Puede influir en las opciones del optimizador definiendo el objetivo del optimizador y recopilando estadísticas representativas para el optimizador. Por ejemplo, puede definir el objetivo del optimizador en una de las siguientes opciones:

Una aplicación interactiva típica para el usuario final se beneficiaría de la optimización del tiempo de respuesta inicial, mientras que una aplicación no interactiva en modo por lotes se beneficiaría de la optimización del rendimiento total.

Consulte además:

Componentes del Optimizador

El optimizador contiene tres componentes principales: el transformador, el estimador y el generador de planes.

En el siguiente diagrama se muestran los componentes:

Figura 2: Componentes del Optimizador

Descripción de la ilustración cncpt287.gif

La entrada al optimizador es una consulta analizada. El optimizador realiza las siguientes operaciones:

  1. El optimizador recibe la consulta analizada y genera un juego de posibles planes para la sentencia SQL en función de las rutas de acceso e indicaciones disponibles.

  2. El optimizador estima el costo de cada plan en función de las estadísticas del diccionario de datos. El costo es un valor estimado proporcional al uso del recurso esperado necesario para ejecutar la sentencia con un plan concreto.

  3. El optimizador compara los costos de los planes y selecciona el plan de menor costo, conocido como el plan de consulta, para transferirlo al generador de origen de fila.

Consulte además:

Transformador de consulta

El transformador de consulta determina si es útil cambiar la forma de la consulta para que el optimizador pueda generar un mejor plan de ejecución. La entrada al transformador de consulta es una consulta analizada, que el optimizador representa como un juego de bloques de consulta.

Consulte también: Reescritura de consultas

Estimador

El estimador determina el costo general de un plan de ejecución determinado.

El estimador genera tres tipos diferentes de medidas para lograr este objetivo:

Si hay estadísticas disponibles, el estimador las utiliza para calcular las medidas. Las estadísticas mejoran el grado de precisión de las medidas.

Generador de planes

El generador de planes prueba diferentes planes para una consulta enviada. El optimizador selecciona el plan con el costo más bajo.

Para cada subconsulta anidada y vista sin fusionar, el optimizador genera un subplan. El optimizador representa cada subplan como un bloque de consulta independiente. El generador de planes explora varios planes para un bloque de consultas probando diferentes rutas de acceso, métodos de unión y órdenes de unión.

La capacidad de optimización de consultas adaptativa cambia los planes en función de las estadísticas recopiladas durante la ejecución de sentencias. Todos los mecanismos adaptativos pueden ejecutar un plan final para una sentencia que difiera del plan por defecto. La optimización adaptativa utiliza planes dinámicos, que eligen entre los subplanes durante la ejecución de sentencias, o la reoptimización, que cambia un plan de ejecuciones después de la ejecución actual.

Consulte además:

Rutas de Acceso

Una ruta de acceso es la técnica que una consulta utiliza para recuperar filas.

Por ejemplo, una consulta que utiliza un índice tiene una ruta de acceso diferente a la de una consulta que no lo hace. En general, las rutas de acceso de índice son las mejores para las sentencias que recuperan un pequeño subjuego de filas de tabla. Las exploraciones completas son más eficaces para acceder a una gran parte de una tabla.

La base de datos puede utilizar varias rutas de acceso diferentes para recuperar datos de una tabla. A continuación se muestra una lista representativa:

El optimizador selecciona una ruta de acceso basada en las rutas de acceso disponibles para la sentencia y el costo estimado de utilizar cada ruta de acceso o combinación de rutas.

Consulte también: Oracle AI Database Get Started with Performance Tuning y Oracle AI Database SQL Tuning Guide para obtener más información sobre las rutas de acceso

Estadísticas del optimizador

Las estadísticas del optimizador son una recopilación de datos que describen los detalles sobre la base de datos y los objetos de la base de datos. Las estadísticas proporcionan una imagen estadísticamente correcta del almacenamiento y la distribución de datos que puede utilizar el optimizador al evaluar las rutas de acceso.

Las estadísticas del optimizador incluyen lo siguiente:

Oracle AI Database recopila estadísticas del optimizador en todos los objetos de base de datos automáticamente y mantiene estas estadísticas como una tarea de mantenimiento automatizada. También puede recopilar estadísticas manualmente mediante el paquete DBMS_STATS. Este paquete PL/SQL puede modificar, ver, exportar, importar y suprimir estadísticas. Nota: Las estadísticas del optimizador se crean para la optimización de consultas y se almacenan en el diccionario de datos. No confunda estas estadísticas con estadísticas de rendimiento visibles mediante vistas de rendimiento dinámico.

El asesor de estadísticas del optimizador es un software de diagnóstico incorporado que analiza cómo está recopilando estadísticas actualmente, la eficacia de los trabajos de recopilación de estadísticas existentes y la calidad de las estadísticas recopiladas. El asesor de estadísticas del optimizador mantiene reglas que incorporan las mejores prácticas de Oracle basadas en el juego de funciones actual. De esta forma, el asesor siempre proporciona las recomendaciones más actualizadas para la recopilación de estadísticas.

Consulte además:

Indicaciones de Optimizador

Una indicación es un comentario de una sentencia SQL que actúa como instrucción para el optimizador.

A veces, el diseñador de aplicaciones, que tiene más información sobre los datos de una aplicación concreta de la que está disponible para el optimizador, puede elegir una forma más eficaz de ejecutar una sentencia SQL. El diseñador de aplicaciones puede utilizar indicaciones en sentencias SQL para especificar cómo se debe ejecutar la sentencia. Los ejemplos siguientes ilustran el uso de indicaciones.

Ejemplo 10-2 Plan de Ejecución para SELECT con Indicación FIRST_ROWS

Supongamos que la aplicación interactiva ejecuta una consulta que devuelve 50 filas. Esta aplicación recupera inicialmente solo las primeras 25 filas de la consulta que se van a presentar al usuario final. Desea que el optimizador genere un plan que obtenga los primeros 25 registros lo antes posible para que el usuario no se vea obligado a esperar. Puede utilizar una indicación para transferir esta instrucción al optimizador como se muestra en la sentencia SELECT y la salida AUTOTRACE en el siguiente ejemplo:

SELECT /*+ FIRST_ROWS(25) */ employee_id, department_id
FROM   hr.employees
WHERE  department_id > 50;

------------------------------------------------------------------------
| Id | Operation                    | Name              | Rows | Bytes
------------------------------------------------------------------------
|  0 | SELECT STATEMENT             |                   | 26   | 182
|  1 |  TABLE ACCESS BY INDEX ROWID | EMPLOYEES         | 26   | 182
|* 2 |   INDEX RANGE SCAN           | EMP_DEPARTMENT_IX |      |
------------------------------------------------------------------------

En este ejemplo, el plan de ejecución muestra que el optimizador selecciona un índice en la columna employees.department_id para buscar las primeras 25 filas de employees cuyo ID de departamento es superior a 50. El optimizador utiliza el ID de fila recuperado del índice para recuperar el registro de la tabla employees y devolverlo al cliente. La recuperación del primer registro suele ser casi instantánea.

Ejemplo 10-3 Plan de ejecución para SELECT sin indicación

Supongamos que ejecuta la misma sentencia, pero sin la indicación del optimizador:

SELECT employee_id, department_id
FROM   hr.employees
WHERE  department_id > 50;

------------------------------------------------------------------------
| Id | Operation              | Name              | Rows | Bytes | Cos
------------------------------------------------------------------------
|  0 | SELECT STATEMENT       |                   | 50   | 350   |
|* 1 |  VIEW                  | index$_join$_001  | 50   | 350   |
|* 2 |   HASH JOIN            |                   |      |       |
|* 3 |    INDEX RANGE SCAN    | EMP_DEPARTMENT_IX | 50   | 350   |
|  4 |    INDEX FAST FULL SCAN| EMP_EMP_ID_PK     | 50   | 350   |

En este caso, el plan de ejecución une dos índices para devolver los registros solicitados lo más rápido posible. En lugar de pasar repetidamente de un índice a otra tabla como en el Ejemplo 10-2, el optimizador selecciona una exploración de rango de EMP_DEPARTMENT_IX para buscar todas las filas en las que el ID de departamento sea superior a 50 y colocar estas filas en una tabla hash. A continuación, el optimizador selecciona leer el índice EMP_EMP_ID_PK. Para cada fila de este índice, sondea la tabla hash para buscar el ID de departamento.

En este caso, la base de datos no puede devolver la primera fila al cliente hasta que se complete la exploración de rango de índices de EMP_DEPARTMENT_IX. Por lo tanto, este plan generado tardaría más en devolver el primer registro. A diferencia del plan del Ejemplo 10-2, que accede a la tabla por ID de fila de índice, el plan utiliza E/S multibloque, lo que da como resultado lecturas grandes. Las lecturas permiten que la última fila de todo el juego de resultados se devuelva más rápidamente.

Consulte también: Guía de ajustes SQL de Oracle AI Database para aprender a utilizar indicaciones del optimizador

Visión General del Procesamiento SQL

En esta sección se explica cómo Oracle AI Database procesa las sentencias SQL. En concreto, la sección explica la forma en que la base de datos procesa las sentencias DDL para crear objetos, DML para modificar datos y consultas para recuperar datos.

Etapas del Procesamiento SQL

Las etapas generales de procesamiento SQL son el análisis, la optimización, la generación de origen de fila y la ejecución. En función de la sentencia, la base de datos puede omitir algunos de estos pasos.

En la siguiente figura, se muestran las etapas generales:

Figura 3: Etapas del Procesamiento SQL

Descripción de la ilustración cncpt250.gif

Análisis SQL

La primera etapa del procesamiento SQL es el análisis de SQL. Esta etapa implica la separación de parte de una sentencia SQL en una estructura de datos que puedan procesar otras rutinas.

Cuando una aplicación emite una sentencia SQL, la aplicación realiza una llamada de análisis a la base de datos para preparar la sentencia para su ejecución. La llamada de análisis abre o crea un cursor, que es un manejador para el área SQL privada específica de la sesión que contiene una sentencia SQL analizada y otra información de procesamiento. El cursor y el área SQL privada están en PGA.

Durante la llamada de análisis, la base de datos realiza las siguientes comprobaciones:

Las comprobaciones anteriores identifican los errores que se pueden encontrar antes de la ejecución de la sentencia. Algunos errores no se pueden detectar mediante el análisis. Por ejemplo, la base de datos puede encontrar un desbloqueo o errores en la conversión de datos solo durante la ejecución de la sentencia.

La base de datos intenta la mitigación automática de errores para las sentencias SQL que fallan con un error ORA-00600 durante la fase de análisis. Un ORA-00600 es un error grave. Indica que un proceso ha encontrado una condición inesperada de bajo nivel. Cuando una sentencia SQL falla con este error durante la fase de análisis, la mitigación automática de errores lo detecta e intenta resolver la condición. Si se encuentra una resolución, la base de datos genera un parche SQL para ajustar el plan de ejecución SQL. Si este parche permite que el análisis se complete correctamente, no se emite el error ORA-00600. La aplicación no ve ninguna excepción.

Consulte también: Bloques y interbloqueos Acerca de la mitigación automática de errores de SQL

Optimización de SQL

La optimización de consultas es el proceso de selección de los medios más eficaces para ejecutar una sentencia SQL.

La base de datos optimiza las consultas basándose en las estadísticas recopiladas sobre los datos reales a los que se está accediendo. El optimizador utiliza el número de filas, el tamaño del juego de datos y otros factores para generar posibles planes de ejecución, asignando un costo numérico a cada plan. La base de datos utiliza el plan con el costo más reducido.

La base de datos debe realizar un análisis pesado al menos una vez para cada sentencia DML única y realizar la optimización durante este análisis. DDL nunca se optimiza a menos que incluya un componente DML como una subconsulta que requiera optimización.

Consulte además:

Generación de origen de fila SQL

El generador de origen de fila es un software que recibe el plan a ejecutar óptimo desde el optimizador y produce un plan iterativo, denominado plan de consulta, que puede usar el resto de la base de datos.

El plan de consulta adopta la forma de una combinación de pasos. Cada paso devuelve un juego de filas. Las filas de este juego se utilizan en el siguiente paso o, en el último paso, se devuelven a la aplicación mediante la emisión de una sentencia SQL.

Un origen de fila es un juego de filas devuelto por un paso del plan de ejecución junto con una estructura de control que puede procesar iterativamente las filas. El origen de fila puede ser una tabla, vista o resultado de una operación de unión o agrupación.

Ejecución SQL

Durante la ejecución, el motor SQL ejecuta cada origen de fila del árbol producido por el generador del origen de fila. Este es el único paso obligatorio en el procesamiento DML.

Durante la ejecución, si los datos no están en memoria, la base de datos lee los datos del disco en memoria. La base de datos también elimina los bloqueos y bloqueos internos necesarios para garantizar la integridad de los datos y registra los cambios realizados durante la ejecución de SQL. La última etapa del procesamiento de una sentencia SQL es cerrar el cursor.

Si la base de datos está configurada para utilizar el almacén de columnas en memoria (almacén de columnas de IM), la base de datos enruta las consultas de forma transparente al almacén de columnas de IM cuando sea posible, y al disco y a la caché de buffers de la base de datos de lo contrario. Una sola consulta también puede utilizar el almacén de columnas de IM, el disco y la caché de buffers. Por ejemplo, una consulta puede unir dos tablas, una de las cuales solo se almacena en caché en el almacén de columnas de IM.

Consulte además:

Diferencias entre el procesamiento DML y DDL

Oracle AI Database procesa DDL de forma diferente a DML.

Por ejemplo, al crear una tabla, la base de datos no optimiza la sentencia CREATE TABLE. En su lugar, Oracle AI Database analiza la sentencia DDL y ejecuta el comando.

A diferencia del DDL, la mayoría de las sentencias DML tienen un componente de consulta. En una consulta, la ejecución de un cursor coloca la fila generada por la consulta en el juego de resultados.

La base de datos puede recuperar filas de juegos de resultados de una fila a la vez o en grupos. En la recuperación, la base de datos selecciona filas y, si la consulta lo solicita, ordena las filas. Cada recuperación sucesiva recupera otra fila del resultado hasta que se haya recuperado la última fila.

Consulte también: Oracle AI Database Development Guide para obtener más información sobre el procesamiento de DDL, el control de transacciones y otros tipos de sentencias