私は常にクエリでアクセスしているデータの量をチェックし、不要な列と行を排除しようとしています.まあ、これらはあなたがすでにチェックしているかもしれない明らかなポイントですが、まだチェックしていない場合に備えて指摘したかっただけです.クエリのパフォーマンスが遅いのは、「Select *」を実行していることが原因である可能性があります。テーブルからすべての列を選択すると、適切な実行計画が得られません。選択した列のみが必要かどうかを確認し、テーブル Orders に正しいカバリング インデックスがあることを確認してください。
明示的な SKIPP または OFFSET 関数は SQL 2008 バージョンでは使用できないため、作成する必要があり、INNER JOIN によって作成できます。1 つのクエリでは、最初に OrderDate で ID を生成し、そのクエリには他に何もありません。同じことを行います。 2 番目のクエリでは、すべての列が必要な場合は、テーブル ORDER または ALL から他の関連する列も選択します。次に、これを JOIN して ID と OrderDate で結果をクエリし、データ セットが最小サイズの最初のクエリの ADD 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