Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Страниране в SQL - Проблем с производителността

Винаги проверявам до колко данни имам достъп в заявката и се опитвам да премахна ненужните колони, както и редове. Е, това са само очевидни точки, които може би вече сте проверили, но просто исках да посочите, в случай че още не сте го направили. заявка, че бавната производителност може да се дължи на това, че правите „Изберете *“. Избирането на всички колони от таблицата не позволява получаването на добър план за изпълнение. Проверете дали имате нужда само от избрани колони и се уверете, че имате правилен покриващ индекс в Поръчките на таблицата.

Тъй като изричната функция SKIPP или OFFSET не е налична във версията на SQL 2008, трябва да създадем такава и да можем да я създадем чрез INNER JOIN. В една заявка първо ще генерираме ID с OrderDate и нищо друго няма да има в тази заявка. Правим същото във втората заявка, но тук също избираме някои други заинтересовани колони от таблицата ORDER или ALL, ако имате нужда от колона ALL. След това се ПРИСЪЕДИНЯВАМЕ към това, за да търсим резултати по ID и OrderDate и ДОБАВЯНЕ НА ПРОПУСКАНЕ на редове филтър за първата заявка, където наборът от данни е в минималния си размер какво се изисква. Опитайте този код.

    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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да извадите 30 дни от текущата дата с помощта на SQL Server

  2. Как да опиша таблица в SQL Server 2008?

  3. Има ли начин да изключите имплицитното преобразуване на тип в SQL Server?

  4. Ограничения на SQL Server Express

  5. Изчисляване на часовата разлика в SQL Server