Database
 sql >> डेटाबेस >  >> RDS >> Database

SQL ORDER BY:डेटा को एक पेशेवर की तरह सॉर्ट करने के लिए क्या करें और क्या न करें?

कुरूप। यही अनसोल्ड डेटा दिखता है। हम आंखों के लिए डेटा को सॉर्ट करके आसान बनाते हैं। और यही SQL ORDER BY के लिए है। डेटा सॉर्ट करने के लिए आधार के रूप में एक या अधिक कॉलम या एक्सप्रेशन का उपयोग करें। फिर, आरोही या अवरोही क्रम में लगाने के लिए ASC या DESC जोड़ें।

सिंटैक्स द्वारा SQL ऑर्डर:

ORDER BY <order_by_expression> [ASC | DESC]


ORDER BY अभिव्यक्ति कॉलम या अभिव्यक्तियों की सूची जितनी सरल हो सकती है। यह किसी केस का उपयोग करते हुए सशर्त भी हो सकता है जब ब्लॉक करें।

यह बहुत लचीला है।

आप OFFSET और FETCH के माध्यम से भी पेजिंग का उपयोग कर सकते हैं। छोड़ने के लिए पंक्तियों और दिखाने के लिए पंक्तियों की संख्या निर्दिष्ट करें।

लेकिन ये रही बुरी खबर।

अपने प्रश्नों में ORDER BY जोड़ने से वे धीमे हो सकते हैं। और कुछ अन्य चेतावनी "काम नहीं कर रहे" द्वारा ऑर्डर कर सकती हैं। आप जब चाहें उनका उपयोग नहीं कर सकते, क्योंकि इसमें दंड हो सकता है। तो, हम क्या करें?

इस लेख में, हम ORDER BY का उपयोग करने में क्या करें और क्या न करें की जांच करेंगे। प्रत्येक आइटम एक समस्या से निपटेगा, और एक समाधान होगा।

तैयार हैं?

SQL ORDER BY में क्या करें

<एच3>1. कॉलम द्वारा SQL ऑर्डर को इंडेक्स करें

अनुक्रमणिका सभी त्वरित खोजों के बारे में हैं। और ORDER BY क्लॉज में आपके द्वारा उपयोग किए जाने वाले कॉलम में से एक होने से आपकी क्वेरी तेज हो सकती है।

आइए बिना इंडेक्स वाले कॉलम में ORDER BY का उपयोग करना शुरू करें। हम AdventureWorks . का उपयोग करेंगे नमूना डेटाबेस। नीचे दी गई क्वेरी को निष्पादित करने से पहले, IX_SalesOrderDetail_ProductID . को अक्षम करें SalesOrderDetail . में अनुक्रमणिका टेबल। फिर, Ctrl-M press दबाएं और चलाओ।


-- Get order details by product and sort them by ProductID

USE AdventureWorks
GO

SET STATISTICS IO ON
GO

SELECT
 ProductID
,OrderQty
,UnitPrice
,LineTotal
FROM Sales.SalesOrderDetail
ORDER BY ProductID

SET STATISTICS IO OFF
GO

विश्लेषण

उपरोक्त कोड SQL सर्वर प्रबंधन स्टूडियो के संदेश टैब में I/O आंकड़े आउटपुट करेगा। आप निष्पादन योजना को दूसरे टैब में देखेंगे।

बिना किसी इंडेक्स के

सबसे पहले, आइए सांख्यिकी IO से तार्किक पठन प्राप्त करें। चित्र 1 देखें।

चित्र 1 . अनइंडेक्स किए गए कॉलम के ORDER BY का उपयोग करके तार्किक पठन। ( . का उपयोग करके स्वरूपित किया गया statisticsparser.com )

अनुक्रमणिका के बिना, क्वेरी में 1,313 तार्किक पठन का उपयोग किया गया था। और वह वर्कटेबल ? इसका मतलब है कि SQL सर्वर ने TempDB . का उपयोग किया है छँटाई को संसाधित करने के लिए।

लेकिन पर्दे के पीछे क्या हुआ? आइए चित्र 2 में निष्पादन योजना का निरीक्षण करें।

