sys.query_store_plan (Transact-SQL)

Se aplica a: SQL Server 2016 (13.x) y versiones posteriores Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Contiene información sobre cada plan de ejecución asociado a una consulta.

Nombre de la columna Tipo de datos Descripción
plan_id bigint Clave principal.
query_id bigint Clave externa. Se une a sys.query_store_query (Transact-SQL).
plan_group_id bigint Identificador del grupo de planes. Las consultas de cursor suelen requerir varios planes (rellenar y capturar). Los planes de rellenar y capturar que se compilan juntos están en el mismo grupo.

0 significa que el plan no está en un grupo.
engine_version nvarchar(32) Versión del motor que se usa para compilar el plan en <major>.<minor>.<build>.<revision> formato.
compatibility_level smallint Nivel de compatibilidad de la base de datos a la que se hace referencia en la consulta.
query_plan_hash binary(8) Hash MD5 del plan individual.
query_plan nvarchar(max) XML del plan de presentación para el plan de consulta.
is_online_index_plan bit El plan se usó durante una generación de índice en línea.

Nota: Azure Synapse Analytics siempre devuelve 0.
is_trivial_plan bit El plan es un plan trivial (salida en la fase 0 del optimizador de consultas).

Nota: Azure Synapse Analytics siempre devuelve 0.
is_parallel_plan bit El plan es paralelo.

Nota: Azure Synapse Analytics siempre devuelve 1.
is_forced_plan bit El plan se marca como forzado cuando el usuario ejecuta el procedimiento sys.sp_query_store_force_planalmacenado . El mecanismo de fuerza no garantiza que este plan exacto se usará para la consulta a la que hace query_idreferencia . Al forzar el plan, la consulta se vuelve a compilar y normalmente genera exactamente lo mismo o un plan similar al plan al que hace plan_idreferencia . Si la fuerza del plan no se realiza correctamente, force_failure_count se incrementa y last_force_failure_reason se rellena con el motivo del error.

Nota: Azure Synapse Analytics siempre devuelve 0.
is_natively_compiled bit El plan incluye procedimientos optimizados para memoria compilados de forma nativa. (0 = FALSE, 1 = TRUE).

Nota: Azure Synapse Analytics siempre devuelve 0.
force_failure_count bigint Número de veces que se ha producido un error al forzar este plan. Solo se puede incrementar cuando se vuelve a compilar la consulta (no en cada ejecución). Restablece a 0 cada vez is_plan_forced que se cambia de FALSE a TRUE.

Nota: Azure Synapse Analytics siempre devuelve 0.
last_force_failure_reason int Motivo por el que se produjo un error al forzar el plan.

0: no hay ningún error; de lo contrario, el número de error del error que provocó el error del forzado.
3617: COMPILATION_ABORTED_BY_CLIENT
8637: ONLINE_INDEX_BUILD
8675: OPTIMIZATION_REPLAY_FAILED
8683: INVALID_STARJOIN
8684: TIME_OUT
8689: NO_DB
8690: HINT_CONFLICT
8691: SETOPT_CONFLICT
8694: DQ_NO_FORCING_SUPPORTED
8698: NO_PLAN
8712: NO_INDEX
8713: VIEW_COMPILE_FAILED
<otro valor>: GENERAL_FAILURE

Nota: Azure Synapse Analytics siempre devuelve 0.
last_force_failure_reason_desc nvarchar(128) Descripción textual de last_force_failure_reason.

COMPILATION_ABORTED_BY_CLIENT: compilación de consultas anuladas por el cliente antes de completarla
ONLINE_INDEX_BUILD: la consulta intenta modificar los datos mientras la tabla de destino tiene un índice que se está compilando en línea.
OPTIMIZATION_REPLAY_FAILED: no se pudo ejecutar el script de reproducción de optimización.
INVALID_STARJOIN: el plan contiene una especificación StarJoin no válida.
TIME_OUT: el optimizador superó el número de operaciones permitidas al buscar el plan especificado por el plan forzado.
NO_DB: no existe una base de datos especificada en el plan.
HINT_CONFLICT: no se puede compilar la consulta porque el plan entra en conflicto con una sugerencia de consulta.
DQ_NO_FORCING_SUPPORTED: no se puede ejecutar la consulta porque el plan entra en conflicto con el uso de operaciones de consulta distribuida o de texto completo.
NO_PLAN: el procesador de consultas no pudo generar el plan de consulta, ya que no se pudo comprobar el plan forzado como válido para la consulta.
NO_INDEX: el índice especificado en el plan ya no existe.
VIEW_COMPILE_FAILED: no se pudo forzar el plan de consulta debido a un problema en una vista indizada a la que se hace referencia en el plan.
GENERAL_FAILURE: error de fuerza general (no cubierto por otras razones)

Nota: Azure Synapse Analytics siempre devuelve NONE.
count_compiles bigint Estadísticas de compilación de planes.
initial_compile_start_time datetimeoffset Estadísticas de compilación de planes.
last_compile_start_time datetimeoffset Estadísticas de compilación de planes.
last_execution_time datetimeoffset La última hora de ejecución se refiere a la última hora de finalización de la consulta/plan.
avg_compile_duration float Planee estadísticas de compilación, en microsegundos. Divida en 1000 000 para obtener segundos.
last_compile_duration bigint Planee estadísticas de compilación, en microsegundos. Divida en 1000 000 para obtener segundos.
plan_forcing_type int Se aplica a: SQL Server 2017 (14.x) y versiones posteriores

