Ir para conteúdo
Fórum Script Brasil
  • 0

Perfomance na consulta SQL


boxpaulomuniz@gmail.com

Pergunta

 

Tenho uma dúvida se existe um comando SQL para medir o tempo gasto para fazer a consulta SQL. Segue um estudo de caso onde faço um exemplo. Se alguém souber compartilha aqui

 

Temos uma tabela Funcionarios com as seguintes atributos
DESCRIBE Funcionarios;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| idFuncionario | int          | YES  |     | NULL    |       |
| nome          | varchar(100) | YES  |     | NULL    |       |
| email         | varchar(200) | YES  |     | NULL    |       |
| sexo          | varchar(10)  | YES  |     | NULL    |       |
| departamento  | varchar(100) | YES  |     | NULL    |       |
| admissao      | varchar(10)  | YES  |     | NULL    |       |
| salario       | int          | YES  |     | NULL    |       |
| cargo         | varchar(100) | YES  |     | NULL    |       |
| idRegiao      | int          | YES  |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+

Em um QUANT de 976 funcionarios
SELECT COUNT(*) FROM FUNCIONARIOS;
+----------+
| COUNT(*) |
+----------+
|      976 |
+----------+

Sendo distruibuido da seguinte maneira
SELECT SEXO, COUNT(*) FROM FUNCIONARIOS GROUP BY SEXO;
+-----------+----------+
| SEXO      | COUNT(*) |
+-----------+----------+
| Feminino  |      491 |
| Masculino |      485 |
+-----------+----------+

Contando funcionários por departamento;
Contando quantos funcionarios tem em cada departamento
SELECT COUNT(*), DEPARTAMENTO FROM FUNCIONARIOS 
GROUP BY DEPARTAMENTO
ORDER BY 1;
+----------+--------------+
| COUNT(*) | DEPARTAMENTO |
+----------+--------------+
|       21 | Filmes       |
|       36 | Joalheria    |
|       37 | Música       |
|       38 | Crianças     |
|       39 | Ferramentas  |
|       40 | Esporte      |
|       41 | Brinquedos   |
|       43 | Calçados     |
|       46 | Automotivo   |
|       46 | Alimentícios |
|       46 | Bebês        |
|       46 | Saúde        |
|       47 | Industrial   |
|       47 | Jardim       |
|       47 | Books        |
|       48 | Outdoors     |
|       49 | Games        |
|       49 | Eletronicos  |
|       52 | Computadores |
|       52 | Lar          |
|       53 | Roupas       |
|       53 | Beleza       |
+----------+--------------+

-- Contando quantos funcionarios tem nos departamentos ROUPAS e FILMES
SELECT DEPARTAMENTO, COUNT(*)AS QUANT FROM FUNCIONARIOS 
WHERE DEPARTAMENTO='ROUPAS' OR DEPARTAMENTO='FILMES'
GROUP BY DEPARTAMENTO;
+--------------+-------+
| DEPARTAMENTO | QUANT |
+--------------+-------+
| Roupas       |    53 |
| Filmes       |    21 |
+--------------+-------+
2 rows in set (0.00 sec)

--Queremos uma consulta que traga os funcionarios que trabalhem
--no departamento de "Filmes" OU no departamento de "Roupas"

--Temos duas opções:

SELECT NOME,DEPARTAMENTO FROM FUNCIONARIOS 
WHERE DEPARTAMENTO='ROUPAS' OR DEPARTAMENTO='FILMES'
ORDER BY DEPARTAMENTO;