चित्र 2 . अनइंडेक्स किए गए कॉलम के ORDER BY का उपयोग करके क्वेरी की निष्पादन योजना।

क्या आपने समानांतरवाद (धाराओं को इकट्ठा करें) ऑपरेटर को देखा? इसका अर्थ है कि SQL सर्वर ने इस क्वेरी को संसाधित करने के लिए 1 से अधिक प्रोसेसर का उपयोग किया है। अधिक CPU की आवश्यकता के लिए क्वेरी काफी भारी थी।

तो, क्या हुआ अगर SQL सर्वर ने TempDB . का उपयोग किया और अधिक प्रोसेसर? एक साधारण क्वेरी के लिए यह खराब है।

एक इंडेक्स के साथ

यदि इंडेक्स को फिर से सक्षम किया जाता है तो इसका प्रदर्शन कैसा होगा? चलो पता करते हैं। अनुक्रमणिका को फिर से बनाएं IX_SalesOrderDetail_ProductID . फिर, ऊपर दी गई क्वेरी को फिर से चलाएँ।

चित्र 3 में नए तार्किक पठन की जाँच करें।

चित्र 3 . सूचकांक के पुनर्निर्माण के बाद नया तार्किक पठन।

यह बहुत बेहतर है। हमने तार्किक पढ़ने की संख्या को लगभग आधा कर दिया है। इसका मतलब है कि सूचकांक ने इसे कम संसाधनों का उपभोग किया। और वर्कटेबल ? वह चला गया! TempDB . का उपयोग करने की आवश्यकता नहीं है ।

और निष्पादन योजना? चित्र 4 देखें।

चित्र 4 . नई निष्पादन योजना आसान है जब अनुक्रमणिका को फिर से बनाया गया था।

देखो? योजना सरल है। समान 121,317 पंक्तियों को सॉर्ट करने के लिए अतिरिक्त CPU की आवश्यकता नहीं है।

तो, लब्बोलुआब यह है:सुनिश्चित करें कि आपके द्वारा ORDER BY के लिए उपयोग किए जाने वाले कॉलम अनुक्रमित हैं

लेकिन क्या होगा यदि कोई अनुक्रमणिका जोड़ने से लेखन प्रदर्शन प्रभावित होता है?

अच्छा सवाल।

यदि यह समस्या है, तो आप स्रोत तालिका के एक हिस्से को अस्थायी तालिका या स्मृति-अनुकूलित तालिका में डंप कर सकते हैं . फिर, उस तालिका को अनुक्रमित करें। यदि अधिक टेबल शामिल हैं तो इसका उपयोग करें। फिर, आपके द्वारा चुने गए विकल्प के क्वेरी प्रदर्शन का आकलन करें। तेज विकल्प विजेता होगा।

<एच3>2. WHERE और OFFSET/FETCH के साथ परिणामों को सीमित करें

आइए एक अलग क्वेरी का उपयोग करें। मान लें कि आपको किसी ऐप में चित्रों के साथ उत्पाद की जानकारी प्रदर्शित करने की आवश्यकता है। छवियां प्रश्नों को और भी भारी बना सकती हैं। इसलिए, हम न केवल तार्किक पठन की जाँच करेंगे बल्कि तार्किक पठन को भी जाँचेंगे।

यह रहा कोड।

SET STATISTICS IO ON
GO

SELECT
 a.ProductID
,a.Name AS ProductName
,a.ListPrice
,a.Color
,b.Name AS ProductSubcategory
,d.ThumbNailPhoto
,d.LargePhoto
FROM Production.Product a
INNER JOIN Production.ProductSubcategory b ON a.ProductSubcategoryID = b.ProductSubcategoryID
INNER JOIN Production.ProductProductPhoto c ON a.ProductID = c.ProductID
INNER JOIN Production.ProductPhoto d ON c.ProductPhotoID = d.ProductPhotoID
WHERE b.ProductCategoryID = 1 -- Bikes
ORDER BY ProductSubcategory, ProductName, a.Color

SET STATISTICS IO OFF
GO


यह तस्वीरों के साथ 97 बाइक का उत्पादन करेगा। उन्हें मोबाइल डिवाइस पर ब्राउज़ करना बहुत मुश्किल होता है।

विश्लेषण