Tipo de forzado de planes.

0: NONE
1: MANUAL
2: AUTO
plan_forcing_type_desc nvarchar(60) Se aplica a: SQL Server 2017 (14.x) y versiones posteriores

Descripción del texto de plan_forcing_type.

NONE: sin forzar ningún plan
MANUAL: plan forzado por el usuario
AUTO: plan forzado por ajuste automático.
has_compile_replay_script bit Se aplica a: SQL Server 2022 (16.x) y versiones posteriores.

Indica si el plan tiene asociado un script de reproducción de optimización:
0 = Ningún script de reproducción de optimización (ninguno o incluso no válido).
1 = Script de reproducción de optimización registrado.

No es aplicable a Azure Synapse Analytics.
is_optimized_plan_forcing_disabled bit Se aplica a: SQL Server 2022 (16.x) y versiones posteriores.

Indica si el forzado de plan optimizado se deshabilitó para el plan:
0 = deshabilitada
1 = no deshabilitado.

No es aplicable a Azure Synapse Analytics.
plan_type int Se aplica a: SQL Server 2022 (16.x) y versiones posteriores.

Tipo de plan.
0: Plan compilado
1: Plan de distribuidor
2: Plan variant de consulta

No es aplicable a Azure Synapse Analytics.
plan_type_desc nvarchar(120) Se aplica a: SQL Server 2022 (16.x) y versiones posteriores.

Descripción del texto del tipo de plan.
Plan compilado: indica que el plan es un plan optimizado para no parámetros
Plan de distribuidor: indica que el plan es un plan optimizado para parámetros.
Plan de variante de consulta: indica que el plan es un plan de consulta optimizado para parámetros.

No es aplicable a Azure Synapse Analytics.

Comentarios

Se puede forzar más de un plan cuando se habilita Almacén de consultas para réplicas secundarias.

En Azure Synapse Analytics, el uso de columnas has_compile_replay_script, is_optimized_plan_forcing_disabled, plan_type, plan_type_desc produce un Invalid Column Name error, ya que no se admiten. Consulte el ejemplo B para ver un ejemplo de cómo usar sys.query_store_plan en Azure Synapse Analytics.

Limitaciones de forzar un plan

El Almacén de consultas dispone de un mecanismo para obligar al optimizador de consultas a usar un determinado plan de ejecución. Pero existen algunas limitaciones que pueden evitar la aplicación de un plan.

En primer lugar, si el plan contiene las siguientes construcciones:

  • Insertar instrucción bulk
  • Referencia a una tabla externa
  • Consulta distribuida u operaciones de texto completo
  • Uso de consultas globales
  • Cursores dinámicos o de conjunto de claves
  • Especificación de combinación en estrella no válida

Nota:

Azure SQL Database y SQL Server 2019 y versiones posteriores admiten el plan de soporte técnico para cursores estáticos y de avance rápido.

En segundo lugar, si los objetos en los que se basa el plan ya no están disponibles:

  • Base de datos (si la base de datos, donde se originó el plan, ya no existe)
  • Índice (ya no existe o está deshabilitado)

Por último, problemas con el propio plan:

  • No válido para la consulta
  • El optimizador de consultas ha superado el número de operaciones permitidas
  • XML de plan formado incorrectamente

Permisos

Requiere el permiso VIEW DATABASE STATE.

Ejemplos

A Busque la razón por la que SQL Server no pudo forzar un plan a través de QDS

Preste atención a las last_force_failure_reason_desc columnas y force_failure_count :

SELECT TOP 1000
    p.query_id,
    p.plan_id,
    p.last_force_failure_reason_desc,
    p.force_failure_count,
    p.last_compile_start_time,
    p.last_execution_time,
    q.last_bind_duration,
    q.query_parameterization_type_desc,
    q.context_settings_id,
    c.set_options,
    c.STATUS
FROM sys.query_store_plan p
INNER JOIN sys.query_store_query q
    ON p.query_id = q.query_id
INNER JOIN sys.query_context_settings c
    ON c.context_settings_id = q.context_settings_id
LEFT JOIN sys.query_store_query_text t
    ON q.query_text_id = t.query_text_id
WHERE p.is_forced_plan = 1
    AND p.last_force_failure_reason != 0;

B. Consulta para ver los resultados del plan de consulta en Azure Synapse Analytics

Use la siguiente consulta de ejemplo para buscar los 100 planes de ejecución más recientes en el Almacén de consultas en Azure Synapse Analytics.

SELECT TOP 100
    plan_id,
    query_id,
    plan_group_id,
    engine_version,
    compatibility_level,
    query_plan_hash,
    query_plan,
    is_online_index_plan,
    is_trivial_plan,
    is_parallel_plan,
    is_forced_plan,
    is_natively_compiled,
    force_failure_count,
    last_force_failure_reason,
    last_force_failure_reason_desc,
    count_compiles,
    initial_compile_start_time,
    last_compile_start_time,
    last_execution_time,
    avg_compile_duration,
    last_compile_duration,
    plan_forcing_type,
    plan_forcing_type_desc
FROM sys.query_store_plan
ORDER BY last_execution_time DESC;