Jump to content
Fórum Script Brasil
  • 0

Perfomance na consulta SQL


Question

 

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     | [email protected]            | Filmes       | Feminino |
| Cooper     | [email protected]                  | Filmes       | Feminino |
| Gordon     | [email protected]          | Filmes       | Feminino |
| Warren     | [email protected]             | Filmes       | Feminino |
| Gomez      | [email protected]                  | Filmes       | Feminino |
| Knight     | [email protected]           | Filmes       | Feminino |
| Rice       | [email protected]              | Filmes       | Feminino |
| Bishop     | [email protected]                 | Filmes       | Feminino |
| Walker     | [email protected]             | Filmes       | Feminino |
| Freeman    | [email protected]          | Lar          | Feminino |
| Gibson     | [email protected]                  | Lar          | Feminino |
| Crawford   | [email protected]         | Lar          | Feminino |
| Campbell   | [email protected]       | Lar          | Feminino |
| Gonzales   | [email protected]       | Lar          | Feminino |
| Payne      | [email protected]              | Lar          | Feminino |
| Cooper     | [email protected]                 | Lar          | Feminino |
| Chapman    | [email protected]                 | Lar          | Feminino |
| Williams   | [email protected]              | Lar          | Feminino |
| Morales    | [email protected]                | Lar          | Feminino |
| Berry      | [email protected]               | Lar          | Feminino |
| Porter     | [email protected]                 | Lar          | Feminino |
| Cox        | [email protected]                   | Lar          | Feminino |
| Morris     | [email protected]               | Lar          | Feminino |
| Walker     | [email protected]             | Lar          | Feminino |
| Myers      | [email protected]               | Lar          | Feminino |
| Olson      | [email protected]      | Lar          | Feminino |
| Evans      | [email protected]            | Lar          | Feminino |
| Owens      | [email protected]            | Lar          | Feminino |
| Mendoza    | [email protected]                   | Lar          | Feminino |
| Ferguson   | [email protected]          | Lar          | Feminino |
| Gonzales   | [email protected]            | Lar          | Feminino |
| Burke      | [email protected]             | Lar          | Feminino |
| Murray     | [email protected]                 | Lar          | Feminino |
| Cruz       | [email protected]             | Lar          | Feminino |
| Washington | [email protected]         | Lar          | Feminino |
| Gilbert    | [email protected]               | Lar          | Feminino |
| Carpenter  | [email protected] | Lar          | Feminino |
| Montgomery | [email protected]  | Lar          | Feminino |
| Jones      | [email protected]                 | Lar          | Feminino |
| Diaz       | [email protected]                | Lar          | Feminino |
| Sanchez    | [email protected]              | 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 to post
Share on other sites

1 answer to this question

Recommended Posts

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      148692
    • Total Posts
      644524
×
×
  • Create New...