+------------+--------------+
| NOME       | DEPARTAMENTO |
+------------+--------------+
| Cooper     | Filmes       |
| Spencer    | Filmes       |
| Kelley     | Filmes       |
| Roberts    | Filmes       |
| Gonzales   | Filmes       |
| Little     | Filmes       |
| Snyder     | Filmes       |
| Gordon     | Filmes       |
| Griffin    | Filmes       |
| Warren     | Filmes       |
| Arnold     | Filmes       |
| Clark      | Filmes       |
| Johnson    | Filmes       |
| Walker     | Filmes       |
| Elliott    | Filmes       |
| Weaver     | Filmes       |
| Gomez      | Filmes       |
| Knight     | Filmes       |
| Rice       | Filmes       |
| Price      | Filmes       |
| Bishop     | Filmes       |
| Rose       | Roupas       |
| Richardson | Roupas       |
| Fisher     | Roupas       |
| Berry      | Roupas       |
| Arnold     | Roupas       |
| Jordan     | Roupas       |
| Wright     | Roupas       |
| Gonzales   | Roupas       |
| Young      | Roupas       |
| White      | Roupas       |
| Marshall   | Roupas       |
| Boyd       | Roupas       |
| Gray       | Roupas       |
| Gomez      | Roupas       |
| Williamson | Roupas       |
| Richards   | Roupas       |
| Black      | Roupas       |
| Kim        | Roupas       |
| James      | Roupas       |
| Taylor     | Roupas       |
| Lynch      | Roupas       |
| Price      | Roupas       |
| Greene     | Roupas       |
| Alexander  | Roupas       |
| Phillips   | Roupas       |
| Ortiz      | Roupas       |
| Reid       | Roupas       |
| Price      | Roupas       |
| Hawkins    | Roupas       |
| Roberts    | Roupas       |
| Hill       | Roupas       |
| Oliver     | Roupas       |
| Murray     | Roupas       |
| Richards   | Roupas       |
| Cunningham | Roupas       |
| Perkins    | Roupas       |
| Olson      | Roupas       |
| Freeman    | Roupas       |
| James      | Roupas       |
| Sims       | Roupas       |
| Nguyen     | Roupas       |
| Washington | Roupas       |
| Ferguson   | Roupas       |
| Elliott    | Roupas       |
| Roberts    | Roupas       |
| Watson     | Roupas       |
| Kelley     | Roupas       |
| Day        | Roupas       |
| Rice       | Roupas       |
| Marshall   | Roupas       |
| Burton     | Roupas       |
| Richards   | Roupas       |
| Knight     | Roupas       |
+------------+--------------+
--ou poderemos usar esta outra opção mas a resposta da query é mais lenta

SELECT NOME,DEPARTAMENTO FROM FUNCIONARIOS
WHERE DEPARTAMENTO='FILMES' OR DEPARTAMENTO='ROUPAS';

-- como temos mais funcionarios no departamento "Roupas" devemos usar
-- a clasula WHERE primeiro com o valor de Departamento "Roupas" já que
-- a condição é OR. Ou seja a primeira opção a performance da consulta é melhor
--(mais rápida)

--Suponhamos agora que o gestor de marketing da empresa pediu a lista das funcionarias 
--(AS) = FEMININO que trabalhem no departamento de filmes OU no departamento lar. 
--Ele necessita enviar um email para as colaboradoras desses dois setores.

 -- Contando quantos tem de cada sexo
SELECT COUNT(*) AS QUANT , SEXO FROM FUNCIONARIOS
GROUP BY SEXO ;
+-------+-----------+
| QUANT | SEXO      |
+-------+-----------+
|   491 | Feminino  |
|   485 | Masculino |
+-------+-----------+

--Fazendo a contagem de funcionarios do departamento Filmes e Lar

SELECT DEPARTAMENTO, COUNT(*) AS QUANT FROM FUNCIONARIOS
WHERE  DEPARTAMENTO='FILMES' OR DEPARTAMENTO='LAR'
GROUP BY DEPARTAMENTO
ORDER BY 1;
+--------------+-------+
| DEPARTAMENTO | QUANT |
+--------------+-------+
| Filmes       |    21 |
| Lar          |    52 |
+--------------+-------+
2 rows in set (0.00 sec)

-- Fazendo a contagem das mulheres do departamento de lar e filmes
SELECT DEPARTAMENTO,SEXO, COUNT(*) AS QUANT FROM FUNCIONARIOS 
WHERE SEXO='feminino' AND (DEPARTAMENTO='LAR' OR DEPARTAMENTO ='FILMES')
GROUP BY DEPARTAMENTO
ORDER BY 1;
+--------------+----------+-------+
| DEPARTAMENTO | SEXO     | QUANT |
+--------------+----------+-------+
| Filmes       | Feminino |     9 |
| Lar          | Feminino |    32 |
+--------------+----------+-------+

--Como temos mais mulheres que departamentos e vamos usar na clausula AND 
--esse valor vem depois na consulta para verificar o sexo somente depois de 
--filtrado o departamentos Filmes e Lar 
--na expressão de consulta OR é o contrario já que temos mais mulheres no departamento
--lar que no de filmes

