Uso de sugerencias de consulta de T-SQL para mejorar el rendimiento de las consultas de Babelfish
A partir de la versión 2.3.0, Babelfish admite el uso de sugerencias de consultas con pg_hint_plan
. En Aurora PostgreSQL, pg_hint_plan
se instala de forma predeterminada. Para obtener más información sobre la extensión de PostgreSQL pg_hint_plan
, consulte https://github.com/ossc-db/pg_hint_plan
El optimizador de consultas está bien diseñado para encontrar el plan de ejecución óptimo de una instrucción SQL. Al seleccionar un plan, el optimizador de consultas considera tanto el modelo de costes del motor como las estadísticas de columnas y tablas. Sin embargo, es posible que el plan sugerido no satisfaga las necesidades de sus conjuntos de datos. Por lo tanto, las sugerencias de consulta abordan los problemas de rendimiento para mejorar los planes de ejecución. Una query hint
es la sintaxis que se añade al SQL estándar que indica al motor de base de datos cómo ejecutar la consulta. Por ejemplo, una sugerencia puede indicar al motor que siga un análisis secuencial y anule cualquier plan que haya seleccionado el optimizador de consultas.
Activación de las sugerencias de consulta de T-SQL en Babelfish
Actualmente, Babelfish ignora todas las sugerencias de T-SQL de forma predeterminada. Para aplicar las sugerencias de T-SQL, ejecute el comando sp_babelfish_configure
con el valor de enable_pg_hint como ON.
EXECUTE sp_babelfish_configure 'enable_pg_hint', 'on' [, 'server']
Para que la configuración sea permanente a nivel de todo el clúster, incluya la palabra clave server. Para configurar el ajuste solo para la sesión actual, no utilice server.
Una vez que enable_pg_hint
está activado, Babelfish aplica las siguientes sugerencias de T-SQL.
-
Sugerencias de INDEX
-
Sugerencias de JOIN
-
Sugerencia de FORCE ORDER
-
Sugerencia de MAXDOP
Por ejemplo, se activa la siguiente secuencia de comandos en pg_hint_plan
.
1>
CREATE TABLE t1 (a1 INT PRIMARY KEY, b1 INT);2>
CREATE TABLE t2 (a2 INT PRIMARY KEY, b2 INT);3>
GO1>
EXECUTE sp_babelfish_configure 'enable_pg_hint', 'on';2>
GO1>
SET BABELFISH_SHOWPLAN_ALL ON;2>
GO1>
SELECT * FROM t1 JOIN t2 ON t1.a1 = t2.a2; --NO HINTS (HASH JOIN)2>
GO
No se aplica ninguna sugerencia a la instrucción SELECT. Se devuelve el plan de consulta sin sugerencias.
QUERY PLAN
---------------------------------------------------------------------------
Query Text: SELECT * FROM t1 JOIN t2 ON t1.a1 = t2.a2
Hash Join (cost=60.85..99.39 rows=2260 width=16)
Hash Cond: (t1.a1 = t2.a2)
-> Seq Scan on t1 (cost=0.00..32.60 rows=2260 width=8)
-> Hash (cost=32.60..32.60 rows=2260 width=8)
-> Seq Scan on t2 (cost=0.00..32.60 rows=2260 width=8)
1>
SELECT * FROM t1 INNER MERGE JOIN t2 ON t1.a1 = t2.a2;2>
GO
La sugerencia de consulta se aplica a la instrucción SELECT. El siguiente resultado muestra que se devuelve el plan de consulta con combinación de fusión.
QUERY PLAN
---------------------------------------------------------------------------
Query Text: SELECT/*+ MergeJoin(t1 t2) Leading(t1 t2)*/ * FROM t1 INNER JOIN t2 ON t1.a1 = t2.a2
Merge Join (cost=0.31..190.01 rows=2260 width=16)
Merge Cond: (t1.a1 = t2.a2)
-> Index Scan using t1_pkey on t1 (cost=0.15..78.06 rows=2260 width=8)
-> Index Scan using t2_pkey on t2 (cost=0.15..78.06 rows=2260 width=8)
1>
SET BABELFISH_SHOWPLAN_ALL OFF;2>
GO
Limitaciones
Cuando utilice las sugerencias de consulta, tenga en cuenta las siguientes limitaciones:
-
Si un plan de consultas se almacena en caché antes de que
enable_pg_hint
se active, las sugerencias no se aplicarán en la misma sesión. Se aplicarán en la nueva sesión. -
Si los nombres de los esquemas se proporcionan de forma explícita, las sugerencias no se pueden aplicar. Puede utilizar alias de tablas como solución alternativa.
-
No se puede aplicar una sugerencia de consulta a las vistas ni a las subconsultas.
-
Las sugerencias no funcionan para las instrucciones UPDATE/DELETE en las que haya JOIN.
-
Se omite cualquier sugerencia de índice de un índice o una tabla que no existen.
-
La sugerencia FORCE ORDER no funciona para JOIN HASH ni para JOIN que no sean ANSI.