在SQL存储过程中处理分页和性能的最佳实践

时间:2019-06-21 11:08:17

标签: sql sql-server tsql stored-procedures

我正在使用MS SQL存储过程来检索数据并将其显示在GRID中。我的问题是存储过程具有复杂的查询,并且它总共返回了12K条记录。但是在网格中仅公开第1条50条记录。

我已经使用SQL提取和偏移量概念来避免不需要的数据,但是我希望总数可以将其显示在网格中。

您能提出建议更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

在全球范围内,您可以构建这样的结构:

create PROCEDURE your_sp                                                               
    @PageNumber  INT           = 1,
    @PageSize    INT           = 10,

    DECLARE @lPageSize INT= @PageSize;
    DECLARE @lFirstRecord INT= (@lPageNumber - 1) * @lPageSize;
    DECLARE @lLastRecord INT= (@lPageNumber * @lPageSize + 1);

    CREATE TABLE #tmp (...)

    INSERT INTO #tmp (

    select * from 

    (... your sub select heer)

    WHERE ROWNUM > @lFirstRecord
        AND ROWNUM < @lLastRecord

     )


-- Count all results in temporary table
        DECLARE @COUNT BIGINT;
         SET @COUNT =
         (
             SELECT COUNT(*)
             FROM #tmp
         );

        -- Apply paging to temporary table, and output results
        SELECT
            *,
            @COUNT [Count]
        FROM #tmp
        WHERE ROWNUM > @lFirstRecord
            AND ROWNUM < @lLastRecord
        ORDER BY ROWNUM ASC;
        DROP TABLE #tmp;