2014-10-14 5 views
0

У меня есть запрос, который берет навсегда.оптимизация запросов mysql, где vs внутреннее соединение

Я не могу найти способ сделать это быстрее. Я искал интернет для оптимизации трюков, но не нашел anythig, что бы сделать это быстрее.

Может быть, свежим взглядом увидеть что-то, что я не :)

Вот запрос:

Select *, sum(collection) as tot 

from 
(
    SELECT PHYS.PHYS_ID, 
     month(PMT.DT_PD) as Month, 
     year(PMT.DT_PD) as Year, 
     PRAC.LOC_ID, 
     sum(ABS(PMT.PMT_AMT)) as collection   

    FROM 
     IDR_ENC ENC, 
     IDR_PHYS_PT_XREF PHY_PT, 
     IDR_PRACT_LOC PRAC, 
     IDR_PMT PMT, 
     IDR_PHYS PHYS, 
     IDR_CHGS CHG 

    where 
     ENC.PT_ID  = PHY_PT.PT_ID AND 
     ENC.ENC_LOC = PRAC.LOC_ID AND 
     PHY_PT.PHYS_ID = PHYS.PHYS_ID AND 
     PHY_PT.PT_ID = CHG.PT_ID AND 
     PMT.CHG_ID  = CHG.CHG_ID AND    
     DATE_FORMAT(PMT.DT_PD, '%Y-%m-%d') >= '2014-01-01' and 
     DATE_FORMAT(PMT.DT_PD, '%Y-%m-%d') <= '2014-03-31' and 
     PRAC.LOC_ID IN (SELECT LOC_ID FROM IDR_PRACT_LOC WHERE LOC_ID != 0) AND 
     PHYS.PHYS_ID in (SELECT PHYS_ID FROM IDR_PHYS WHERE PHYS_ID != 0) AND 
     PMT.TRN_TYP NOT IN ('A', 'B', 'R', 'T') AND 
     CHG.CPT4_CD NOT LIKE 'J%' 

    GROUP BY PHYS.PHYS_ID, month(PMT.DT_PD),year(PMT.DT_PD) 

)TOT_COLL 

group by month,year 
+0

Выполняется ли этот запрос? GROUP BY во внутреннем запросе не содержит PRAC.LOC_ID – Multisync

+0

@Multisync, MySQL не строит об этом по умолчанию. Это означает, что PRAC.LOC_ID принимает произвольное значение из группы строк. Разработчик должен разработать запрос для обеспечения этого. –

+0

@Bill Karwin Спасибо за объяснение – Multisync

ответ

1
  1. GROUP BY во внутреннем запросе не содержит PRAC.LOC_ID
  2. , если это весь запрос, тогда вы можете получить желаемый результат во внутреннем запросе
  3. Вы называете date_format «слишком часто», лучше конвертировать '2014-01-01' и '2014-03-31' в дату (+ индексы на этот столбец, если таковые имеются, будут работать)
  4. PHYS.PHYS_ID в (SELECT PHYS_ID FROM IDR_PHYS WHERE PHYS_ID! = 0) должны быть заменены PHYS.PHYS_ID! = 0
  5. PRAC.LOC_ID IN (SELECT LOC_ID FROM IDR_PRACT_LOC WHERE LOC_ID! = 0) необходимо заменить на PRAC.LOC_ID! = 0
Смежные вопросы