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

ORDER BY क्लॉज के साथ एक दृश्य बनाएं

मुझे यकीन नहीं है कि आप इस ORDER BY के बारे में क्या सोचते हैं? पूरा कर रहा है? भले ही आप करें ORDER BY कानूनी तरीके से देखने में (उदाहरण के लिए TOP . जोड़कर क्लॉज), यदि आप केवल दृश्य से चयन करते हैं, उदा। SELECT * FROM dbo.TopUsersTest; बिना ORDER BY . के क्लॉज, SQL सर्वर सबसे कुशल तरीके से पंक्तियों को वापस करने के लिए स्वतंत्र है, जो आवश्यक रूप से आपके द्वारा अपेक्षित क्रम से मेल नहीं खाएगा। ऐसा इसलिए है क्योंकि ORDER BY अतिभारित है, जिसमें यह दो उद्देश्यों की पूर्ति करने का प्रयास करता है:परिणामों को क्रमबद्ध करने के लिए और यह निर्धारित करने के लिए कि कौन सी पंक्तियों को TOP में शामिल करना है . इस मामले में, TOP हमेशा जीतता है (हालांकि डेटा को स्कैन करने के लिए चुने गए इंडेक्स के आधार पर, आप देख सकते हैं कि आपका ऑर्डर उम्मीद के मुताबिक काम कर रहा है - लेकिन यह सिर्फ एक संयोग है)।

आप जो चाहते हैं उसे पूरा करने के लिए, आपको अपना ORDER BY add जोड़ना होगा उन प्रश्नों के खंड जो दृश्य से डेटा खींचते हैं, न कि स्वयं दृश्य के कोड पर।

तो आपका व्यू कोड बस इतना होना चाहिए:

CREATE VIEW [dbo].[TopUsersTest] 
AS 
  SELECT 
    u.[DisplayName], SUM(a.AnswerMark) AS Marks
  FROM
    dbo.Users_Questions AS uq
    INNER JOIN [dbo].[Users] AS u
      ON u.[UserID] = us.[UserID] 
    INNER JOIN [dbo].[Answers] AS a
      ON a.[AnswerID] = uq.[AnswerID]
    GROUP BY u.[DisplayName];

ORDER BY अर्थहीन है इसलिए इसे शामिल भी नहीं किया जाना चाहिए।

उदाहरण के लिए, AdventureWorks2012 का उपयोग करते हुए, यहां एक उदाहरण दिया गया है:

CREATE VIEW dbo.SillyView
AS
  SELECT TOP 100 PERCENT 
    SalesOrderID, OrderDate, CustomerID , AccountNumber, TotalDue
  FROM Sales.SalesOrderHeader
  ORDER BY CustomerID;
GO

SELECT SalesOrderID, OrderDate, CustomerID, AccountNumber, TotalDue
FROM dbo.SillyView;

परिणाम:

SalesOrderID   OrderDate   CustomerID   AccountNumber   TotalDue
------------   ----------  ----------   --------------  ----------
43659          2005-07-01  29825        10-4020-000676  23153.2339
43660          2005-07-01  29672        10-4020-000117  1457.3288
43661          2005-07-01  29734        10-4020-000442  36865.8012
43662          2005-07-01  29994        10-4020-000227  32474.9324
43663          2005-07-01  29565        10-4020-000510  472.3108

और आप निष्पादन योजना से देख सकते हैं कि TOP और ORDER BY SQL सर्वर द्वारा पूरी तरह से अनदेखा और अनुकूलित किया गया है:

कोई TOP नहीं है ऑपरेटर बिल्कुल, और कोई प्रकार नहीं। SQL सर्वर ने उन्हें पूरी तरह से अनुकूलित कर दिया है।

अब, यदि आप दृश्य को बदलने के लिए ORDER BY SalesID . कहते हैं , तो आप केवल उस आदेश को प्राप्त करने के लिए होंगे जो दृश्य बताता है, लेकिन केवल - जैसा कि पहले उल्लेख किया गया है - संयोग से।

लेकिन अगर आप अपनी बाहरी क्वेरी को ORDER BY . करने के लिए बदलते हैं आप चाहते थे:

SELECT SalesOrderID, OrderDate, CustomerID, AccountNumber, TotalDue
FROM dbo.SillyView
ORDER BY CustomerID;

आप जैसा चाहते हैं, वैसा ही परिणाम प्राप्त करते हैं:

SalesOrderID   OrderDate   CustomerID   AccountNumber   TotalDue
------------   ----------  ----------   --------------  ----------
43793          2005-07-22  11000        10-4030-011000  3756.989
51522          2007-07-22  11000        10-4030-011000  2587.8769
57418          2007-11-04  11000        10-4030-011000  2770.2682
51493          2007-07-20  11001        10-4030-011001  2674.0227
43767          2005-07-18  11001        10-4030-011001  3729.364

और योजना ने अभी भी TOP . को अनुकूलित किया है /ORDER BY दृश्य में, लेकिन CustomerID द्वारा आदेशित परिणाम प्रस्तुत करने के लिए एक सॉर्ट जोड़ा जाता है (बिना किसी छोटी लागत के, आपको याद है) :

तो, कहानी का नैतिक, आदेश को विचारों में न डालें। 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. सी # में एसएमओ का उपयोग कर SQL सर्वर के उपलब्ध उदाहरणों को कैसे सूचीबद्ध करें?

  2. Azure वर्चुअल मशीन पर SQL Server 2014 चलाना

  3. मैं संग्रहीत प्रक्रिया में पैरामीटर के रूप में सूची कैसे पास करूं?

  4. SQL सर्वर तालिका को भिन्न फ़ाइल समूह में ले जाना

  5. शुरुआती लोगों के लिए SQL सर्वर 2016 में पूर्ण-पाठ खोज लागू करना