बिना ऑफ़सेट/फ़ेच के मिनिमल व्हेयर कंडीशन का उपयोग करना

यहां चित्रों के साथ 97 उत्पादों को पुनः प्राप्त करने के लिए कितनी तार्किक रीडिंग की आवश्यकता है। चित्र 5 देखें।

चित्र 5 . ORDER BY का उपयोग OFFSET/FETCH के बिना और न्यूनतम WHERE शर्त के साथ करते समय तार्किक पढ़ता है और तार्किक पढ़ता है . (नोट:statsparser.com ने लॉब लॉजिकल रीड्स नहीं दिखाया। स्क्रीनशॉट SSMS में परिणाम के आधार पर संपादित किया जाता है)

2 कॉलम में छवियों को पुनः प्राप्त करने के कारण 667 लॉब लॉजिकल रीड्स दिखाई दिए। इस बीच, बाकी के लिए 590 लॉजिकल रीड्स का इस्तेमाल किया गया।

यहाँ चित्र 6 में निष्पादन योजना है ताकि हम बाद में इसकी तुलना बेहतर योजना से कर सकें।

चित्र 6 . ORDER BY का उपयोग करके ऑफ़सेट/फ़ेच के बिना और न्यूनतम WHERE शर्त के साथ निष्पादन योजना।

जब तक हम अन्य निष्पादन योजना नहीं देखते, तब तक कहने के लिए और कुछ नहीं है।

अतिरिक्त जहां स्थिति का उपयोग करना और इसके क्रम में ऑफसेट/फ़ेच करना

अब, यह सुनिश्चित करने के लिए क्वेरी को समायोजित करें कि न्यूनतम डेटा वापस आ गया है। यहाँ हम क्या करने जा रहे हैं:

  • उत्पाद उपश्रेणी पर एक शर्त जोड़ें। कॉलिंग ऐप में, हम कल्पना कर सकते हैं कि उपयोगकर्ता उपश्रेणी को भी चुन सकता है।
  • फिर, कॉलम की SELECT सूची में से उत्पाद उपश्रेणी को हटा दें और ORDER BY कॉलम की सूची।
  • आखिरकार, ORDER BY में OFFSET/FETCH जोड़ें। कॉलिंग ऐप में केवल 10 उत्पाद लौटाए जाएंगे और प्रदर्शित किए जाएंगे।

यह रहा संपादित कोड।

DECLARE @pageNumber TINYINT = 1
DECLARE @noOfRows TINYINT =  10 -- each page will display 10 products at a time

SELECT
 a.ProductID
,a.Name AS ProductName
,a.ListPrice
,a.Color
,d.ThumbNailPhoto
FROM Production.Product a
INNER JOIN Production.ProductSubcategory b ON a.ProductSubcategoryID = b.ProductSubcategoryID
INNER JOIN Production.ProductProductPhoto c ON a.ProductID = c.ProductID
INNER JOIN Production.ProductPhoto d ON c.ProductPhotoID = d.ProductPhotoID
WHERE b.ProductCategoryID = 1 -- Bikes
AND a.ProductSubcategoryID = 2 -- Road Bikes
ORDER BY ProductName, a.Color
OFFSET (@pageNumber-1)*@noOfRows ROWS FETCH NEXT @noOfRows ROWS ONLY


यदि आप इसे संग्रहीत प्रक्रिया में बनाते हैं तो यह कोड और बेहतर होगा। इसमें पेज नंबर और पंक्तियों की संख्या जैसे पैरामीटर भी होंगे। पृष्ठ संख्या इंगित करती है कि उपयोगकर्ता वर्तमान में कौन सा पृष्ठ देख रहा है। स्क्रीन रिज़ॉल्यूशन के आधार पर पंक्तियों की संख्या को लचीला बनाकर इसे और बेहतर बनाएं। लेकिन यह एक और कहानी है।

अब, आइए चित्र 7 में तार्किक पठन को देखें।

चित्र 7 . क्वेरी को सरल बनाने के बाद कम तार्किक पठन। ORDER BY में OFFSET/FETCH का भी उपयोग किया जाता है।

