Adaptive Cursor Sharing e SQL Plan Management

Fala ai, pessoal! Recentemente, tenho postado situações que ocorreram no meu trabalho pois estão mais recentes na memória. Hoje não seria diferente, então vamos para mais um post relacionado à performance, e como o Optimizer é um cidadão para qual tenho dedicado mais atenção recentemente, vamos falar destas duas features que influenciam muito o comportamento do mesmo, Adaptive Cursor Sharing (ACS) e SQL Plan Management (SPM).

O Adaptive Cursor Sharing permite que Oracle identifique se as variáveis binds do cursor de um statement podem influenciar no plano de execução existente, e este é o sub-comportamento do ACS conhecido como Bind-Sensitive. Um cursor é elegível a este sub-comportamento se existir histograma nesta coluna referenciada pela bind variable (classificando-a como distorcida) e também diante das novas estimativas de seletividade referente aos valores de binds distintos. O outro sub-comportamento é o Bind-Aware que permite ao Optimizer gerar novos planos de execução para cursores que já foram marcados como Bind-Sensitive, afim de garantir melhores planos. O Oracle avalia este comportamento ao longo das execuções, porém a partir do momento que um cursor-filho ser tornar Bind-Aware, imediatamente o cursor-pai será considerado como não compartilhável e será retirado da shared pool quando o espaço for necessário. Uma das formas de definir manualmente um statement como Bind-Aware é atribuindo o hint BIND_AWARE.

O SQL Plan Management captura e determina quais novos planos o Optimizer poderá executar, indiferentemente se um determinado cursor foi otimizado pelo ACS. Entende-se então que podem existir vários SQL Plan Baselines que estão marcados como não confiáveis e não serão usados pelo Optimizer apesar de apresentarem planos melhores.

Devemos ficar atentos pois o Oracle pode demorar para atribuir o comportamento de um cursor como Bind-Aware, e continuaremos a ter execuções com baixa performance se comparadas às outras. Portanto, se você está em um ambiente OLTP, o hint de Bind-Aware será bem vindo mas deverá ser avaliado pois causa mais consumo de CPU. Mas, se você está em um ambiente onde há um baixo número de statements enviadas ao Oracle e cada um destes demoram alguns minutos para terminar a execução, você está em um ambiente DSS/DW. E para que seja garantido sempre o melhor plano de execução para os estes statements (e se aplicação não quiser atribuir o hint de bind-aware), então siga com statements possuindo valores literais ao invéis de variáveis binds, pois a cada execução ocorrerá um hard parse e será sempre estimado o melhor plano de execução. Entenda que neste tipo de ambiente, o tempo perdido com os hard parses serão muito insignificantes em relação à quantidade de execuções efetuadas.

Por hoje é só, galera! Abraaaaaa

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s