Cloud Spanner proporciona control del optimizador mediante el control de versiones del optimizador de consultas. En esta guía, se muestra cómo administrar la versión del optimizador de consultas que usan tus consultas.
A medida que implementemos actualizaciones en el optimizador de consultas de Cloud Spanner, nuestro objetivo será mejorar los planes de ejecución de consultas y entregar un rendimiento mejorado de tus consultas. De forma predeterminada, Cloud Spanner usa la versión más reciente del optimizador de consultas para cada base de datos. Con el control de versiones del optimizador de consultas, puedes ejecutar consultas en una versión anterior del optimizador que te proporciona un rendimiento predecible.
Enumera las versiones compatibles del optimizador
La versión del optimizador de consultas es un valor de número entero, que aumenta en 1 con cada actualización. La versión más reciente del optimizador de consultas es 2.
Ejecuta la siguiente instrucción de SQL a fin de mostrar una lista de todas las versiones del optimizador compatibles, junto con sus fechas de lanzamiento correspondientes. El número de versión más grande que se muestra es la versión compatible del optimizador más reciente.
SELECT * FROM SPANNER_SYS.SUPPORTED_OPTIMIZER_VERSIONS
De forma predeterminada, Cloud Spanner usa la versión más reciente del optimizador, que, en la actualidad, es 2. Usa uno de los métodos descritos en esta guía para anular este comportamiento predeterminado en tu situación.
Para obtener detalles sobre cada versión, consulta Historial de versiones del optimizador de consultas.
Prioridad de anulación de versión
Cloud Spanner ofrece varias formas de cambiar la versión del optimizador. Por ejemplo, puedes configurar la versión para una consulta específica o configurarla en la biblioteca cliente a nivel de proceso o de consulta. Cuando la versión se configura de muchas formas, se aplica el siguiente orden de prioridad. (Selecciona un vínculo para ir a esa sección en este documento).
Predeterminado de Cloud Spanner ← opción de base de datos ← app cliente ← variable de entorno ← consulta del cliente ← Sugerencia de declaración
Podemos interpretar el orden de prioridad anterior de la siguiente manera: cuando creas una base de datos, usa la versión predeterminada del optimizador de Cloud Spanner, que siempre es la versión más reciente. Configura de la versión del optimizador con uno de los métodos mencionados antes, que tiene prioridad sobre cualquier elemento que se encuentre a la izquierda. Por ejemplo, configurar el optimizador para una aplicación mediante una variable de entorno tiene prioridad sobre cualquier valor que establezcas para la base de datos con la opción de base de datos. La configuración de la versión del optimizador a través de una sugerencia de instrucción tiene la prioridad más alta para la consulta determinada y tiene prioridad sobre el valor establecido mediante cualquier otro método.
Ahora analicemos cada método con más detalle.
Configura la versión del optimizador para una base de datos con ALTER DATABASE
Puedes configurar la versión del optimizador predeterminada en una base de datos mediante el siguiente comando de DDL ALTER DATABASE
.
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_version = 2);
Puedes ejecutar ALTER DATABASE
en gcloud spanner con el comando gcloud spanner databases ddl update
de la siguiente manera.
gcloud spanner databases ddl update MyDatabase --instance=test-instance \
--ddl='ALTER DATABASE MyDatabase SET OPTIONS ( optimizer_version = 2 )'
Si configuras la opción de base de datos como NULL
, esta se borra y se establece como base de datos predeterminada en la versión más reciente. Este es el valor predeterminado para las bases de datos nuevas.
Para consultar el valor actual de esta opción para una base de datos, léelo desde la vista INFORMATION_SCHEMA.DATABASE_OPTIONS
.
Configura la versión del optimizador para una app cliente
Cuando interactúas de manera programática con Cloud Spanner a través de bibliotecas cliente, existen varias formas de cambiar la versión del optimizador para tu aplicación cliente.
Una aplicación puede configurar una opción de consulta global en la biblioteca cliente mediante la configuración de la propiedad de opciones de consulta como se muestra en los siguientes fragmentos de código. La configuración de la versión del optimizador se almacena en la instancia del cliente y se aplica a todas las consultas que se ejecutan durante toda la vida útil del cliente. Aunque las opciones se aplican a nivel de base de datos en el backend, cuando se configuran a nivel de cliente, se aplican a todas las bases de datos conectadas a través de ese cliente.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Configura la versión del optimizador para una app cliente con una variable de entorno
Para que sea más fácil probar diferentes versiones del optimizador sin tener que volver a compilar tu app, puedes configurar la variable de entorno SPANNER_OPTIMIZER_VERSION
y ejecutarla, como se muestra en el siguiente fragmento.
Linux/macOS
export SPANNER_OPTIMIZER_VERSION="2"
Windows
set SPANNER_OPTIMIZER_VERSION="2"
El valor de la versión del optimizador de consultas que se especificó se lee y se almacena en la instancia del cliente en el momento de la inicialización y se aplica a todas las consultas que se ejecutan durante toda la vida útil del cliente.
Configura la versión del optimizador para una consulta del cliente
Puedes especificar un valor para la versión del optimizador a nivel de consulta en tu aplicación cliente si especificas una propiedad de opciones de consulta cuando compiles tu consulta. Esto se ilustra en los siguientes fragmentos de código de cada lenguaje compatible.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Configura la versión del optimizador para una consulta mediante una sugerencia de instrucción
Una sugerencia de instrucción es una sugerencia en una declaración de consulta que cambia la ejecución de la consulta desde el comportamiento predeterminado. Configurar la sugerencia OPTIMIZER_VERSION
en una declaración obliga la ejecución de esa consulta mediante la versión del optimizador de consultas especificada.
La sugerencia OPTIMIZER_VERSION
tiene la prioridad de versión más alta del optimizador. Si se especifica la sugerencia de la declaración, se usará independientemente de todas las demás configuraciones de la versión del optimizador.
@{OPTIMIZER_VERSION=2} SELECT * FROM MyTable
También puedes usar el literal latest para establecer la versión del optimizador de una consulta en la versión más reciente, como se muestra aquí.
@{OPTIMIZER_VERSION=latest} SELECT * FROM MyTable
Configura la versión del optimizador cuando usas el controlador de JDBC
Puedes anular el valor predeterminado de la versión del optimizador si especificas una versión en la string de conexión JDBC, como se muestra en el siguiente ejemplo.
También puedes configurar la versión del optimizador de consultas con la declaración SET OPTIMIZER_VERSION
, como se muestra en el siguiente ejemplo.
Para obtener más detalles sobre el uso del controlador de código abierto, consulta Usa el controlador JDBC de código abierto.
Cómo se controlan las versiones del optimizador no válidas
Cloud Spanner admite un rango de versiones de optimizador. Este rango cambia con el tiempo cuando se actualiza el optimizador de consultas. Si la versión que especificas cuando usas uno de los métodos que se describen en esta guía está fuera de rango, Cloud Spanner falla la consulta. Por ejemplo, si intentas ejecutar una consulta con la versión 100 del optimizador, y supongamos que excede el valor máximo actual, recibirás el siguiente error.
Query optimizer version: 100 is not supported
Determina la versión del optimizador de consultas que se usa para ejecutar una consulta
La versión del optimizador que se usa para una consulta es visible en gcloud Spanner y a través de Cloud Console.
gcloud spanner
Para ver la versión que se usa cuando se ejecuta una consulta en gcloud Spanner, configura la marca --query-mode
como PROFILE
, como se muestra en el siguiente fragmento.
gcloud spanner databases execute-sql MyDatabase --instance=test-instance \
--query-mode=PROFILE --sql='SELECT * FROM MyTable'
Cloud Console
Para ver la versión del optimizador que se usó en una consulta, ejecútala en la vista Base de datos de consultas de Cloud Console y, luego, selecciona la pestaña Explicaciones. Deberías ver un mensaje similar al siguiente:
Esta consulta se ejecutó con la versión 2 del optimizador.
Visualiza la versión del optimizador de consultas en el Explorador de métricas
Cloud Monitoring recopila medidas para ayudarte a comprender el rendimiento de las aplicaciones y los servicios del sistema. Una de las métricas recopiladas para Cloud Spanner es Recuento de consultas, que mide la cantidad de consultas en una instancia y se muestra a lo largo del tiempo. Si bien esta métrica es muy útil para ver consultas agrupadas por código de error, también podemos usarla a fin de ver qué versión del optimizador se usó para ejecutar cada consulta.
Puedes usar el Explorador de métricas en Cloud Console para visualizar el Recuento de consultas de tu instancia de base de datos. En la Figura 1, se muestra el recuento de consultas de tres bases de datos. Puedes ver qué versión del optimizador se usa en cada base de datos.
En la tabla, debajo del gráfico, se muestra quemy-db-1 intentó ejecutar una consulta con una versión de optimizador no válida, que muestra el estadoUso inadecuado y, como resultado, Las otras bases de datos ejecutaron consultas con las versiones 1 y 2 del optimizador, respectivamente.
Figura 1. Recuento de consultas que se muestra en el Explorador de métricas con consultas agrupadas por versión del optimizador.
A fin de configurar un gráfico similar para tu instancia, sigue estos pasos:
- En Cloud Console, navega al Explorador de métricas.
- En el campo Tipo de recurso, selecciona
Cloud Spanner Instance
. - En el campo Métrica, selecciona
Count of queries
. - En el campo Agrupar por, selecciona
database
,optimizer_version
ystatus
.
No se muestra en este ejemplo cuando se usa una versión diferente del optimizador para consultas diferentes en la misma base de datos. En ese caso, el gráfico mostraría un segmento de barra para cada combinación de base de datos y versión del optimizador.
Si deseas obtener información sobre cómo usar Cloud Monitoring para supervisar tus instancias de Cloud Spanner, consulta Supervisa con Cloud Monitoring.