Tôi luôn kiểm tra lượng dữ liệu mà tôi đang truy cập trong truy vấn và cố gắng loại bỏ các cột cũng như các hàng không cần thiết. truy vấn hiệu suất chậm có thể là do bạn thực hiện “Chọn *”. Chọn tất cả các cột từ bảng không cho phép đi kèm với kế hoạch Thực thi tốt. Hãy kiểm tra xem bạn có chỉ cần các cột đã chọn và đảm bảo rằng bạn có chỉ mục bao trùm chính xác trên Đơn đặt hàng trong bảng.
Vì hàm SKIPP hoặc OFFSET rõ ràng không có sẵn trong phiên bản SQL 2008, chúng ta cần tạo một hàm và chúng ta có thể tạo bằng INNER JOIN. Trong một truy vấn, trước tiên chúng ta sẽ tạo ID bằng OrderDate và không có gì khác trong truy vấn đó. trong truy vấn thứ hai nhưng ở đây chúng tôi cũng chọn một số cột quan tâm khác từ bảng ORDER hoặc ALL nếu bạn cần cột TẤT CẢ. những gì được yêu cầu. Hãy thử mã này.
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