Запрос с дополнительным выбором при соединении зависает - PullRequest
0 голосов
/ 28 октября 2011

У меня есть следующий запрос, который при выполнении просто запускается в течение нескольких часов, а время ожидания сервера истекает.

SELECT l.mloc_id, COUNT( l.tabc_id ) , l.tabc_id, e.establishment_id, e.name, l.LocationName, l.naics, l.cuisine, l.cuisine2, l.service, l.www, l.owner, l.email, l.status
FROM vg_ydrink2.m_loc AS l
JOIN vg_ydk.permit_beverage AS pb ON ( l.tabc_id = pb.permit_code
AND pb.create_date = ( 
SELECT MAX( create_date ) 
FROM vg_ydk.permit_beverage
WHERE permit_code = l.tabc_id ) ) 
JOIN vg_ydk.establishment AS e ON ( pb.establishment_id = e.establishment_id ) 
GROUP BY l.mloc_id
ORDER BY  `l`.`tabc_id` ASC 
LIMIT 1 , 30

Об ошибках не сообщается.Он просто никогда не завершится.

Проблема заключается в дополнительном выборе, потому что при его удалении запрос выполняется без проблем.Я также не думаю, что это групповая функция, вызывающая проблему, потому что я пытался сохранить подзапрос, но удалял MAX, и это тоже не сработало.

Есть мысли?Заранее спасибо.

*** РЕДАКТИРОВАТЬ: Немного поиграв с индексом create_date, я понял, что из-за природы его значений его мощность постоянно очень мала.По этой причине он не обрабатывается запросом как индекс, и в результате постоянно загружается слишком много строк.С тех пор я полностью изменил запрос, так что это больше не проблема.Если кто-то сталкивался с подобной проблемой, убедитесь, что используемое поле проиндексировано правильно.При необходимости проанализируйте / оптимизируйте / отремонтируйте вашу таблицу.

M.

1 Ответ

0 голосов
/ 28 октября 2011

Попробуйте этот вариант:

select l.mloc_id,
    COUNT(l.tabc_id),
    l.tabc_id,
    e.establishment_id,
    e.name,
    l.LocationName,
    l.naics,
    l.cuisine,
    l.cuisine2,
    l.service,
    l.www,
    l.owner,
    l.email,
    l.status
from vg_ydrink2.m_loc as l
inner join (
    select permit_code,
        max(create_date) as MaxCreateDate
    from vg_ydk.permit_beverage
    group by permit_code
    ) pbm on l.tabc_id = pbm.permit_code
inner join vg_ydk.permit_beverage as pb on pbm.permit_code = pb.permit_code
    and pbm.MaxCreateDate = pb.create_date
inner join vg_ydk.establishment as e on pb.establishment_id = e.establishment_id
group by l.mloc_id
order by `l`.`tabc_id` asc 
LIMIT 1,
    30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...