Оптимизировать SQL-запрос - PullRequest
       6

Оптимизировать SQL-запрос

2 голосов
/ 29 января 2010

У меня есть sql, который занимает 7 минут, чтобы выполнить. Он обрабатывает год данных, но я чувствую, что это занимает слишком много времени. У вас есть предложения по его оптимизации?

select count(s.numserviciomedico) AS total 
from Actos a,
    pacientes p,
    Historias h,
    serviciosmedicos s 
where p.codigo=h.codpaciente 
    AND p.codigo=a.codPaciente 
    AND p.codigo = s.codPaciente 
    AND h.codPaciente = a.codPaciente 
    AND a.codpaciente=s.codPaciente 
    AND h.numHistoria = a.numHistoria 
    AND h.numHistoria = s.numHistoria 
    AND a.numHistoria = s.numHistoria 
    AND a.numActo = s.numActo 
    AND h.codSeccion=a.codSeccion 
    and p.codcompañia ='38' 
    and a.codseccion ='9' 
    and (CAST(FLOOR(CAST(a.fecAtencion AS float)) AS datetime) >='20090101') 
    and (CAST(FLOOR(CAST(a.fecAtencion AS float)) AS datetime) <='20091231') 
    and h.modo ='Urgente' 
    and datename(weekday,a.fecatencion)!= 'Sabado' 
    and datename(weekday,a.fecatencion)!= 'Domingo' 
    and CAST(FLOOR(CAST(a.fecAtencion AS float)) AS datetime) NOT IN (
        select fechafestiva   
        from diasfestivos
    )

Ответы [ 2 ]

2 голосов
/ 29 января 2010

Как минимум ...

Изменить это

and (CAST(FLOOR(CAST(a.fecAtencion AS float)) AS datetime) >='20090101') and (CAST(FLOOR(CAST(a.fecAtencion AS float)) AS datetime) <='20091231') 

до

a.fecAtencion >= '20090101' AND a.fecAtencion < '20100101

И использовать «JOIN»

А

CAST(FLOOR(CAST(a.fecAtencion AS float)) AS datetime) NOT IN (select fechafestiva from diasfestivos)

.. быть

NOT EXISTS (SELECT * FROM diasfestivos af WHERE a.fecAtencion >= af.fechafestiva  AND a.fecAtencion < af.fechafestiva + 1)

Предполагается, что на диасфестивах меньше строк, и время там снимать дешевле

1 голос
/ 29 января 2010

Ключевое слово SQL 'IN' обычно является хорошим кандидатом для замены.

И НЕ СУЩЕСТВУЕТ (выберите fechafestiva из diasfestivos, где CAST (FLOOR (CAST (a.fecAtencion AS float)) AS datetime) = fechafestiva)

А что случилось с кастингом на дату и время?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...