इस लेख में, हम "लागू करें" ऑपरेटर और इसकी विविधताओं पर गौर करेंगे - क्रॉस अप्लाई और आउटर अप्लाई के साथ-साथ उनका उपयोग कैसे किया जा सकता है।
विशेष रूप से, हम सीखेंगे:
- क्रॉस अप्लाई और जॉइन क्लॉज के बीच अंतर
- तालिका-मूल्यांकन कार्यों के साथ SQL क्वेरी के आउटपुट में कैसे शामिल हों
- गतिशील प्रबंधन विचारों और गतिशील प्रबंधन कार्यों को क्वेरी करके प्रदर्शन समस्याओं की पहचान कैसे करें।
लागू खंड क्या है
Microsoft ने SQL सर्वर 2005 में APPLY ऑपरेटर की शुरुआत की। APPLY ऑपरेटर T-SQL JOIN क्लॉज के समान है क्योंकि यह आपको दो तालिकाओं में शामिल होने की अनुमति देता है - उदाहरण के लिए, आप एक आंतरिक तालिका के साथ एक बाहरी तालिका में शामिल हो सकते हैं। APPLY ऑपरेटर एक अच्छा विकल्प है, जब एक तरफ, हमारे पास एक टेबल-मूल्यांकन अभिव्यक्ति होती है जिसे हम प्रत्येक पंक्ति के लिए उस तालिका से मूल्यांकन करना चाहते हैं जो हमारे पास दूसरी तरफ है। तो, बाईं ओर की तालिका की प्रत्येक पंक्ति के लिए दाईं ओर की तालिका को संसाधित किया जाता है। बाईं ओर की तालिका का मूल्यांकन पहले किया जाता है, और फिर अंतिम परिणाम सेट उत्पन्न करने के लिए बाईं ओर की तालिका की प्रत्येक पंक्ति के विरुद्ध दाईं ओर की तालिका का मूल्यांकन किया जाता है। अंतिम परिणाम सेट में दोनों तालिकाओं के सभी कॉलम शामिल हैं।
APPLY ऑपरेटर के दो रूप हैं:
- क्रॉस अप्लाई
- बाहरी आवेदन
क्रॉस अप्लाई
CROSS APPLY INNER JOIN के समान है, लेकिन इसका उपयोग SQL टेबल्स के साथ तालिका-मूल्यांकन कार्यों में शामिल होने के लिए भी किया जा सकता है। CROSS APPLY के अंतिम आउटपुट में तालिका-मूल्यांकन किए गए फ़ंक्शन और SQL तालिका के आउटपुट के बीच मेल खाने वाले रिकॉर्ड होते हैं।
बाहरी आवेदन
OUTER APPLY लेफ्ट जॉइन से मिलता जुलता है, लेकिन इसमें SQL टेबल्स के साथ टेबल-मूल्यांकन कार्यों में शामिल होने की क्षमता है। OUTER APPLY के अंतिम आउटपुट में लेफ्ट-साइड टेबल या टेबल-वैल्यूएटेड फंक्शन के सभी रिकॉर्ड होते हैं, भले ही वे राइट-साइड टेबल या टेबल-वैल्यू फंक्शन के रिकॉर्ड से मेल नहीं खाते हों।
अब, मैं दोनों रूपों को उदाहरणों के साथ समझाता हूँ।
उपयोग के उदाहरण
डेमो सेटअप तैयार करना
एक डेमो सेटअप तैयार करने के लिए, आपको एक डेटाबेस में "कर्मचारी" और "विभाग" नाम की तालिकाएँ बनानी होंगी, जिन्हें हम "डेमोडेटाबेस" कहेंगे। ऐसा करने के लिए, निम्न कोड चलाएँ:
डेमोडाटाबेस का उपयोग करें तालिका बनाएं [डीबीओ]। [कर्मचारी] ( [कर्मचारी नाम] [वचर] (अधिकतम) शून्य, [जन्म तिथि] [दिनांक समय] शून्य, [नौकरी] [वर्चर] (150) शून्य, [ईमेल आईडी] [ वर्चर] (100) न्यूल, [फोन नंबर] [वर्चर](20) न्यूल, [हायरडेट] [डेटटाइम] न्यूल, [डिपार्टमेंटिड] [आईएनटी] न्यूल) GO क्रिएट टेबल [डीबीओ]। [डिपार्टमेंट] ( [डिपार्टमेंटिड] इंट पहचान (1, 1), [DEPARTMENTNAME] [VARCHAR](MAX) NULL ) GO
इसके बाद, दोनों टेबलों में कुछ डमी डेटा डालें। निम्न स्क्रिप्ट "कर्मचारी . में डेटा सम्मिलित करेगी एस "तालिका:
[शीर्षक विस्तृत करें =”पूरी क्वेरी "]
इन्सर्ट [डीबीओ]। (न'1969-01-29T00:00:00.000' तारीख के अनुसार), मुख्य कार्यकारी अधिकारी', N'[email protected]', N'697-555-0142', CAST(N'2009-01- 14T00:00:00.000' DATETIME के रूप में), 1), (N'TERRI LEE DUFFY', CAST(N'1971-08-01T00:00:00.000' as DATETIME), N'Vice President of Engineering', N'example @ sqldat.com', N'819-555-0175', CAST(N'2008-01-31T00:00:00.000' AS DATETIME), NULL), (N'ROBERTO TAMBURELLO', CAST(N'1974-11) -12T00:00:00.000 'दिनांक के अनुसार), इंजीनियरिंग प्रबंधक', N'[email protected]', N'212-555-0187', CAST (N'2007-11-11T00:00:00.000' AS) DATETIME), NULL), (N'ROB Walters', CAST(N'1974-12-23T00:00:00.000' AS DATETIME), N' सीनियर टूल डिज़ाइनर', N'[email protected]', N'612-555-0100', CAST(N'2007-12-05T00:00:00.000' AS DATETIME), NULL), (N'GAIL A ERICKSON ', CAST(N'1952-09-27T00:00:00.000' AS DATETIME), N'DESIGN ENGINEER', N'[email protected]', N'849-555-0139', CAST(N'2008- 01-06T00:00:00.000' AS DATETIME), NULL), (N'JOSSEF H GOLDBERG', CAST(N'1959-03-11T00:00:00.000' AS DATETIME), N'DESIGN ENGINEER', N'example @ sqldat.com', N'122-555-0189', CAST(N'2008-01-24T00:00:00.000' AS DATETIME), NULL), (N'DYLAN A MILLER', CAST(N'1987- 02-24टी00:00:00.000' तारीख के अनुसार), एन'रिसर्च एंड डेवलपमेंट मैनेजर', एन'[email protected]', एन'181-555-0156', कास्ट (एन'2009-02-08T00:00:00.000' के रूप में DATETIME), 3), (N'DIANE L MARGHEIM', CAST(N'1986-06-05T00:00:00.000' AS DATETIME), N'Research and Development Engineer', N'[email protected]', N'815-555-0138', CAST(N'2008-12-29T00:00:00.000' AS DATETIME), 3), (N'GIGI N MATTHEW', CAST(N) '1979-01-21T00:00:00.000' जैसे दिनांक समय), एन'रिसर्च एंड डेवलपमेंट इंजीनियर', N'[email protected]', N'185-555-0186', CAST(N'2009-01-16T00) :00:00.000' AS DATETIME), 3), (N'MICHAEL RAHEEM', CAST(N'1984-11-30T00:00:00.000' as DATETIME), N'Research and Development Manager', N'example@sqldat .com', N'330-555-2568', CAST(N'2009-05-03T00:00:00.000' AS DATETIME), 3)
[/विस्तार]
हमारे “विभाग . में डेटा जोड़ने के लिए “तालिका, निम्न स्क्रिप्ट चलाएँ:
INSERT [DBO].[DEPARTMENT] ([DEPARTMENTID], [DEPARTMENTNAME]) Values (1, N'IT'), (2, N'TECHNICAL'), (3, N'Research and Development')
अब, डेटा को सत्यापित करने के लिए, उस कोड को निष्पादित करें जिसे आप नीचे देख सकते हैं:
चुनें [कर्मचारी], [जन्म तिथि], [नौकरी], [ईमेलआईडी], [फोन नंबर], [नियुक्ति], [डिपार्टमेंट आईडी] [कर्मचारियों] से [डिपार्टमेंट आईडी], [डिपार्टमेंटनाम] [डिपार्टमेंट] से जाएं
यहाँ वांछित आउटपुट है:
तालिका-मूल्यांकन फ़ंक्शन बनाना और परीक्षण करना
जैसा कि मैंने पहले ही उल्लेख किया है, “क्रॉस अप्लाई ” और “बाहरी आवेदन तालिका-मूल्यांकन कार्यों के साथ SQL टेबल्स में शामिल होने के लिए "का उपयोग किया जाता है। इसे प्रदर्शित करने के लिए, "getEmployeeData . नामक एक तालिका-मूल्यांकन फ़ंक्शन बनाएं ।" यह फ़ंक्शन विभाग आईडी . के मान का उपयोग करेगा एक इनपुट पैरामीटर के रूप में कॉलम और सभी कर्मचारियों को संवाददाता विभाग से वापस कर दें।
फ़ंक्शन बनाने के लिए, निम्न स्क्रिप्ट चलाएँ:
CREATE FUNCTION Gettemployeesbydepartment (@DEPARTMENTID INT) रिटर्न @EMPLOYEES TABLE (EMPLOYEENAME VARCHAR (MAX), BIRTHDATE DATETIME, JOBTITLE VARCHAR(150), EMAILID VARCHAR(100), PHONENUMBER VARCDATETIME, MENTID VARCHAR(500), MENTID VARCHAR(500), )) जैसे ही @EMPLOYEES सेलेक्ट A.EMPLOYEENAME, A.BIRTHDATE, A.JOBITLE, A.EMAILID, A.PHONENUMBER, A.HIREDATE, A.DEPARTMENTID from [कर्मचारी] A.DEPARTMENTID =@DEPARTMENTID का चयन करें।
अब, फ़ंक्शन का परीक्षण करने के लिए, हम "1 . पास करेंगे "विभाग आईडी . के रूप में "विभाग के कर्मचारियों को प्राप्त करें " समारोह। ऐसा करने के लिए, नीचे दी गई स्क्रिप्ट को निष्पादित करें:
DEMODATABASEGOSELECT EMPLOYEENAME, BIRTHDATE, JOBTITLE, EMAILID, PHONENUMBER, HIREDATE, DEPARTMENTIDFROM GETEMPLOYEESBYDEPARTMENT (1) का उपयोग करें (1)
आउटपुट इस प्रकार होना चाहिए:
CROSS APPLY का उपयोग करके तालिका-मूल्यांकन फ़ंक्शन के साथ तालिका में शामिल होना
अब, "Getemployeesbydepartment के साथ कर्मचारी तालिका में शामिल होने का प्रयास करें “क्रॉस लागू . का उपयोग करके तालिका-मूल्यांकन फ़ंक्शन . जैसा कि मैंने बताया, क्रॉस अप्लाई ऑपरेटर ज्वाइन क्लॉज के समान है। यह “कर्मचारी . से सभी रिकॉर्ड्स को पॉप्युलेट करेगा ” तालिका जिसके लिए “Getemployeesbydepartment के आउटपुट में मेल खाने वाली पंक्तियाँ हैं .
निम्न स्क्रिप्ट चलाएँ:
चुनें A.[EMPLOYEENAME], A.[BIRTHDATE], A.[JOBITITLE], A.[EMAILID], A.[PHONENUMBER], A.[HIREDATE], B.[DEPARTMENTNAME] DEPARTMENT B से क्रॉस अप्लाई करें GETEMPLOYEESBYDEPARTMENT(B.DEPARTMENTID) A
आउटपुट इस प्रकार होना चाहिए:
OUTER APPLY का उपयोग करके तालिका-मूल्यांकन फ़ंक्शन के साथ तालिका में शामिल होना
अब, "Getemployeesbydepartment के साथ कर्मचारी तालिका में शामिल होने का प्रयास करें। बाहरी आवेदन . का उपयोग करके तालिका-मूल्यांकन फ़ंक्शन . जैसा कि मैंने पहले बताया, बाहरी आवेदन ऑपरेटर "OUTER JOIN . जैसा दिखता है "खंड। यह “कर्मचारी . से सभी रिकॉर्ड्स को पॉप्युलेट करता है ” तालिका और “कर्मचारियों द्वारा विभाग को प्राप्त करें . का आउटपुट "समारोह।
निम्न स्क्रिप्ट चलाएँ:
चुनें A.[EMPLOYEENAME], A.[BIRTHDATE], A.[JOBITITLE], A.[EMAILID], A.[PHONENUMBER], A.[HIREDATE], B.[DEPARTMENTNAME] DEPARTMENT B से बाहरी आवेदन करें GETEMPLOYEESBYDEPARTMENT(B.DEPARTMENTID) A
परिणाम के रूप में आपको यह आउटपुट देखना चाहिए:
गतिशील प्रबंधन कार्यों और विचारों का उपयोग करके प्रदर्शन समस्याओं की पहचान करना
मैं आपको एक अलग उदाहरण दिखाता हूं। यहां, हम देखेंगे कि डायनेमिक मैनेजमेंट फंक्शन और डायनेमिक मैनेजमेंट व्यू का उपयोग करके क्वेरी प्लान और संबंधित क्वेरी टेक्स्ट कैसे प्राप्त करें।
प्रदर्शन उद्देश्यों के लिए, मैंने “SmokeTestResults . नामक एक तालिका बनाई है "डेमोडेटाबेस" में। इसमें एक अनुप्रयोग धूम्रपान परीक्षण के परिणाम शामिल हैं। आइए कल्पना करें कि, गलती से, एक डेवलपर "SmokeTestResults से डेटा को पॉप्युलेट करने के लिए SQL क्वेरी निष्पादित करता है। ” फ़िल्टर जोड़े बिना, जो डेटाबेस के प्रदर्शन को काफी कम कर देता है।
एक डीबीए के रूप में, हमें संसाधन-भारी क्वेरी की पहचान करने की आवश्यकता है। ऐसा करने के लिए, हम “sys.dm_exec_requests . का उपयोग करेंगे " देखें और "sys.dm_exec_sql_text "समारोह।
“Sys.dm_exec_requests “एक गतिशील प्रबंधन दृश्य है जो निम्नलिखित महत्वपूर्ण विवरण प्रदान करता है जिसका उपयोग हम संसाधन-खपत क्वेरी की पहचान करने के लिए कर सकते हैं:
- सत्र आईडी
- सीपीयू समय
- प्रतीक्षा प्रकार
- डेटाबेस आईडी
- पढ़ता है (भौतिक)
- लिखता है (भौतिक)
- तार्किक पढ़ता है
- एसक्यूएल हैंडल
- प्लान हैंडल
- क्वेरी स्थिति
- कमांड
- लेन-देन आईडी
“sys.dm_exec_sql_text ” एक गतिशील प्रबंधन फ़ंक्शन है जो SQL हैंडल . को स्वीकार करता है एक इनपुट पैरामीटर के रूप में और निम्नलिखित विवरण प्रदान करता है:
- डेटाबेस आईडी
- ऑब्जेक्ट आईडी
- एन्क्रिप्टेड है
- एसक्यूएल क्वेरी टेक्स्ट
अब, ASAP डेटाबेस पर कुछ तनाव उत्पन्न करने के लिए निम्नलिखित क्वेरी चलाते हैं। निम्नलिखित क्वेरी निष्पादित करें:
ASAP GO TSID, USERID, EXECUTIONID, EX_RESULTFILE, EX_TESTDATAFILE, EX_ZIPFILE, EX_STARTTIME, EX_ENDTIME, EX_REMARKS फ्रॉम [ASAP] का उपयोग करें।[DBO]।[SMOKETESTRESULTS]
SQL सर्वर एक सत्र आईडी "66" आवंटित करता है और क्वेरी निष्पादन शुरू करता है। निम्न चित्र देखें:
अब, समस्या का निवारण करने के लिए, हमें डेटाबेस आईडी, लॉजिकल रीड्स, . की आवश्यकता है एसक्यूएल क्वेरी, कमांड, सेशन आईडी, प्रतीक्षा प्रकार और SQL हैंडल . जैसा कि मैंने उल्लेख किया है, हम डेटाबेस आईडी, लॉजिकल रीड्स, कमांड, सत्र आईडी, प्रतीक्षा प्रकार प्राप्त कर सकते हैं और SQL हैंडल "sys.dm_exec_requests" से। SQL क्वेरी प्राप्त करने के लिए , हमें “sys.dm_exec_sql_text. . का उपयोग करना चाहिए " यह एक गतिशील प्रबंधन कार्य है, इसलिए "sys.dm_exec_requests में शामिल होने की आवश्यकता होगी। "sys.dm_exec_sql_text . के साथ क्रॉस अप्लाई का उपयोग करके।
नई क्वेरी संपादक विंडो में, निम्न क्वेरी चलाएँ:
चुनें B.TEXT, A.WAIT_TYPE, A.LAST_WAIT_TYPE, A.COMMAND, A.SESSION_ID, CPU_TIME, A.BLOCKING_SESSION_ID, A.LOGICAL_READS FROM SYS.DM_EXEC_REQUESTS A CROSS APPLY_SQL_T. /पूर्व>इसे निम्नलिखित आउटपुट देना चाहिए:
जैसा कि आप उपरोक्त स्क्रीनशॉट में देख सकते हैं, क्वेरी ने प्रदर्शन समस्या की पहचान करने के लिए आवश्यक सभी जानकारी लौटा दी।
अब, क्वेरी टेक्स्ट के अतिरिक्त, हम निष्पादन योजना प्राप्त करना चाहते हैं जिसका उपयोग प्रश्न में क्वेरी को निष्पादित करने के लिए किया गया था। ऐसा करने के लिए, हम "sys.dm_exec_query_plan" का उपयोग करेंगे समारोह।
“sys.dm_exec_query_plan ” एक गतिशील प्रबंधन कार्य है जो एक योजना संभाल . को स्वीकार करता है एक इनपुट पैरामीटर के रूप में और निम्नलिखित विवरण प्रदान करता है:
- डेटाबेस आईडी
- ऑब्जेक्ट आईडी
- एन्क्रिप्टेड है
- एक्सएमएल प्रारूप में एसक्यूएल क्वेरी योजना
क्वेरी निष्पादन योजना को पॉप्युलेट करने के लिए, हमें "sys.dm_exec_requests में शामिल होने के लिए CROSS APPLY का उपयोग करना चाहिए। ” और “sys.dm_exec_query_plan. "
नई क्वेरी संपादक विंडो खोलें और निम्न क्वेरी निष्पादित करें:
चुनें B.TEXT, A.WAIT_TYPE, A.LAST_WAIT_TYPE, A.COMMAND, A.SESSION_ID, CPU_TIME, A.BLOCKING_SESSION_ID, A.LOGICAL_READS, C.QUERY_PLAN SYS.DM_EXEC_REQUESTS से एक CROSS अनुरोध। SQL_HANDLE) B CROSS APPLY SYS.DM_EXEC_QUERY_PLAN (A.PLAN_HANDLE) Cआउटपुट इस प्रकार होना चाहिए:
अब, जैसा कि आप देख सकते हैं, क्वेरी योजना डिफ़ॉल्ट रूप से XML स्वरूप में उत्पन्न होती है। इसे ग्राफ़िकल प्रतिनिधित्व के रूप में खोलने के लिए, query_plan . में XML आउटपुट पर क्लिक करें स्तंभ जैसा कि ऊपर की छवि में दिखाया गया है। एक बार जब आप XML आउटपुट पर क्लिक करते हैं, तो निष्पादन योजना एक नई विंडो में खुल जाएगी जैसा कि निम्न छवि में दिखाया गया है:
गतिशील प्रबंधन दृश्यों और कार्यों का उपयोग करके अत्यधिक खंडित सूचकांकों वाली तालिकाओं की सूची प्राप्त करना
आइए एक और उदाहरण देखें। मैं उन सूचकांकों के साथ तालिकाओं की एक सूची प्राप्त करना चाहता हूं जिनमें किसी दिए गए डेटाबेस में 50% या अधिक विखंडन है। इन तालिकाओं को पुनः प्राप्त करने के लिए, हमें "sys.dm_db_index_physical_stats का उपयोग करना होगा। " देखें और "sys.tables "समारोह।
“Sys.tables ” एक गतिशील प्रबंधन दृश्य है जो विशिष्ट डेटाबेस पर तालिकाओं की एक सूची तैयार करता है।
“sys.dm_db_index_physical_stats "एक गतिशील प्रबंधन फ़ंक्शन है जो निम्नलिखित इनपुट मापदंडों को स्वीकार करता है:
- डेटाबेस आईडी
- ऑब्जेक्ट आईडी
- इंडेक्स आईडी
- विभाजन संख्या
- मोड
यह निर्दिष्ट सूचकांक की भौतिक स्थिति पर विस्तृत जानकारी देता है।
अब, खंडित सूचकांकों की सूची को भरने के लिए, हमें "sys.dm_db_index_physical_stats से जुड़ना होगा। ” और “sys.tables "क्रॉस अप्लाई का उपयोग करना। निम्नलिखित क्वेरी चलाएँ:
TABLES.NAME, INDEXSTATISTICS.ALLOC_UNIT_TYPE_DESC, CONVERT(NUMERIC(10, 2), INDEXSTATISTICS.AVG_FRAGMENTATION_IN_PERCENT) को PERCENTAGEFRAGMENTATION, INDEXSTATISTICS.PAGE_COUNT FROM SYS.DBYS_DBALES_INDS. , NULL, NULL, NULL) इंडेक्सस्टैटिस्टिक्स के रूप में जहां INDEXSTATISTICS.DATABASE_ID =DB_ID() और AVG_FRAGMENTATION_IN_PERCENT>=50 INDEXSTATISTICS द्वारा ऑर्डर।AVG_FRAGMENTATION_IN_PERCENT DESCक्वेरी को निम्न आउटपुट देना चाहिए:
सारांश
इस लेख में, हमने APPLY ऑपरेटर, इसकी विविधताओं - CROSS APPLY और OUTER APPLY और आपके काम के तरीके को कवर किया है। हमने यह भी देखा है कि आप डायनामिक प्रबंधन दृश्यों और गतिशील प्रबंधन कार्यों का उपयोग करके SQL प्रदर्शन समस्याओं की पहचान करने के लिए उनका उपयोग कैसे कर सकते हैं।