كيف يمكنني تحسين هذا الاستعلام؟
سؤال
كيف يمكنني تحسين هذا الاستعلام؟يبدو أنه يجب أن تكون هناك طريقة أسهل بكثير للقيام بذلك.الهدف هو أنه سيظل من الممكن تحويله بسهولة إلى بيان حذف.
SELECT * FROM team
WHERE team_id IN (
SELECT team_id
FROM (
SELECT team.team_id, (
SELECT COUNT(*)
FROM signup
WHERE signup.team_id = team.team_id
) AS members
FROM team, schedule, event
WHERE team.schedule_id = schedule.schedule_id
AND schedule.event_id = event.event_id
AND event.event_id =183) AS t
WHERE members = 0
)
المحلول
نظرة سريعة على هذا الاستعلام تعطيني ما يلي:
select
t.*
from
team t
inner join schedule s on t.schedule_id = s.schedule_id
inner join event e on s.event_id = e.event_id
left outer join signup sp on t.team_id = sp.team_id
where
e.event_id = 183
and sp.team_id is null
يبدو أنك تحاول العثور على جميع الفرق المشاركة في حدث ما ولكنها ليست في جدول الاشتراك.هل هذا دقيق؟
أيضًا، أردت أن أشير إلى أنه سيكون من الأسرع إجراء عمليات الانضمام ثم مجموعة من الاستعلامات الفرعية، خاصة إذا كانت الاستعلامات الفرعية تعتمد على كل صف (في حالتك، فهي تفعل ذلك).
هتافات،
اريك
نصائح أخرى
وتعليقا على الاستعلام اريك في هذا الموضوع، أود أن أوصي (من خلفيتي MSSQLSERVER) لاستخدام الاختيار الوجودي بدلا من ذلك. القيام بذلك (1) يجعل نيتك أكثر وضوحا و(2) يعطي محسن الفرصة لوقف دراسة لteam_id مطابقة بعد العثور على أول واحد (منذ> = 1 الصف مطابقة يتسبب في الاختيار وجوديا على أنها كاذبة). منها مثلا.
وحدد ر. * من عند فريق ر انضمام الداخلية الجدول الزمني الصورة على t.schedule_id = s.schedule_id انضمام الداخلية الإلكترونية الحدث على s.event_id = e.event_id أين e.event_id = 183 وليس موجودا (حدد * من الاشتراك فيها team_id = t.team_id)
ولكن ربما هناك تحديدا الخلية الأداء الإقتصادي الأداء المخاوف.