मुझे यकीन नहीं है कि आप इस 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 को उन प्रश्नों में रखें जो उनका संदर्भ देते हैं। और यदि छँटाई महंगी है, तो आप इसका समर्थन करने के लिए एक अनुक्रमणिका जोड़ने/बदलने पर विचार कर सकते हैं।