#09 – Para que serve


Boa noite pessoal!!! Salve galera….

 

Tudo bem? Como passaram os últimos dias?

Graças a deus continuo forte na minha batalha profissional e acadêmica, como eu sempre falo para meus alunos, a vida é uma roda gigante e não podemos deixar ela parar muito menos perder a chance de curtir e aprender com cada momento.

Seguindo esta onda de oportunidades, estou retornando com mais uma post dedicado a sessão Para que serve, e conforme prometido hoje vamos finalizar o assunto de índices hipotéticos apresentado inicialmente no post: https://pedrogalvaojunior.wordpress.com/2016/08/06/07-para-que-serve/

Neste post vamos entender como o comando DBCC Autopilot pode influenciar o database engine e seus elementos execution plan e query optimizer na execução de nossas consultas, então vamos nessa galera…..


Começa agora o #09 – Para que serve – Índices Hipotéticos – Final.

 

Conforme apresentado nos posts anteriores o conceito de índices hipotéticos é uma técnica antiga, mas pouco conhecida na área de banco de dados. Para muitos profissionais da área este tipo de recurso acaba sendo algo obscuro e de pouco compreensão, por outro lado outros profissionais destacam como sendo como um recurso que permite simular a existência de um índice de forma lógica. Como em qualquer área profissional ou acadêmica sempre vai existir os dois lados da moeda e cabe a cada um de nós procurar entender, respeitar e conhecer estas opiniões.

Seguindo em frente, vamos dar continuidade em nosso estudo, fazendo uso da estrutura criada anteriormente no post: https://pedrogalvaojunior.wordpress.com/2016/09/03/08-para-que-serve/

Como você pode ter verificado, criamos o banco de dados HypotheticalDB e dentro dele os seguintes objetos apresentados na Figura 1:

hypotheticaldb-figura1

Figura 1 – Relação de objetos criados no banco de dados HypotheticalDB.

Podemos observar a existência dos três índices hipotéticos criados anteriormente para tabela ClientesCategorias, bem como, o código da tabela ClientesCategorias definido no valor: 597577167. Anote bem este código post nos próximos passos vamos fazer uso do mesmo.

Agora que já relembramos um pouco do que foi feito anteriormente em relação ao nosso ambiente, podemos continuar a fazer uso dos índices hipotéticos em nosso ambiente, onde neste momento vamos fazer com que o Microsoft SQL Server realize o uso deste recurso de forma empírica na execução da nossa query, para tal iremos utilizar o comando DBCC AutoPilot, caso você ainda não conheça ou não se lembre deste comando o mesmo foi apresentada de maneira detalhada no post: https://pedrogalvaojunior.wordpress.com/2016/08/06/07-para-que-serve/

Então mãos no teclado, chegou a hora de utilizarmos o comando DBCC AutoPilot fazendo uso do bloco de código 1, mas antes de teclar F5, clique no botão “Include Actual Execution Plan” ou tecle Ctrl+M para ativar o mesmo. Para que você possa entender o que será executado neste bloco de código e qual será o resultado apresentado é obrigatório que o plano de execução se encontre ativado.

Agora que você já realizou este procedimento, pode dar continuidade e executar o bloco de código 1 apresentado abaixo:

— Bloco de Código – Utilizando o DBCC AutoPilot forçando o uso do índice clusterizado IND_ClientesCategorias_Clusterizado_CodigoComEstatisticas –

Use HypotheticalDB

Go

 

DBCC AUTOPILOT (5, 5, 0, 0, 0) – Ativando o commando DBCC AutoPilot para iniciar uma nova sessão limpando o buffer de comando executados anteriormente —

 

DBCC AUTOPILOT (6,5,597577167,4) – Utilizando o commando DBCC AutoPilot orientado no uso exclusive de índices clusterizado —

GO

 

SET AUTOPILOT ON — Ativando a diretiva —

Go

 

Select C.Codigo,

Cc.Codigo As ‘Categoria do Cliente’,

C.Nome,

C.Endereco,

C.Estado,

C.DataUltimaCompra

From Clientes C Inner Join ClientesCategorias CC

On C.CodigoCategoria = CC.Codigo

Where C.Estado = ‘SP’

Go

 

SET AUTOPILOT OFF — Desativando a diretiva —

GO

 

Acredito que tudo deva ter ocorrido normalmente e você tenha conseguido realizar a execução do bloco de código 1 apresentado acima, neste momento o Management Studio apresentou em sua guia denominada execution plan o conjunto de operadores similares aos apresentados na Figura 2 a seguir:

