द्वारा ग्रुप बनाम समूह चुनें, मैं मौजूदा ओरेकल डेटाबेस-संचालित एप्लिकेशन के लिए क्वेरी समय सुधारने की कोशिश कर रहा हूं जो थोड़ा सुस्त चल रहा है। आवेदन कई बड़े प्रश्नों को निष्पादित करता है, जैसे नीचे दिया गया, जिसमें चलाने के लिए एक घंटे लग सकते हैं। DISTINCT
को GROUP BY
क्लॉज के साथ नीचे दी गई क्वेरी में 100 मिनट से 10 सेकंड तक निष्पादन समय को घटा दिया गया है। मेरी समझ यह थी कि SELECT DISTINCT
और GROUP BY
बहुत अधिक तरीके से संचालित होते थे। निष्पादन के समय के बीच इतनी बड़ी असमानता क्यों? बैक एंड पर क्वेरी को कैसे निष्पादित किया जाता है, इसमें अंतर क्या है? क्या ऐसी कोई स्थिति है जहां SELECT DISTINCT
तेजी से चलता है?एसक्यूएल प्रदर्शन:
नोट: निम्न क्वेरी में, WHERE TASK_INVENTORY_STEP.STEP_TYPE = 'TYPE A'
केवल उन तरीकों में से एक का प्रतिनिधित्व करता है जिनके परिणाम फ़िल्टर किए जा सकते हैं।
SELECT DISTINCT
ITEMS.ITEM_ID,
ITEMS.ITEM_CODE,
ITEMS.ITEMTYPE,
ITEM_TRANSACTIONS.STATUS,
(SELECT COUNT(PKID)
FROM ITEM_PARENTS
WHERE PARENT_ITEM_ID = ITEMS.ITEM_ID
) AS CHILD_COUNT
FROM
ITEMS
INNER JOIN ITEM_TRANSACTIONS
ON ITEMS.ITEM_ID = ITEM_TRANSACTIONS.ITEM_ID
AND ITEM_TRANSACTIONS.FLAG = 1
LEFT OUTER JOIN ITEM_METADATA
ON ITEMS.ITEM_ID = ITEM_METADATA.ITEM_ID
LEFT OUTER JOIN JOB_INVENTORY
ON ITEMS.ITEM_ID = JOB_INVENTORY.ITEM_ID
LEFT OUTER JOIN JOB_TASK_INVENTORY
ON JOB_INVENTORY.JOB_ITEM_ID = JOB_TASK_INVENTORY.JOB_ITEM_ID
LEFT OUTER JOIN JOB_TASKS
ON JOB_TASK_INVENTORY.TASKID = JOB_TASKS.TASKID
LEFT OUTER JOIN JOBS
ON JOB_TASKS.JOB_ID = JOBS.JOB_ID
LEFT OUTER JOIN TASK_INVENTORY_STEP
ON JOB_INVENTORY.JOB_ITEM_ID = TASK_INVENTORY_STEP.JOB_ITEM_ID
LEFT OUTER JOIN TASK_STEP_INFORMATION
ON TASK_INVENTORY_STEP.JOB_ITEM_ID = TASK_STEP_INFORMATION.JOB_ITEM_ID
WHERE
TASK_INVENTORY_STEP.STEP_TYPE = 'TYPE A'
ORDER BY
ITEMS.ITEM_CODE
एसक्यूएल: इस उदाहरण
एसक्यूएल DISTINCT
का उपयोग कर तालिकाओं SELECT
में शामिल कॉलम नहीं है और सभी उपलब्ध डेटा का दसवां हिस्सा बारे में परिणाम होगा के सभी शामिल होने के लिए तर्क को दिखाने के लिए प्रदान किया गया GROUP BY
का उपयोग कर:
SELECT
ITEMS.ITEM_ID,
ITEMS.ITEM_CODE,
ITEMS.ITEMTYPE,
ITEM_TRANSACTIONS.STATUS,
(SELECT COUNT(PKID)
FROM ITEM_PARENTS
WHERE PARENT_ITEM_ID = ITEMS.ITEM_ID
) AS CHILD_COUNT
FROM
ITEMS
INNER JOIN ITEM_TRANSACTIONS
ON ITEMS.ITEM_ID = ITEM_TRANSACTIONS.ITEM_ID
AND ITEM_TRANSACTIONS.FLAG = 1
LEFT OUTER JOIN ITEM_METADATA
ON ITEMS.ITEM_ID = ITEM_METADATA.ITEM_ID
LEFT OUTER JOIN JOB_INVENTORY
ON ITEMS.ITEM_ID = JOB_INVENTORY.ITEM_ID
LEFT OUTER JOIN JOB_TASK_INVENTORY
ON JOB_INVENTORY.JOB_ITEM_ID = JOB_TASK_INVENTORY.JOB_ITEM_ID
LEFT OUTER JOIN JOB_TASKS
ON JOB_TASK_INVENTORY.TASKID = JOB_TASKS.TASKID
LEFT OUTER JOIN JOBS
ON JOB_TASKS.JOB_ID = JOBS.JOB_ID
LEFT OUTER JOIN TASK_INVENTORY_STEP
ON JOB_INVENTORY.JOB_ITEM_ID = TASK_INVENTORY_STEP.JOB_ITEM_ID
LEFT OUTER JOIN TASK_STEP_INFORMATION
ON TASK_INVENTORY_STEP.JOB_ITEM_ID = TASK_STEP_INFORMATION.JOB_ITEM_ID
WHERE
TASK_INVENTORY_STEP.STEP_TYPE = 'TYPE A'
GROUP BY
ITEMS.ITEM_ID,
ITEMS.ITEM_CODE,
ITEMS.ITEMTYPE,
ITEM_TRANSACTIONS.STATUS
ORDER BY
ITEMS.ITEM_CODE
यहाँ DISTINCT
का उपयोग कर क्वेरी के लिए ओरेकल क्वेरी योजना है:
यहाँ GROUP BY
का उपयोग कर क्वेरी के लिए ओरेकल क्वेरी योजना है:
'समूह द्वारा' के साथ क्वेरी दिखाएं। –
मेरे पास आपके प्रश्न का उत्तर नहीं है, लेकिन मुझे उम्मीद है कि दोनों प्रश्नों को देखते हुए, उनकी व्याख्या योजनाएं और लॉजिकल जीईटी की संख्या समझने में मदद कर सकती है । – symcbean
SQL सर्वर में आप क्वेरी निष्पादन योजनाएं प्राप्त कर सकते हैं .. क्या आप ओरेकल में कुछ समान प्राप्त कर सकते हैं? यह आपको बताएगा कि अंतर कहां था। –