Usar dicas de consulta T-SQL para melhorar a performance de consultas do Babelfish - Amazon Aurora

Usar dicas de consulta T-SQL para melhorar a performance de consultas do Babelfish

A partir da versão 2.3.0, o Babelfish comporta o uso de dicas de consulta com pg_hint_plan. No Aurora PostgreSQL, pg_hint_plan é instalado por padrão. Para obter mais informações sobre a extensão pg_hint_plan para PostgreSQL, consulte https://github.com/ossc-db/pg_hint_plan. Para obter detalhes sobre a versão dessa extensão compatível com o Aurora PostgreSQL, consulte Versões de extensão para o Amazon Aurora PostgreSQL em Notas de versão do Aurora PostgreSQL.

O otimizador de consultas é projetado para encontrar o plano de execução ideal para uma instrução SQL. Ao selecionar um plano, o otimizador de consultas considera tanto o modelo de custo do mecanismo quanto as estatísticas de colunas e tabelas. No entanto, o plano sugerido pode não atender às necessidades de seus conjuntos de dados. Assim, as dicas de consulta abordam os problemas de performance para melhorar os planos de execução. Uma query hint é uma sintaxe adicionada ao padrão SQL que instrui o mecanismo do banco de dados sobre como executar a consulta. Por exemplo, uma dica pode instruir o mecanismo a seguir uma varredura sequencial e anular qualquer plano que o otimizador de consultas tenha selecionado.

Ativar as dicas de consulta T-SQL no Babelfish

No momento, o Babelfish ignora todas as dicas T-SQL por padrão. Para aplicar as dicas T-SQL, execute o comando sp_babelfish_configure com o valor de enable_pg_hint como ON.

EXECUTE sp_babelfish_configure 'enable_pg_hint', 'on' [, 'server']

É possível tornar as configurações permanentes para todo o cluster ao incluir a palavra-chave server. Para definir a configuração apenas para a sessão atual, não use server.

Depois de ativar enable_pg_hint, o Babelfish aplica as dicas T-SQL a seguir.

  • Dicas de INDEX

  • Dicas de JOIN

  • Dica de FORCE ORDER

  • Dica de MAXDOP

Por exemplo, a sequência de comandos a seguir ativa pg_hint_plan.

1> CREATE TABLE t1 (a1 INT PRIMARY KEY, b1 INT); 2> CREATE TABLE t2 (a2 INT PRIMARY KEY, b2 INT); 3> GO 1> EXECUTE sp_babelfish_configure 'enable_pg_hint', 'on'; 2> GO 1> SET BABELFISH_SHOWPLAN_ALL ON; 2> GO 1> SELECT * FROM t1 JOIN t2 ON t1.a1 = t2.a2; --NO HINTS (HASH JOIN) 2> GO

Nenhuma dica é aplicada à instrução SELECT. O plano de consulta sem nenhuma dica é retornado.

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

A dica de consulta é aplicada à instrução SELECT. A saída a seguir mostra que o plano de consulta com junção de mesclagem é retornado.

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

Limitações

Ao usar as dicas de consulta, considere as seguintes limitações:

  • Se um plano de consulta for armazenado em cache antes da ativação de enable_pg_hint, as dicas não serão aplicadas na mesma sessão. Elas serão aplicadas na nova sessão.

  • Se nomes de esquemas forem fornecidos explicitamente, não será possível aplicar as dicas. Você pode usar aliases de tabela como uma solução alternativa.

  • Uma dica de consulta não pode ser aplicada a visualizações e subconsultas.

  • As dicas não funcionam para instruções UPDATE/DELETE com JOINs.

  • Uma dica de índice para um índice ou tabela inexistente é ignorada.

  • A dica FORCE ORDER não funciona para HASH JOINs e não ANSI JOINs.