hypotheticaldb-figura2

Figura 2 – Resultado da execução do bloco de código 1.

 

Note que o plano de execução nos apresenta dois operados do tipo Clustered Index Seek, respeitando a ordem de execução, temos o segundo operador com o custo de 51% de processamento apontando para o nosso índice clusterizado IND_ClientesCategorias_Clusterizado_CodigoComEstatisticas, neste momento você pode estar se perguntando.

Como o Database Engine em conjunto com o Query Optimizer e Execution Plan identificou a existência deste recurso sendo que o mesmo é algo hipotético, algo que somente existe de forma lógica, a resposta pode ser encontrada justamente na maneira que o comando DBCC AutoPilot foi declarado e posteriormente executado, onde temos o seguinte conjunto de valores passados como parâmetros de entrada:

PARÂMETRO DESCRIÇÃO VALOR DECLARADO
TypeID TypeID = 6: Usar apenas índices clusterizados 6
DbID ID do Banco de Dados 6 – HypotheticalDB
TabID Id da Tabela a ser utilizada 597577167
Indid Id do índice a ser utilizado 4

Foi através deste conjunto de valores apresentado no DBCC AutoPilot e posteriormente reconhecido e interpretados pelo database engine que o Query Optimizer e Execution Plan fizeram uso do nosso índice clusterizado.

Não é algo fantástico, realmente uma capacidade de análise e reconhecimento de recursos fora do comum, realmente o Microsoft SQL Server é um produto acima de qualquer suspeita, um software surpreendente.

Para finalizar vamos agora forçar o uso do nosso índice nonclustered IND_ClientesCategorias_NaoClusterizado_CodigoSemEstatisticas e observar qual será o comportamento e resultado apresentado pelo Management Studio após a execução do bloco de código 2 apresentando na sequência:

— Bloco de Código 2 – Forçando o uso do índice não clusterizado IND_ClientesCategorias_NaoClusterizado_CodigoSemEstatisticas –

DBCC AUTOPILOT (5, 5, 0, 0, 0)

DBCC AUTOPILOT (0,5,597577167,2)

GO

 

SET AUTOPILOT ON — Ativando a diretiva —

Go

 

Select C.Codigo,

Cc.Codigo As ‘Categoria do Cliente’,

C.Nome,

C.Endereco,

C.Estado,

C.DataUltimaCompra

From Clientes C Inner Join ClientesCategorias CC

On C.CodigoCategoria = CC.Codigo

Where C.Estado = ‘SP’

Go

 

SET AUTOPILOT OFF — Desativando a diretiva —

GO

 

Verificando o resultado apresentado na Figura 3 abaixo, tendo como base a guia Execution Plan, podemos notar a presença do operador Index Seek apontando para nosso índice não clusterizado: IND_ClientesCategorias_Clusterizado_CodigoComEstatisticas.

hypotheticaldb-figura3
Figura 3 – Resultado da execução do bloco de código 2.

Analisando com mais calma o resultado apresentado na Figura 3, fica fácil identificar a presença do operador Index Seek como já havia destacado, quando o comando DBCC AutoPilot foi executado com o seguinte conjunto de valores:

PARÂMETRO DESCRIÇÃO VALOR DECLARADO
TypeID TypeID = 0: Usar apenas índices não clusterizados 0
DbID ID do Banco de Dados 6 – HypotheticalDB
TabID Id da Tabela a ser utilizada 597577167
Indid Id do índice a ser utilizado 2

Não é algo surpreendente e simples, esse é o Microsoft SQL Server, mais uma vez dando show, mais uma vez com um grande exibição, monstrando toda sua elegância, simplicidade e capacidade de nos supreender no processamento de transações e apresentação de resultados.

Desta forma, chegamos ao final de mais post da sessão Para que serve!


 

Espero que você tenha gostado, que as informações compartilhadas aqui possam lhe ajudar a se tornar cada vez um profissional de banco de dados reconhecido e valorizado, um dos papéis na área de tecnologia mais importantes para qualquer empresa.

Reconher o verdadeiro papel de um DBA dentro de sua estrutura, é reconhecer o verdadeiro valor de seus dados e como eles podem se tornar uma infomação valiosa para sua tomada de decisão.

Caso deseje acessar os posts anteriores desta sessão, utilize os links listados abaixo:

Mais uma vez obrigado por sua visita, um forte abraço, nos encontramos em breve.

Até mais.