Usar o plano de explicação para melhorar a performance das consultas do Babelfish
A partir da versão 2.1.0, o Babelfish inclui duas funções que usam de forma transparente o otimizador do PostgreSQL para gerar planos de consulta estimados e reais para consultas T-SQL na porta do TDS. Essas funções são semelhantes ao uso de SET STATISTICS PROFILE ou SET SHOWPLAN_ALL com bancos de dados do SQL Server para identificar e melhorar consultas de execução lenta.
nota
A obtenção de planos de consulta de funções, fluxos de controle e cursores não é compatível no momento.
Na tabela, você pode encontrar uma comparação das funções de explicação do plano de consulta no SQL Server, no Babelfish e no PostgreSQL.
SQL Server |
Babelfish |
PostgreSQL |
---|---|---|
SHOWPLAN_ALL |
BABELFISH_SHOWPLAN_ALL |
EXPLAIN |
STATISTICS PROFILE |
BABELFISH_STATISTICS PROFILE |
EXPLAIN ANALYZE |
Usa o otimizador do SQL Server |
Usa o otimizador do PostgreSQL |
Usa o otimizador do PostgreSQL |
Formato de entrada e saída do SQL Server |
Formato de entrada do SQL Server e saída do PostgreSQL |
Formato de entrada e saída do PostgreSQL |
Definido para a sessão |
Definido para a sessão |
Aplicar a uma declaração específica |
É compatível com o seguinte:
|
É compatível com o seguinte:
|
É compatível com o seguinte:
|
Use as funções do Babelfish da seguinte forma:
SET BABELFISH_SHOWPLAN_ALL [ON|OFF]: defina como ON (Ativo) para gerar um plano de execução de consulta estimado. Essa função implementa o comportamento do comando
EXPLAIN
do PostgreSQL. Use esse comando para obter o plano de explicação para determinada consulta.SET BABELFISH_STATISTICS PROFILE [ON|OFF]: defina como ON (Ativo) para planos de execução de consulta reais. Essa função implementa o comportamento do comando
EXPLAIN ANALYZE
do PostgreSQL.
Para obter mais informações sobre EXPLAIN
e EXPLAIN ANALYZE
do PostgreSQL, consulte EXPLAIN
nota
A partir da versão 2.2.0, você pode definir o parâmetro escape_hatch_showplan_all
como ignore para evitar o uso do prefixo BABELFISH_ na sintaxe dos comandos SET SHOWPLAN_ALL
e STATISTICS PROFILE
do SQL Server.
Por exemplo, a sequência de comandos a seguir ativa o planejamento de consulta e, depois, retorna um plano de execução de consulta estimado para a instrução SELECT sem executar a consulta. Esse exemplo usa o exemplo de banco de dados do SQL Server northwind
usando a ferramenta de linha de comando sqlcmd
para consultar a porta do TDS:
1>
SET BABELFISH_SHOWPLAN_ALL ON2>
GO1>
SELECT t.territoryid, e.employeeid FROM2>
dbo.employeeterritories e, dbo.territories t3>
WHERE e.territoryid=e.territoryid ORDER BY t.territoryid;4>
GOQUERY PLAN ------------------------------------------------------------------------------------ Query Text: SELECT t.territoryid, e.employeeid FROM dbo.employeeterritories e, dbo.territories t WHERE e.territoryid=e.territoryid ORDER BY t.territoryid Sort (cost=6231.74..6399.22 rows=66992 width=10) Sort Key: t.territoryid NULLS FIRST -> Nested Loop (cost=0.00..861.76 rows=66992 width=10) -> Seq Scan on employeeterritories e (cost=0.00..22.70 rows=1264 width=4) Filter: ((territoryid)::"varchar" IS NOT NULL) -> Materialize (cost=0.00..1.79 rows=53 width=6) -> Seq Scan on territories t (cost=0.00..1.53 rows=53 width=6)
Quando você terminar de revisar e ajustar sua consulta, desative a função como mostrado a seguir:
1>
SET BABELFISH_SHOWPLAN_ALL OFF
Com BABELFISH_STATISTICS PROFILE definido como ON (Ativo), cada consulta executada retorna seu conjunto de resultados regular seguido de um conjunto de resultados adicional que mostra planos de execução de consulta reais. O Babelfish gera o plano de consulta que fornece o conjunto de resultados mais rápido quando invoca a instrução SELECT.
1>
SET BABELFISH_STATISTICS PROFILE ON1>
2>
GO1>
SELECT e.employeeid, t.territoryid FROM2>
dbo.employeeterritories e, dbo.territories t3>
WHERE t.territoryid=e.territoryid ORDER BY t.territoryid;4>
GO
O conjunto de resultados e o plano de consulta são retornados (esse exemplo mostra apenas o plano de consulta).
QUERY PLAN
---------------------------------------------------------------------------
Query Text: SELECT e.employeeid, t.territoryid FROM
dbo.employeeterritories e, dbo.territories t
WHERE t.territoryid=e.territoryid ORDER BY t.territoryid
Sort (cost=42.44..43.28 rows=337 width=10)
Sort Key: t.territoryid NULLS FIRST
-> Hash Join (cost=2.19..28.29 rows=337 width=10)
Hash Cond: ((e.territoryid)::"varchar" = (t.territoryid)::"varchar")
-> Seq Scan on employeeterritories e (cost=0.00..22.70 rows=1270 width=36)
-> Hash (cost=1.53..1.53 rows=53 width=6)
-> Seq Scan on territories t (cost=0.00..1.53 rows=53 width=6)
Para saber mais sobre como analisar suas consultas e os resultados retornados pelo otimizador do PostgreSQL, consulte explain.depesz.com
Parâmetros que controlam as opções de explicação do Babelfish
Você pode usar os parâmetros mostrados na tabela a seguir para controlar o tipo de informação que é exibida pelo plano de consulta.
Parâmetro | Descrição |
---|---|
babelfishpg_tsql.explain_buffers |
Um valor booliano que ativa (e desativa) as informações de uso do buffer para o otimizador. (Padrão: desativado) (Permitido: desativado, ativado) |
babelfishpg_tsql.explain_costs |
Um valor booliano que ativa (e desativa) as informações estimadas de inicialização e custo total para o otimizador. (Padrão: ativado) (Permitido: desativado, ativado) |
babelfishpg_tsql.explain_format |
Especifica o formato de saída do plano |
babelfishpg_tsql.explain_settings |
Um valor booliano que ativa (ou desativa) a inclusão de informações sobre parâmetros de configuração na saída do plano EXPLAIN. (Padrão: desativado) (Permitido: desativado, ativado) |
babelfishpg_tsql.explain_summary |
Um valor booliano que ativa (ou desativa) informações resumidas, como o tempo total após o plano de consulta. (Padrão: ativado) (Permitido: desativado, ativado) |
babelfishpg_tsql.explain_timing |
Um valor booliano que ativa (ou desativa) o tempo real de inicialização e o tempo gasto em cada nó na saída. (Padrão: ativado) (Permitido: desativado, ativado) |
babelfishpg_tsql.explain_verbose |
Um valor booliano que ativa (ou desliga) a versão mais detalhada de um plano de explicação. (Padrão: desativado) (Permitido: desativado, ativado) |
babelfishpg_tsql.explain_wal |
Um valor booliano que ativa (ou desativa) a geração de informações de registro WAL como parte de um plano de explicação. (Padrão: desativado) (Permitido: desativado, ativado) |
Você pode conferir os valores de quaisquer parâmetros relacionados ao Babelfish em seu sistema usando o cliente do PostgreSQL ou do SQL Server. Execute o seguinte comando para obter os valores atuais dos parâmetros:
1>
execute sp_babelfish_configure '%explain%';2>
GO
Na saída a seguir, você pode ver que todas as configurações nesse cluster de banco de dados do Babelfish específico estão com seus valores padrão. Nem todas as saídas são mostradas neste exemplo.
name setting short_desc ---------------------------------- -------- -------------------------------------------------------- babelfishpg_tsql.explain_buffers off Include information on buffer usage babelfishpg_tsql.explain_costs on Include information on estimated startup and total cost babelfishpg_tsql.explain_format text Specify the output format, which can be TEXT, XML, JSON, or YAML babelfishpg_tsql.explain_settings off Include information on configuration parameters babelfishpg_tsql.explain_summary on Include summary information (e.g.,totaled timing information) after the query plan babelfishpg_tsql.explain_timing on Include actual startup time and time spent in each node in the output babelfishpg_tsql.explain_verbose off Display additional information regarding the plan babelfishpg_tsql.explain_wal off Include information on WAL record generation (8 rows affected)
Você pode alterar a configuração desses parâmetros usando sp_babelfish_configure
, conforme mostrado no exemplo a seguir.
1>
execute sp_babelfish_configure 'explain_verbose', 'on';2>
GO
Se quiser tornar a configuração permanente em todo o cluster, inclua a palavra-chave server, conforme mostrado a seguir:
1>
execute sp_babelfish_configure 'explain_verbose', 'on', 'server';2>
GO