[英]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.