sql >> Databáze >  >> RDS >> Sqlserver

Stránkování v SQL – problém s výkonem

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



  1. Neuspořádané výsledky v SQL

  2. Výchozí hodnota dvousloupcového časového razítka MySQL NOW ERROR 1067

  3. Proč je OracleDataAdapter.Fill() velmi pomalý?

  4. JDBC neprovádí příkaz SHOW DATABASES