簡體   English   中英

SQL Server存儲過程對200萬條記錄的排序,分頁和篩選

[英]SQL Server Stored Procedure Sorting , Paging and Filtering on 2 million records

我創建了一個存儲過程,該存儲過程從一個表中選擇了一些數據

表名(t1)列(id,a,b)

CREATE PROCEDURE spGetData
    @DisplayLength INT,
    @DisplayStart INT,
    @SortCol INT,
    @SortDir NVARCHAR(10),
    @Search  NVARCHAR(255) = NULL
AS
BEGIN
    DECLARE @FirstRec INT, @LastRec INT

    SET @FirstRec = @DisplayStart ;
    SET @LastRec = @DisplayStart + @DisplayLength;

    WITH CTE_Employees AS
    (
        SELECT
            ROW_NUMBER() OVER (ORDER BY
                                   CASE WHEN (@SortCol = 0 AND @SortDir = 'asc') THEN id END asc,
                                   CASE WHEN (@SortCol = 0 AND @SortDir = 'desc') THEN id END desc,
                                   CASE WHEN (@SortCol = 1 AND @SortDir = 'asc') THEN a END asc,
                                   CASE WHEN (@SortCol = 1 AND @SortDir = 'desc') THEN a END desc,
                                   CASE WHEN (@SortCol = 2 AND @SortDir = 'asc') THEN b END asc,
                                   CASE WHEN (@SortCol = 2 AND @SortDir = 'desc') THEN b END desc) AS RowNumber, 
            COUNT(*) OVER () AS TotalCount, 
            id, a, b
        FROM
            t1
        WHERE
            (@Search IS NULL 
             OR id LIKE '%' + @Search + '%' 
             OR a LIKE '%' + @Search + '%' 
             OR b LIKE '%' + @Search + '%')
    )
    SELECT * 
    FROM CTE_Employees
    WHERE RowNumber > @FirstRec AND RowNumber <= @LastRec   
END

運行以下程序大約需要20秒

spGetData 1000 ,0,0,'desc'

這很慢。 稍后將從ASP.NET MVC項目中調用此過程,並將使用jQuery數據表顯示結果。

如何改善它的性能?

首先,失去CTE。 對於CTE,這太簡單了。

CREATE PROCEDURE spGetData
    @DisplayLength int,
    @DisplayStart int,
    @SortCol int,
    @SortDir nvarchar(10),
    @Search nvarchar(255) = NULL
AS
BEGIN
    SELECT 
        COUNT(*) OVER () AS TotalCount,
        id,
        a,
        b
    FROM t1
    WHERE 
        (@Search IS NULL OR 
         id LIKE '%'+@Search+'%' OR 
         a LIKE '%'+@Search+'%' OR 
         b LIKE '%'+@Search+'%')
    ORDER BY
        CASE 
            WHEN @SortDir = 'ASC' THEN 
                CASE @SortCol
                    WHEN 0 THEN id
                    WHEN 1 THEN a
                    WHEN 2 THEN b
                END 
            END desc,
        CASE 
            WHEN @SortDir = 'desc' THEN 
                CASE @SortCol
                    WHEN 0 THEN id
                    WHEN 1 THEN a
                    WHEN 2 THEN b
                END 
            END DESC
    OFFSET @DisplayStart ROWS
    FETCH NEXT @DisplayLength ROWS ONLY
END 

這應該更快,但還要多說一句。 在字符串中間( '%'+@Search+'%' )之內的類似搜索無法使用任何索引,並且總是很慢-尤其是在2M行上,甚至更糟-在三個不同的列上這樣做。 它只需要進行全表掃描。 添加其他條件(不是LIKE)可以提高性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM