Saya selalu memeriksa berapa banyak data yang saya akses dalam kueri dan mencoba untuk menghilangkan kolom dan baris yang tidak perlu. Nah ini adalah poin yang jelas yang mungkin sudah Anda periksa namun hanya ingin ditunjukkan jika Anda belum melakukannya. kueri kinerja yang lambat mungkin karena Anda melakukan "Pilih *". Memilih semua kolom dari tabel tidak memungkinkan untuk datang dengan rencana Eksekusi yang baik. Periksa apakah Anda hanya membutuhkan kolom yang dipilih dan pastikan Anda memiliki indeks penutup yang benar pada Pesanan tabel.
Karena fungsi SKIPP atau OFFSET eksplisit tidak tersedia dalam versi SQL 2008 kita perlu membuatnya dan itu dapat kita buat dengan INNER JOIN. Dalam satu query pertama-tama kita akan menghasilkan ID dengan OrderDate dan tidak ada lagi yang akan ada di query itu. Kami melakukan hal yang sama dalam kueri kedua tetapi di sini kami juga memilih beberapa kolom lain yang tertarik dari tabel ORDER atau ALL jika Anda membutuhkan ALL kolom. Kemudian kami GABUNG ini untuk hasil kueri dengan ID dan OrderDate dan ADD SKIPP baris filter untuk kueri pertama di mana kumpulan data berada pada ukuran minimal apa yang diperlukan. Coba kode ini.
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