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?