किसी भी प्रश्न के साथ, सबसे कुशल तरीका "यह निर्भर करता है" है। खेल में कई चर हैं - तालिकाओं में पंक्तियों की संख्या, पंक्ति की लंबाई, क्या सूचकांक मौजूद हैं, सर्वर पर रैम आदि।
इस तरह की समस्या से निपटने का सबसे अच्छा तरीका है (सोच रखरखाव और दक्षता के लिए एक व्यापक दृष्टिकोण) सीटीई का उपयोग करना है, जो आपको एक अस्थायी परिणाम बनाने और अपनी पूरी क्वेरी में उस परिणाम का पुन:उपयोग करने की अनुमति देता है। सीटीई कीवर्ड के साथ का उपयोग करते हैं, और अनिवार्य रूप से उर्फ परिणाम को एक तालिका के रूप में उपयोग करते हैं, ताकि आप इसके खिलाफ कई बार शामिल हो सकें:
WITH user_memberships AS (
SELECT *
FROM memberships
WHERE user_id = ${id}
), user_apps AS (
SELECT *
FROM apps
INNER JOIN user_memberships
ON user_memberships.team_id = apps.team_id
), user_collections AS (
SELECT *
FROM collections
INNER JOIN user_memberships
ON user_memberships.team_id = collections.team_id
), user_webhooks AS (
SELECT *
FROM webhooks
LEFT OUTER JOIN user_collections ON user_collections.id = webhooks.collection_id
INNER JOIN user_memberships
ON user_memberships.team_id = webhooks.team_id
OR user_memberships.team_id = user_collections.team_id
)
SELECT events.*
FROM events
WHERE app_id IN (SELECT id FROM user_apps)
OR collection_id IN (SELECT id FROM user_collections)
OR membership_id IN (SELECT id FROM user_memberships)
OR team_id IN (SELECT team_id FROM user_memberships)
OR user_id = ${id}
OR webhook_id IN (SELECT id FROM user_webhooks)
;
इसे इस तरह करने के फायदे हैं:
- प्रत्येक सीटीई उचित जॉइन पर एक इंडेक्स का लाभ उठा सकता है और जटिल विधेय की एक श्रृंखला को हल करने के लिए निष्पादन योजनाकार प्रयास करने के बजाय, उस सबसेट के लिए तेजी से परिणाम लौटा सकता है
- सीटीई को व्यक्तिगत रूप से बनाए रखा जा सकता है, जिससे सबसेट के साथ समस्या निवारण करना आसान हो जाता है
- आप DRY सिद्धांत का उल्लंघन नहीं कर रहे हैं
- यदि CTE का मूल्य क्वेरी के बाहर है, तो आप इसे एक संग्रहीत कार्यविधि में स्थानांतरित कर सकते हैं और इसके बजाय इसका संदर्भ दे सकते हैं