मैं हमेशा जांचता हूं कि मैं क्वेरी में कितना डेटा एक्सेस कर रहा हूं और अनावश्यक कॉलम के साथ-साथ पंक्तियों को खत्म करने का प्रयास करता हूं। वैसे ये केवल स्पष्ट बिंदु हैं जिन्हें आपने पहले ही जांच लिया होगा, फिर भी यदि आप पहले से नहीं हैं तो केवल इंगित करना चाहते हैं। क्वेरी धीमा प्रदर्शन हो सकता है क्योंकि आप "चयन करें *" कर रहे हैं। तालिका से सभी स्तंभों का चयन करना अच्छी निष्पादन योजना के साथ आने की अनुमति नहीं देता है। जांचें कि क्या आपको केवल चयनित कॉलम चाहिए और सुनिश्चित करें कि आपके पास टेबल ऑर्डर पर सही कवरिंग इंडेक्स है।
चूंकि SQL 2008 संस्करण में स्पष्ट SKIPP या OFFSET फ़ंक्शन उपलब्ध नहीं है, इसलिए हमें एक बनाने की आवश्यकता है और जिसे हम INNER JOIN द्वारा बना सकते हैं। एक प्रश्न में हम पहले ऑर्डरडेट के साथ आईडी जेनरेट करेंगे और उस क्वेरी में और कुछ नहीं होगा। हम वही करते हैं दूसरी क्वेरी में, लेकिन यहां हम तालिका ORDER या ALL से कुछ अन्य इच्छुक कॉलम भी चुनते हैं यदि आपको सभी कॉलम की आवश्यकता है। फिर हम आईडी और ऑर्डरडेट द्वारा परिणामों को क्वेरी करने के लिए इसमें शामिल होते हैं और पहली क्वेरी के लिए SKIPP पंक्तियों को फ़िल्टर करते हैं जहां डेटा सेट अपने न्यूनतम आकार में होता है क्या आवश्यक है। इस कोड को आजमाएं।
SELECT q2.*
FROM
(
SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, OrderDate
FROM Orders
WHERE OrderDate >= '1980-01-01'
)q1
INNER JOIN
(
SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, *
FROM Orders
WHERE OrderDate >= '1980-01-01'
)q2
ON q1.RowNum=q2.RowNum AND q1.OrderDate=q2.OrderDate AND q1.rownum BETWEEN 30000 AND 30020
IF object_id('TestSelect','u') IS NOT NULL
DROP TABLE TestSelect
GO
CREATE TABLE TestSelect
(
OrderDate DATETIME2(2)
)
GO
DECLARE @i bigint=1, @dt DATETIME2(2)='01/01/1700'
WHILE @I<=2000000
BEGIN
IF @i%15 = 0
SELECT @DT = DATEADD(DAY,1,@dt)
INSERT INTO dbo.TestSelect( OrderDate )
SELECT @dt
SELECT @[email protected]+1
END
SELECT q2.*
FROM
(
SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum
,OrderDate
FROM TestSelect
WHERE OrderDate >= '1700-01-01'
)q1
INNER JOIN
(
SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum
,*
FROM TestSelect
WHERE OrderDate >= '1700-01-01'
)q2
ON q1.RowNum=q2.RowNum
AND q1.OrderDate=q2.OrderDate
AND q1.RowNum BETWEEN 50000 AND 50010