फिर, चित्र 7 से चित्र 5 की तुलना करें। लोब लॉजिकल रीड्स चले गए हैं। इसके अलावा, तार्किक पठन में उल्लेखनीय कमी आई है क्योंकि परिणाम सेट को भी 97 से घटाकर 10 कर दिया गया था।

लेकिन SQL सर्वर ने पर्दे के पीछे क्या किया? चित्र 8 में निष्पादन योजना देखें।

आकृति 8 . क्वेरी को सरल बनाने और ORDER BY में OFFSET/FETCH जोड़ने के बाद एक सरल निष्पादन योजना।

फिर, चित्र 8 की तुलना चित्र 6 से करें। प्रत्येक ऑपरेटर की जांच किए बिना, हम देख सकते हैं कि यह नई योजना पिछले वाले की तुलना में सरल है।

सीख? अपनी क्वेरी को सरल बनाएं। जब भी संभव हो ऑफ़सेट/फ़ेच का उपयोग करें।

एसक्यूएल ORDER BY में क्या न करें

ORDER BY का उपयोग करते समय हमें जो करने की आवश्यकता होती है, हमने वह कर लिया है। इस बार, आइए इस बात पर ध्यान दें कि हमें किन चीजों से बचना चाहिए।

<एच3>3. संकुल अनुक्रमणिका कुंजी द्वारा क्रमित करते समय ORDER BY का उपयोग न करें

क्योंकि यह बेकार है।

आइए इसे एक उदाहरण के साथ दिखाते हैं।

SET STATISTICS IO ON
GO

-- Using ORDER BY with BusinessEntityID - the primary key
SELECT TOP 100 * FROM Person.Person
ORDER BY BusinessEntityID;

-- Without using ORDER BY at all
SELECT TOP 100 * FROM Person.Person;

SET STATISTICS IO OFF
GO


फिर, आइए चित्र 9 में दोनों SELECT कथनों के तार्किक पठन की जाँच करें।

चित्र 9 . व्यक्ति तालिका पर 2 प्रश्न समान तार्किक पठन दिखाते हैं। एक ORDER BY के साथ है, दूसरा बिना।

दोनों में 17 तार्किक पठन हैं। यह वही 100 पंक्तियों की वापसी के कारण तार्किक है। लेकिन क्या उनकी भी यही योजना है? चित्र 10 देखें।

चित्र 10 . क्लस्टर इंडेक्स कुंजी के आधार पर क्रमित करते समय समान योजना चाहे ORDER BY का उपयोग किया जाए या नहीं।

समान ऑपरेटरों और समान क्वेरी लागत का निरीक्षण करें।

लेकिन क्यों? एक या अधिक स्तंभों को एक संकुल अनुक्रमणिका में अनुक्रमित करते समय, तालिका भौतिक रूप से क्रमबद्ध होगी संकुल सूचकांक कुंजी द्वारा। इसलिए, यदि आप उस कुंजी के अनुसार क्रमित नहीं भी करते हैं, तब भी परिणाम क्रमित किया जाएगा।

जमीनी स्तर? इसी तरह के मामलों में ORDER BY का उपयोग करके क्लस्टर इंडेक्स कुंजी का उपयोग न करके स्वयं को क्षमा करें . कम कीस्ट्रोक्स से अपनी ऊर्जा बचाएं.

<एच3>4. <स्ट्रिंग कॉलम> द्वारा ऑर्डर का उपयोग न करें जब एक स्ट्रिंग कॉलम में संख्याएं हों

यदि आप संख्याओं वाले एक स्ट्रिंग कॉलम के आधार पर छाँटते हैं, तो वास्तविक संख्या प्रकारों जैसे क्रम क्रम की अपेक्षा न करें। अन्यथा, आप एक बड़े आश्चर्य में हैं।

यहाँ एक उदाहरण है।


SELECT 
 NationalIDNumber
,JobTitle
,HireDate
FROM HumanResources.Employee
ORDER BY NationalIDNumber;


चित्र 11 में आउटपुट की जाँच करें।

चित्र 11 . संख्याओं वाले एक स्ट्रिंग कॉलम के क्रम को क्रमबद्ध करें। संख्यात्मक मान का पालन नहीं किया जाता है।

