Оптимизировать пейджинговый запрос в SQL Server - PullRequest
0 голосов
/ 21 декабря 2018

Я использую CTE с оператором union all для запроса пейджинга в моей хранимой процедуре.

Я выбираю общее количество записей также в моем поисковом запросе.Но это займет еще несколько секунд.

CREATE PROCEDURE [dbo].[PAGING_NEW]
    @parameter1 NVARCHAR(200),
    @parameter2 NVARCHAR(200),
    @PAGE INT,
AS
    SET NOCOUNT ON;

    DECLARE @ROWNUM INT =24
    DECLARE @ROWCOUNT INT

    SET @ROWCOUNT = ((@PAGE - 1) * @ROWNUM)

    ;WITH TempResult AS 
    (
         QUERY 1
         WHERE CONDITIONS

         UNION ALL

         QUERY 2
         WHERE CONDITIONS
    ), TempCount AS
    (
        SELECT 
            COUNT(ID) AS TotalCount 
        FROM
            TempResult
    )
    SELECT
        ID, NAME, TEMPCOUNT.TotalCount  
    FROM 
        TempResult, TempCount 
    ORDER BY 
        Tempresult.ID
        OFFSET @ROWCOUNT ROWS FETCH NEXT @ROWNUM ROWS ONLY 

Вопросы:

  1. Есть ли какой-либо другой метод для оптимизации общего количества записей?
  2. Можно ли улучшитьпроизводительность CTE для union all в пейджинговом запросе?

Теперь я использую условие соединения в своем пейджинговом запросе, но общее количество не подходит правильно.

CREATE PROCEDURE [dbo].[PAGING_NEW]
        @parameter1 NVARCHAR(200),
        @parameter2 NVARCHAR(200),
        @PAGE INT,
    AS
        SET NOCOUNT ON;

        DECLARE @ROWNUM INT =24
        DECLARE @ROWCOUNT INT

        SET @ROWCOUNT = ((@PAGE - 1) * @ROWNUM)

        ;WITH TempResult AS 
        (
             QUERY 1
             WHERE CONDITIONS

             UNION ALL

             QUERY 2
             WHERE CONDITIONS
        ), TempCount AS
        (
            SELECT 
                COUNT(ID) AS TotalCount,ID AS ID
            FROM
                TempResult
        )
        SELECT
            TempResult.ID, NAME, TEMPCOUNT.TotalCount  
        FROM 
            TempResult 
            JOIN TempCount 
            ON TempResult.ID=TempCount.ID
        ORDER BY 
            Tempresult.ID
            OFFSET @ROWCOUNT ROWS FETCH NEXT @ROWNUM ROWS ONLY 
...