El optimizador de consultas de Spanner determina la forma ejecutar una consulta en SQL. Sin embargo, el plan de consultas determinado por el optimizador cambian levemente cuando el optimizador de consultas evoluciona o cuando la base de datos estadísticas actualizadas. Para minimizar cualquier potencial de regresión en el rendimiento cuando el optimizador de consultas o las estadísticas cambian, las siguientes opciones de consulta.
optimizer_version: los cambios en el optimizador de consultas se agrupan y se lanzaron como versiones del optimizador. Spanner comienza a usar la versión más reciente del optimizador como predeterminado al menos 30 días después del lanzamiento de esa versión. Puedes usar la opción de versión del optimizador de consultas para ejecutar consultas en un más reciente del optimizador.
optimizer_statistics_package: Optimizador de actualizaciones de Spanner estadísticas con regularidad. Las nuevas estadísticas están disponibles como un paquete. Esta opción de consulta especifica un paquete de estadísticas para que utilice el optimizador de consultas cuando compilas una consulta en SQL. El paquete especificado debe tener recolección de elementos no utilizados inhabilitado:
GoogleSQL
ALTER STATISTICS <package_name> SET OPTIONS (allow_gc=false)
PostgreSQL
ALTER STATISTICS spanner."" SET OPTIONS (allow_gc = true)
En esta guía, se muestra cómo configurar estas opciones individuales en diferentes permisos en Spanner.
Enumera las opciones del optimizador de consultas
Spanner almacena información sobre las versiones disponibles del optimizador y paquetes de estadísticas que puedes seleccionar.
Versiones del optimizador
La versión del optimizador de consultas es un valor entero que se incrementa en 1 con cada actualización. La versión más reciente del optimizador de consultas es 7.
Ejecuta la siguiente instrucción de SQL para mostrar una lista de todos los optimizadores compatibles junto con sus fechas de lanzamiento correspondientes y si esa versión es el valor predeterminado. El número de versión más grande devuelto es el más reciente compatible más reciente del optimizador.
SELECT * FROM SPANNER_SYS.SUPPORTED_OPTIMIZER_VERSIONS;
Versión predeterminada
De forma predeterminada, Spanner comienza a usar la versión más reciente del optimizador en al menos 30 días después del lanzamiento de esa versión. Durante el período de más de 30 días entre una versión nueva y esta se convertirá en la predeterminada, te recomendamos que pruebes en la versión nueva para detectar cualquier regresión.
Para encontrar la versión predeterminada, ejecuta la siguiente instrucción de SQL:
SELECT * FROM SPANNER_SYS.SUPPORTED_OPTIMIZER_VERSIONS;
La consulta muestra una lista de todas las versiones del optimizador compatibles. El
La columna IS_DEFAULT
especifica cuál es la versión predeterminada actual.
Para obtener detalles sobre cada versión, consulta Historial de versiones del optimizador de consultas.
Paquetes de estadísticas del optimizador
Cada paquete de estadísticas del optimizador nuevo que crea Spanner Se le asignó un nombre de paquete que garantiza que sea único dentro del en la base de datos.
El formato del nombre del paquete es auto_{PACKAGE_TIMESTAMP}UTC
.
En GoogleSQL, la sentencia ANALYZE
activa la creación del nombre del paquete de estadísticas. En
PostgreSQL
ANALYZE
realiza esta tarea. El formato del nombre del paquete de estadísticas es
analyze_{PACKAGE_TIMESTAMP}UTC
, donde
{PACKAGE_TIMESTAMP}
es la marca de tiempo, en la zona horaria UTC, de cuando la
se inició la construcción de estadísticas. Ejecuta la siguiente sentencia SQL para mostrar una lista de todos los paquetes de estadísticas del optimizador disponibles.
SELECT * FROM INFORMATION_SCHEMA.SPANNER_STATISTICS;
De forma predeterminada, Spanner usa el paquete de estadísticas más reciente del optimizador a menos que la base de datos o la consulta se fije a un paquete anterior usando una de las que se describen en esta página.
Prioridad de anulación de la opción
Si usas una base de datos de dialectos de GoogleSQL, Spanner ofrece varias formas de cambiar las opciones del optimizador. Por ejemplo, puedes establecer las opciones de un consulta específica o configurar la opción en la biblioteca cliente en el proceso a nivel de la búsqueda. Cuando una opción se configura de varias maneras, la siguiente prioridad que se aplique el pedido. (Selecciona un vínculo para pasar a esa sección de este documento).
Opción predeterminada de Spanner ← opción de base de datos ← app cliente ← variable de entorno ← consulta de cliente ← sugerencia de declaración
Por ejemplo, aquí te mostramos cómo interpretar el orden de prioridad al configurar el versión del optimizador de consultas:
Cuando creas una base de datos, esta usa el versión predeterminada del optimizador. Configurar la versión del optimizador usando uno de los métodos mencionados anteriormente prioridad sobre cualquier elemento a la izquierda. Por ejemplo, configurar el optimizador para una app que usa una variable de entorno prioridad sobre cualquier valor que establezcas para la base de datos con la opción base de datos. Configurar la versión del optimizador a través de una sugerencia de instrucción la mayor prioridad para la consulta dada, que tiene prioridad sobre el valor establecido con cualquier otro método.
Ahora analicemos cada método con más detalle.
Establece las opciones del optimizador a nivel de la base de datos
Puedes configurar la versión del optimizador predeterminada en una base de datos mediante el siguiente comando de DDL ALTER DATABASE
.
GoogleSQL
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_version = 7);
PostgreSQL
ALTER DATABASE MyDatabase SET spanner.optimizer_version = 5;
Puedes configurar el paquete de estadísticas de manera similar, como se muestra en el siguiente ejemplo: ejemplo.
GoogleSQL
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_statistics_package = "auto_20191128_14_47_22UTC");
PostgreSQL
ALTER DATABASE MyDatabase
SET spanner.optimizer_statistics_package = "auto_20191128_14_47_22UTC";
También puedes configurar más de una opción al mismo tiempo, como se muestra en el siguiente comando de DDL.
GoogleSQL
ALTER DATABASE MyDatabase
SET OPTIONS (optimizer_version = 7,
optimizer_statistics_package = "auto_20191128_14_47_22UTC");
Puedes ejecutar ALTER DATABASE
en gcloud CLI con la
gcloud CLI databases ddl update
de la siguiente manera.
GoogleSQL
gcloud spanner databases ddl update MyDatabase --instance=test-instance \
--ddl='ALTER DATABASE MyDatabase SET OPTIONS ( optimizer_version = 7 )'
PostgreSQL
gcloud spanner databases ddl update MyDatabase --instance=test-instance \
--ddl='ALTER DATABASE MyDatabase SET spanner.optimizer_version = 7'
Configura una opción de base de datos como NULL
(en GoogleSQL) o DEFAULT
(en
PostgreSQL) lo borra para que se use el valor predeterminado.
Para ver el valor actual de estas opciones para una base de datos, consulta
la vista INFORMATION_SCHEMA.DATABASE_OPTIONS
para GoogleSQL
information_schema database_options
para PostgreSQL, de la siguiente manera.
GoogleSQL
SELECT
s.OPTION_NAME,
s.OPTION_VALUE
FROM
INFORMATION_SCHEMA.DATABASE_OPTIONS s
WHERE
s.SCHEMA_NAME=""
AND s.OPTION_NAME IN ('optimizer_version', 'optimizer_statistics_package')
PostgreSQL
SELECT
s.option_name,
s.option_value
FROM
information_schema.database_options s
WHERE
s.schema_name='public'
AND s.option_name IN ('optimizer_version',
'optimizer_statistics_package')
Establece opciones del optimizador con bibliotecas cliente
Cuando interactúas de manera programática con Spanner a través del cliente hay varias formas de cambiar las opciones de consulta para tu aplicación cliente.
Debes usar las versiones más recientes de las bibliotecas cliente para configurar el optimizador opciones de estado.
Establece opciones de optimizador para un cliente de base de datos
Una aplicación puede configurar opciones de optimizador de forma global en la biblioteca cliente configurando la propiedad de opciones de consulta como se muestra en los siguientes fragmentos de código. La configuración del optimizador se almacena en el cliente y se aplican a todas las consultas ejecutadas durante el ciclo de vida 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 las opciones del optimizador con variables de entorno
Para que sea más fácil probar diferentes configuraciones del optimizador sin tener que
volver a compilar tu app, puedes configurar SPANNER_OPTIMIZER_VERSION
y
SPANNER_OPTIMIZER_STATISTICS_PACKAGE
y ejecuta tu app.
como se muestra en el siguiente fragmento.
Linux/macOS
export SPANNER_OPTIMIZER_VERSION="7"
export SPANNER_OPTIMIZER_STATISTICS_PACKAGE="auto_20191128_14_47_22UTC"
Windows
set SPANNER_OPTIMIZER_VERSION="7"
set SPANNER_OPTIMIZER_STATISTICS_PACKAGE="auto_20191128_14_47_22UTC"
Los valores especificados de las opciones del optimizador de consultas se leen y almacenan en el cliente en el momento de la inicialización del cliente y se aplican a todas las consultas ejecutadas a lo largo del ciclo de vida del cliente.
Establece opciones de optimizador para una consulta de cliente
Puedes especificar un valor para la versión del optimizador o la versión del paquete de estadísticas en el nivel de consulta en tu aplicación cliente mediante la especificación de opciones de consulta cuando crees la consulta.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Configura las opciones 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, se usará independientemente de todas las demás
de la versión del optimizador.
GoogleSQL
@{OPTIMIZER_VERSION=7} SELECT * FROM MyTable;
PostgreSQL
/*@OPTIMIZER_VERSION=7*/ SELECT * FROM MyTable;
También puedes usar el literal latest_version para configurar la versión del optimizador una consulta a la última versión, como se muestra aquí.
GoogleSQL
@{OPTIMIZER_VERSION=latest_version} SELECT * FROM MyTable;
PostgreSQL
/*@OPTIMIZER_VERSION=latest_version*/ SELECT * FROM MyTable;
Configurando la sugerencia OPTIMIZER_STATISTICS_PACKAGE
una sentencia obliga a que se ejecute esa consulta con el optimizador de consultas especificado
del paquete de estadísticas. El paquete especificado
debe tener inhabilitada la recolección de elementos no utilizados:
GoogleSQL
ALTER STATISTICS <package_name> SET OPTIONS (allow_gc=false)
PostgreSQL
ALTER STATISTICS spanner."package_name" SET OPTIONS (allow_gc=false)
La sugerencia OPTIMIZER_STATISTICS_PACKAGE
tiene el paquete de optimizador más alto.
el parámetro de configuración
de la precedencia. Si se especifica la sugerencia de instrucción, se usará
independientemente de las demás configuraciones
de la versión del paquete del optimizador.
@{OPTIMIZER_STATISTICS_PACKAGE=auto_20191128_14_47_22UTC} SELECT * FROM MyTable;
También puedes usar el literal latest para usar el paquete de estadísticas más reciente.
@{OPTIMIZER_STATISTICS_PACKAGE=latest} SELECT * FROM MyTable;
Ambas sugerencias se pueden establecer en una sola sentencia, como se muestra en el siguiente ejemplo.
El literal default_version configura la versión del optimizador para una consulta al predeterminada, que puede ser diferente de la última versión. Consulta Consulta la versión predeterminada para obtener más detalles.
GoogleSQL
@{OPTIMIZER_VERSION=default_version, OPTIMIZER_STATISTICS_PACKAGE=auto_20191128_14_47_22UTC} SELECT * FROM MyTable;
PostgreSQL
/*@OPTIMIZER_VERSION=default_version, OPTIMIZER_STATISTICS_PACKAGE=auto_20191128_14_47_22UTC*/ SELECT * FROM KeyValue;
Establecer las opciones del optimizador cuando se usa el controlador JDBC de Spanner
Puedes anular el valor predeterminado de la versión y las estadísticas del optimizador del paquete especificando opciones en la cadena de conexión de JDBC, como se muestra en siguiente ejemplo.
Estas opciones solo son compatibles con las últimas versiones del Controlador JDBC de Spanner.
También puedes configurar la versión del optimizador de consultas con la sentencia SET OPTIMIZER_VERSION
, como se muestra en el siguiente ejemplo.
Para obtener más información 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
Spanner admite un rango de versiones del optimizador.
Este rango cambia con el tiempo cuando se actualiza el optimizador de consultas. Si la versión
que especifiques está fuera del rango, la consulta fallará. Por ejemplo, si intentas ejecutar
una consulta con la sugerencia de instrucción
@{OPTIMIZER_VERSION=8}
,
pero el número de versión más reciente del optimizador es solo
7
, Spanner responde con
este mensaje de error:
Query optimizer version: 8 is not
supported
Controla una configuración no válida del paquete de estadísticas del optimizador
Puedes fijar tu base de datos o realizar consultas a cualquier paquete de estadísticas disponible con uno de los métodos descritos anteriormente en esta página. R la consulta falla si se proporciona un nombre de paquete de estadísticas no válido. Una estadística paquete especificado por una consulta debe ser uno de los siguientes:
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 la consola de Google Cloud y en Google Cloud CLI.
Consola de Google Cloud
Para ver la versión del optimizador que se usó para una consulta, ejecuta tu consulta en Spanner Studio de la consola de Google Cloud y, luego, selecciona La pestaña Explicación Deberías ver un mensaje similar al siguiente:
Versión del optimizador de consultas: 7
gcloud CLI
Para ver la versión que se usa al ejecutar una consulta en gcloud CLI, configura
la marca --query-mode
en PROFILE
, como se muestra en el siguiente fragmento.
gcloud spanner databases execute-sql MyDatabase --instance=test-instance \
--query-mode=PROFILE --sql='SELECT * FROM MyTable'
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 Spanner es el recuento de consultas, que mide la cantidad de consultas en una instancia, muestreadas a lo largo del tiempo. Aunque esta métrica es muy útil, para ver consultas agrupadas por código de error, también podemos usarlo se usó para ejecutar cada consulta.
Puedes usar el Explorador de métricas en La consola de Google Cloud permite visualizar el Recuento de consultas de tu base de datos. instancia. En la Figura 1, se muestra el recuento de consultas para 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 de esta figura, se muestra que my-db-1
intentó ejecutar una consulta con una versión de optimizador no válida, lo que muestra el estado Bad usage y genera un recuento de consultas de 0. Las otras bases de datos ejecutaban 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.
Si deseas configurar un gráfico similar para tu instancia, sigue estos pasos:
- Navega al Explorador de métricas en la consola de Google Cloud.
- 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. que se usan en diferentes consultas 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 optimizador. versión.
Para aprender a usar Cloud Monitoring para supervisar tu Spanner instancias, consulta Cómo supervisar con Cloud Monitoring