[SQL] Avoid full table scan

Syn Gates

Power Member
Estou a tentar optimizar esta querie:

Código:
select a.dept_name, a.SalarioMinimo, a.SalarioMaximo
from
    (select d.dept_name, Min(s.salary)/12 as SalarioMinimo, Max(s.salary)/12 as SalarioMaximo
    from salaries s
    inner join employees e on (e.emp_no = s.emp_no)
    inner join dept_emp de on (de.emp_no = e.emp_no)
    inner join departments d on (d.dept_no = de.dept_no)
    where s.from_date like '1997%' and s.to_date like '1997%'
    group by d.dept_no) a;

Estou a ter um full table scan em s. Tenho 4 indexes criados nesta tabela para:

-emp_no, from_date, to_date -salary, from_date, to_date -salary -salary, from_date

E mesmo assim estou a ter um full table scan. E mais acima tudo isto resulta num a materialized com full table scan também.

Alguém pode dar uma ajuda em como optimizar esta tabela ?

Deixo em baixo duas imagens para me auxiliarem no que posso fazer:

YRtONgL.png


9uxuvJo.png
 
Eu começava por remover esses like e usar um to_date apenas com um YYYY ou um trunc. E talvez criar um índice com a mesma função.
 
- tens um Join a mais (porque é que fazes JOIN com employees?)
- where s.from_date like '1997%' and s.to_date like '1997%' --> para qq coisas como:
Código:
WHERE s.from_date BETWEEN '19970101' AND '19971231'
  and s.to_date BETWEEN '19970101' AND '19971231'

O índices per si não fazem magia! Se usas wildcards e LIKE o que é que o índice vai fazer?! Para que serve um índice?!

Esses LIKE são porreiros para filtrar resultsets de selecções complexas. Para ir à base de dados, funciona sim, mas não para tabelas potencialmente grandes.
 
Última edição:
- tens um Join a mais (porque é que fazes JOIN com employees?)
- where s.from_date like '1997%' and s.to_date like '1997%' --> para qq coisas como:
Código:
WHERE s.from_date BETWEEN '19970101' AND '19971231'
  and s.to_date BETWEEN '19970101' AND '19971231'

O índices per si não fazem magia! Se usas wildcards e LIKE o que é que o índice vai fazer?! Para que serve um índice?!

Esses LIKE são porreiros para filtrar resultsets de selecções complexas. Para ir à base de dados, funciona sim, mas não para tabelas potencialmente grandes.
Os LIKE beneficiam do indice se não começarem por wildcards.

e se apenas o ano interessa, pode usar algo como
Código:
year(s.to_date)=1997
ou
Código:
datepart(year, s.to_date)=1997
A menos que tenhas function indexes, deixas de beneficiar dos indices.
 
Back
Topo