SELECT NOME,EMAIL,DEPARTAMENTO,SEXO FROM FUNCIONARIOS
WHERE (DEPARTAMENTO ='LAR' OR DEPARTAMENTO='FILMES') AND SEXO ='FEMININO' 
ORDER BY DEPARTAMENTO;
+------------+-----------------------------------+--------------+----------+
| NOME       | EMAIL                             | DEPARTAMENTO | SEXO     |
+------------+-----------------------------------+--------------+----------+
| Little     | dlittlecp@usatoday.com            | Filmes       | Feminino |
| Cooper     | icooper85@w3.org                  | Filmes       | Feminino |
| Gordon     | egordon7k@yellowbook.com          | Filmes       | Feminino |
| Warren     | awarrenht@addthis.com             | Filmes       | Feminino |
| Gomez      | tgomezm8@ucoz.ru                  | Filmes       | Feminino |
| Knight     | dknightm9@quantcast.com           | Filmes       | Feminino |
| Rice       | jricemp@columbia.edu              | Filmes       | Feminino |
| Bishop     | kbishoppi@ovh.net                 | Filmes       | Feminino |
| Walker     | swalkerr0@sina.com.cn             | Filmes       | Feminino |
| Freeman    | gfreeman74@bloomberg.com          | Lar          | Feminino |
| Gibson     | bgibson8o@pen.io                  | Lar          | Feminino |
| Crawford   | mcrawford8u@parallels.com         | Lar          | Feminino |
| Campbell   | pcampbell9b@istockphoto.com       | Lar          | Feminino |
| Gonzales   | jgonzales9s@sourceforge.net       | Lar          | Feminino |
| Payne      | jpayneal@comsenz.com              | Lar          | Feminino |
| Cooper     | scooperb1@cmu.edu                 | Lar          | Feminino |
| Chapman    | schapmanb6@nhs.uk                 | Lar          | Feminino |
| Williams   | swilliamsbc@bing.com              | Lar          | Feminino |
| Morales    | dmoralesbl@mit.edu                | Lar          | Feminino |
| Berry      | jberrybr@discuz.net               | Lar          | Feminino |
| Porter     | vporterp@yelp.com                 | Lar          | Feminino |
| Cox        | ncoxe1@1und1.de                   | Lar          | Feminino |
| Morris     | rmorriseu@yahoo.com               | Lar          | Feminino |
| Walker     | kwalkerf2@vinaora.com             | Lar          | Feminino |
| Myers      | dmyersfq@amazon.com               | Lar          | Feminino |
| Olson      | folsong9@acquirethisname.com      | Lar          | Feminino |
| Evans      | aevansgg@wordpress.org            | Lar          | Feminino |
| Owens      | cowensq@shareasale.com            | Lar          | Feminino |
| Mendoza    | rmendozajl@g.co                   | Lar          | Feminino |
| Ferguson   | gfergusonka@geocities.jp          | Lar          | Feminino |
| Gonzales   | rgonzaleskv@meetup.com            | Lar          | Feminino |
| Burke      | eburkel4@newsvine.com             | Lar          | Feminino |
| Murray     | cmurraylx@icio.us                 | Lar          | Feminino |
| Cruz       | rcruz10@blinklist.com             | Lar          | Feminino |
| Washington | jwashington21@squidoo.com         | Lar          | Feminino |
| Gilbert    | hgilbert29@xrea.com               | Lar          | Feminino |
| Carpenter  | rcarpenterov@pagesperso-orange.fr | Lar          | Feminino |
| Montgomery | rmontgomery3n@chicagotribune.com  | Lar          | Feminino |
| Jones      | djonesq1@tamu.edu                 | Lar          | Feminino |
| Diaz       | sdiaz64@disqus.com                | Lar          | Feminino |
| Sanchez    | tsanchezr7@lycos.com              | Lar          | Feminino |
+------------+-----------------------------------+--------------+----------+
41 rows in set (0.00 sec)

--Para a consulta de tornar mais rápida pesquisamos primeiro a opção de menos
-- ocorrencia que no caso são os Departamentos (73 ocorrencias=21+52)
-- WHERE (DEPARTAMENTO ='LAR' OR DEPARTAMENTO='FILMES') AND SEXO ='FEMININO'
+--------------+-------+
| DEPARTAMENTO | QUANT |
+--------------+-------+
| Filmes       |    21 |
| Lar          |    52 |
+--------------+-------+
 e depois o Sexo já filtrado (41 = 9+32) mulheres com a expressão WHERE SEXO ='FEMININO'
 +--------------+----------+-------+
| DEPARTAMENTO | SEXO     | QUANT |
+--------------+----------+-------+
| Filmes       | Feminino |     9 |
| Lar          | Feminino |    32 |
+--------------+----------+-------+
-- e depois concatenamos com AND SEXO ='FEMININO' 

--Se usassemos a query abaixo encontrariamos o mesmo resultado, 
--porém com uma pior performance, já que ele ia percorre 491 registros do sexo
--e só depois ia checar a segunda condição

SELECT NOME,EMAIL,DEPARTAMENTO,SEXO FROM FUNCIONARIOS
WHERE SEXO ='FEMININO' AND (DEPARTAMENTO ='LAR' OR DEPARTAMENTO='FILMES')
ORDER BY DEPARTAMENTO;


--Diante da situação minha dúvida é:
--Não existe um comando na consulta do SQL que possamos calcular o tempo
--que o comando gera a consulta? 
--Qual seria?

 

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...