Acabei de me familiarizar com a dica "qb_name" (query block name)
no Oracle e abaixo você pode ver um exemplo de uso dessa dica em uma consulta:
select
/*+
qb_name(main)
*/
ord.id,
ord.valuation,
ord.status,
(select /*+ qb_name(company) */ max(com.name) from companies com where com.id = ord.id_company) company,
(select /*+ qb_name(product) */ max(prd1.name) from products prd1 where prd1.id = orl.id_product) product,
orl.quantity
from
orders ord,
order_lines orl
where
ord.date_placed > trunc(sysdate) - 7
and orl.id_ord = ord.id
and orl.id_product in (
select /*+ qb_name(class) */
prd2.id
from products prd2
where prd2.class = 'Group25'
)
Já pesquisei sobre isso mas os artigos não eram tão práticos então resolvi perguntar sobre essa dica aqui. Minhas perguntas são:
- Tem algum efeito significativo sobre
performance
? - Alguém aqui usou essa dica em sua consulta? porque ?
- Em que circunstâncias devemos usar esta dica?
desde já, obrigado
Nenhum impacto no desempenho, mas pode tornar mais fácil seguir um plano de consulta complicado e sugerir subconsultas específicas (ou seja, potencial para permitir que você facilite as melhorias de desempenho).
Eu o uso de tempos em tempos, principalmente quando estou demonstrando planos de execução, pois as subconsultas retêm os nomes dos blocos de consulta quando você adiciona bits.
Não há nenhuma situação que exija que você use a dica.
Pode ser útil fornecer seus próprios nomes para blocos de consulta no lugar de
SEL$1
,SEL$2
etc. gerados pelo otimizador. Também pode ser mais confiável se, por exemplo, suas dicas de nível superior se referirem a sub-blocos por nome, mas a numeração gerada pelo sistema for alterada posteriormente devido a edições na consulta, tornando sua/*+ full(e@sel$5) */
dica sem sentido.Consulta não sugerida:
Plano inclui:
Agora, se usarmos qblock_name para nomear o bloco de subconsulta e nos referirmos a ele no nível superior:
a mesma seção do plano se torna:
Além disso, o relatório de dicas (19c) mostra os blocos nomeados:
Embora este seja um exemplo trivial e artificial, você pode ver como a nomeação de blocos de consulta facilitaria a consolidação de dicas no nível superior.
A documentação diz que é para nomear blocos de SQL.
Isso parece ser mais para a pessoa que está ajustando o SQL mais do que para o CBO.
Respostas
Vou ter que verificar. mas, se o nome do CTE não aparecer no Plano, seria um bom lugar para colocá-lo. (Geralmente estou usando um mínimo de 5 CTEs em uma instrução SQL.)