Abra o webinar "SELECT ordem de execução da consulta e plano de consulta no MS SQL Server"

Olá novamente!

Colegas, no último dia de janeiro, estamos lançando o curso "MS SQL Server Developer" , em conexão com o qual tivemos uma lição temática em aberto. Nele, falamos sobre como o MS SQL Server executa uma consulta SELECT, discutimos em que ordem e o que é analisado, e também mergulhamos um pouco na leitura do plano de consulta.

Palestrante - Kristina Kucherova , arquiteta de modelo de dados no Sberbank da Rússia.


Objetivos e rota do seminário on-line

Os seguintes objetivos foram definidos no início do webinar:

  1. Veja como o servidor executa a solicitação e por que isso acontece dessa maneira
  2. Aprendendo a ler um plano de consulta.

Para alcançá-los, o professor preparou uma rota simples, mas eficaz:



Por que preciso de um plano de consulta?

O plano de consulta é uma ferramenta muito útil que, infelizmente, muitos desenvolvedores não usam. À primeira vista, pode parecer que não é necessário conhecer a mecânica da solicitação. No entanto, se você entender o que está acontecendo no SQL Server, poderá escrever uma consulta mais eficiente. E isso ajudará muito, por exemplo, durante a otimização.

Como vemos uma consulta SELECT?

Vamos ver como é a consulta SELECT:

SELECT [campo1], [campo2] ...
Quais campos nós escolhemos?
FROM [tabela]
De onde
ONDE [condições]
Onde estão as condições
GRUPO POR [campo1]
Agrupar por campos
TENDO [condições]
Tendo tais e tais condições
PEDIDO POR [campo1]
Ordenação (classificação)

Como entender para onde ir para dados?

A primeira coisa que o servidor tenta entender quando chega uma solicitação é para onde ir para os dados. O comando FROM responde a essa pergunta, porque é aqui que teremos uma lista de tabelas (ou o nome de uma tabela).

Para maior clareza, vamos imaginar que nosso servidor é uma espécie de mordomo, a quem pedimos para nos coletar nas férias. Assim, o mordomo começa a pensar, mas em que armário estão as coisas necessárias (em qual tabela você precisa levar os dados)? E para que nosso mordomo possa concluir facilmente sua tarefa, usamos FROM.



Como entender quais dados levar?

Digamos que o mordomo encontrou o armário certo e o abriu. Mas que coisas levar? Talvez nós estamos indo para uma estação de esqui? Ou talvez em uma praia ensolarada e quente? Para fazer com que nossas coisas correspondam ao clima, o comando WHERE é útil para nós, que define as condições, ou seja, permite filtrar os dados. Se estiver quente, pegamos ardósias, camisas e roupas de banho, se estiver frio - luvas, meias de malha, blusas)).

O próximo passo é anexar esses dados a grupos, o que acontece com GROUP BY (camisetas separadamente, meias separadamente). De acordo com os resultados do agrupamento, mais uma condição pode ser imposta usando HAVING (por exemplo, eliminando coisas não pareadas). No final, adicionamos tudo usando ORDER BY, obtendo a mala finalizada das coisas na saída, ou melhor, um bloco de dados ordenados.



A propósito, há uma nuance, mas consiste no fato de que há uma diferença de quais condições devem ser escritas em WHERE e quais em HAVING. Mas isso é melhor ver no vídeo.

Nós continuamos. O caminho de execução da solicitação é salvo como um plano de solicitação no cache, ou seja, nosso mordomo anota tudo, porque ele é um bom mordomo - e se você quiser repetir seu pedido no próximo ano? E tais planos, em princípio, podem ser muitos.

Tipos de conexões no plano de consulta

Existem três conexões que você pode encontrar em termos de consulta:

  1. Loop aninhado.
  2. Mesclar junção.
  3. Hash join.

Antes de abordar cada um deles com mais detalhes, vamos resumir por que deveríamos ler o plano de consulta. Isso é realmente muito útil, pois você aprenderá:

  • qual índice é usado;
  • em que ordem se juntam;
  • o que é selecionado no buffer;
  • quanto o servidor gasta recursos na operação;
  • qual é a diferença entre um plano hipotético e um real?

Loop aninhado

Digamos que precisamos unir dados de tabelas diferentes. Vamos apresentar essas tabelas como ... uma pequena quantidade de chocolates Skittles e a embalagem completa da M&M.