चित्र 11 में, लेक्सिकोग्राफिक सॉर्ट ऑर्डर का पालन किया गया है। इसलिए, इसे ठीक करने के लिए, एक पूर्णांक के लिए CAST का उपयोग करें।


SELECT 
 NationalIDNumber
,JobTitle
,HireDate
FROM HumanResources.Employee
ORDER BY CAST(NationalIDNumber AS INT)


निश्चित आउटपुट के लिए चित्र 12 देखें।

चित्र 12 . CAST से INT ने संख्याओं वाले एक स्ट्रिंग कॉलम की छँटाई तय की।

इसलिए, मैं इसके बजाय द्वारा ORDER BY CAST( AS INT) का उपयोग करता हूं।

5. ORDER BY के साथ #TempTable में SELECT INTO का उपयोग न करें

लक्ष्य अस्थायी तालिका में आपके वांछित सॉर्ट ऑर्डर की गारंटी नहीं दी जाएगी। आधिकारिक दस्तावेज़ देखें

आइए पिछले उदाहरण से एक संशोधित कोड लें।


SELECT 
 NationalIDNumber
,JobTitle
,HireDate
INTO #temp
FROM HumanResources.Employee
ORDER BY CAST(NationalIDNumber AS INT);

SELECT * FROM #temp;


पिछले उदाहरण से एकमात्र अंतर INTO क्लॉज है। आउटपुट चित्र 11 की तरह ही होगा। हम कॉलम को INT पर कास्ट करने के बावजूद वर्ग 1 में वापस आ गए हैं।

आपको CREATE TABLE का उपयोग करके एक अस्थायी तालिका बनाने की आवश्यकता है। लेकिन एक अतिरिक्त पहचान कॉलम शामिल करें और इसे प्राथमिक कुंजी बनाएं। फिर, अस्थायी तालिका में INSERT करें।

यहाँ निश्चित कोड है।


CREATE TABLE #temp2
(
	id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
	NationalIDNumber  NVARCHAR(15) NOT NULL,
	JobTitle NVARCHAR(50) NOT NULL,
	HireDate DATE NOT NULL
)
GO

INSERT INTO #temp2 
(NationalIDNumber, JobTitle, HireDate)
SELECT 
 NationalIDNumber
,JobTitle
,HireDate
FROM HumanResources.Employee
ORDER BY CAST(NationalIDNumber AS INT);


SELECT 
 NationalIDNumber
,JobTitle
,HireDate
FROM #Temp2;


और आउटपुट चित्र 12 जैसा ही होगा। यह काम करता है!

एसक्यूएल ORDER BY का उपयोग करने में महत्वपूर्ण बातें

हमने SQL ORDER BY का उपयोग करने में होने वाली सामान्य कमियों को कवर किया है। यहाँ एक सारांश है:

करें :

  • ORDER BY कॉलम अनुक्रमित करें,
  • WHERE और OFFSET/FETCH के साथ परिणामों को सीमित करें,

नहीं करें :

  • संकुल अनुक्रमणिका कुंजी के अनुसार क्रमित करते समय ORDER BY का उपयोग न करें,
  • किसी स्ट्रिंग कॉलम में नंबर होने पर ORDER BY का इस्तेमाल न करें। इसके बजाय, स्ट्रिंग कॉलम को पहले INT पर कास्ट करें।
  • ORDER BY के साथ #TempTable में SELECT INTO का उपयोग न करें। इसके बजाय, पहले एक अतिरिक्त पहचान कॉलम के साथ अस्थायी तालिका बनाएं।

ORDER BY का उपयोग करने के बारे में आपके क्या सुझाव और तरकीबें हैं? नीचे टिप्पणी अनुभाग में हमें बताएं। और अगर आपको यह पोस्ट पसंद आए तो कृपया इसे अपने पसंदीदा सोशल मीडिया प्लेटफॉर्म पर शेयर करें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डिजिटल परिवर्तन:यह सब डेटा सोच से शुरू होता है

  2. NetBeans 9.0, भाग 2 में Java 9 में JShell का उपयोग करना

  3. कारपूलिंग के लिए डेटा मॉडल बनाना

  4. लेयरिंग में असमान डेटा स्रोतों से जुड़ना

  5. कमांड लाइन के साथ SQL डेटाबेस माइग्रेशन