2011-10-28 5 views
0

実行時に数時間実行され、最終的にサーバーがタイムアウトするというクエリがあります。サブ・セレクト・アンド・ジョイン・クエリでハングする

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.

答えて

0

この変化を試してください:

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 
+0

スマートクエリは、ありがとうございました。しかし、それは同じ効果を持っているようです。 :S – Menelaos

+0

私はこの回答を選択するために省略したことを知りました。 その間に私のクエリの性質が変わったのですが、この答えはそのようなネストされた選択状況のための良い、きれいなオプションです。 – Menelaos

関連する問題