Ao conectar um tipo Nested Loop, pegamos o doce Skittles e depois pegamos o doce cego do pacote da M&M. Se não encontrarmos um doce da mesma cor (essa é a nossa condição), obtemos o próximo, ou seja, há um busto comum. Como resultado, podemos dizer que a conexão Nested Loop é mais adequada para pequenas quantidades de dados. Obviamente, se houver muitos dados, interromper não é a melhor opção.



Vamos ver como fica no painel SQL:

--drop table skittles --drop table mms --    create table mms (id int identity(1,1), color varchar(25), taste varchar(15)) insert into mms (color, taste) values ('yellow', 'chocolate') insert into mms (color, taste) values ('red', 'nuts') create clustered index IX_mms_color ON mms(color); create table skittles (id int identity(1,1), color varchar(25), taste varchar(15)) create index IX_skittles_id ON skittles(id); create clustered index IX_skittles_color ON skittles(color); insert into skittles (color, taste) values ('red', 'cherry') insert into skittles (color, taste) values ('blue', 'strange') insert into skittles (color, taste) values ('yellow', 'lemon') insert into skittles (color, taste) values ('green', 'apple') insert into skittles (color, taste) values ('orange', 'orange') --    select mms.* from mms join skittles on mms.color = skittles.color select * from mms join skittles on mms.color = skittles.color 



Mesclar junção

Uma conexão é usada para grandes quantidades de dados. Quando você tem uma junção de mesclagem, as duas tabelas têm um índice pelo qual elas podem ser unidas. No caso dos doces, é como se os tivéssemos organizado previamente por cor.

É assim:



 --2 tables 50000 rows, only clustered index by color, color is not unique select COUNT(*) from mms_big join skittles_big on mms_big.color = skittles_big.color 



A junção de mesclagem é boa nos seguintes casos:

  • grandes conjuntos de dados;
  • os mesmos campos de conexão do mesmo tipo;
  • os campos de conexão possuem índices.

Hash join

A junção de hash é usada para grandes quantidades de dados não classificadas. Para ingressar nas tabelas nesse caso, você precisa criar algo que imite o índice.

Exemplo de junção de hash:

 --drop table skittles --drop table mms --    create table mms (id int identity(1,1), color varchar(25), taste varchar(15)) insert into mms (color, taste) values ('yellow', 'chocolate') insert into mms (color, taste) values ('red', 'nuts') insert into mms (color, taste) values ('blue', 'strange') insert into mms (color, taste) values ('green', 'chocolate') insert into mms (color, taste) values ('orange', 'chocolate') create table skittles (id int identity(1,1), color varchar(25), taste varchar(15)) insert into skittles (color, taste) values ('red', 'cherry') insert into skittles (color, taste) values ('blue', 'strange') insert into skittles (color, taste) values ('yellow', 'lemon') insert into skittles (color, taste) values ('green', 'apple') insert into skittles (color, taste) values ('orange', 'orange') --    select * from mms join skittles on mms.color = skittles.color 



Para maior clareza, lembramos nossos doces:



O uso da junção Hash envolve 2 fases de ação:

  1. Compilar - uma tabela de hash é criada na menor tabela. Para cada valor na tabela nº 1, um hash é considerado. O valor é armazenado em uma tabela de hash e o hash calculado é usado como uma chave.
  2. Sonda. Para cada linha da tabela nº 2, o valor do hash é calculado para os campos especificados em junção (operador =). Um hash é pesquisado na tabela de hash, os valores do campo são verificados.







Quando a junção de hash é boa:

  • grande conjunto de dados;
  • sem índices marginais.

Um ponto importante: se não houver memória suficiente, a gravação irá para tempdb - para disco.

Amigos, além do exposto, a lição aberta também incluiu outros pontos interessantes, que são melhor visualizados ao assistir ao vídeo. Sugerimos visitar o dia aberto do curso "MS SQL Server Developer", onde você pode fazer ao professor todas as suas perguntas.

A professora do PS Kristina Kucherova agradece a Jes Schultz Borland por sua apresentação com os Planos de Execução do PASS Summitt: O Segredo para o Sucesso do Ajuste de Consultas, que foi usado na preparação da lição aberta.

Source: https://habr.com/ru/post/pt437828/


All Articles