Vždy zkontroluji, k jak velkému množství dat přistupuji v dotazu, a snažím se eliminovat nepotřebné sloupce i řádky. No, toto jsou jen zřejmé body, které jste možná již zkontrolovali, ale jen jsem je chtěl upozornit, pokud jste tak ještě neučinili. dotaz, pomalý výkon může být způsoben tím, že děláte „Vybrat *“. Výběr všech sloupců z tabulky neumožňuje získat dobrý plán provádění. Zkontrolujte, zda potřebujete pouze vybrané sloupce a ujistěte se, že máte v tabulce Objednávky správný krycí index.
Protože explicitní funkce SKIPP nebo OFFSET není ve verzi SQL 2008 k dispozici, musíme jednu vytvořit a kterou můžeme vytvořit pomocí INNER JOIN. V jednom dotazu nejprve vygenerujeme ID s datem objednávky a nic jiného v tomto dotazu nebude. Děláme totéž ve druhém dotazu, ale zde také vybereme některé další zainteresované sloupce z tabulky ORDER nebo ALL, pokud potřebujete sloupec ALL. Pak se k tomu připojíme k dotazování výsledků podle ID a OrderDate a ADD SKIPP filtrování řádků pro první dotaz, kde má datová sada minimální velikost co je požadováno. Zkuste tento kód.
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