【发布时间】:2019-10-30 08:54:39
【问题描述】:
我在 SQL Server 2008 R2 中使用这个存储过程进行分页:
ALTER PROCEDURE [SelectPaging]
@SelectedColumn nvarchar(max),
@ViewName nvarchar(200),
@PrimaryKeyName nvarchar(100),
@RowCountOnPage int,
@PageNumberDesired int,
@Condition nvarchar(max),
@OrderBy nvarchar(200),
@OrderByAsc bit,
@UserID int,
@ErrorNumber int out,
@TotalRowsCount int out
as
begin
SET NOCOUNT ON;
Begin Try
exec [general].TotalRowsWithFiltering @PrimaryKeyName,@viewName ,@Condition ,@UserID,@TotalRowsCount out,@ErrorNumber out
declare @RowNumberFrom int,@RowNumberTo int
set @RowNumberFrom=((@PageNumberDesired-1)*@RowCountOnPage)
set @RowNumberTo=(@PageNumberDesired*@RowCountOnPage)+1
if @Condition='' or @Condition is null
set @Condition=' 1=1 '
else set @Condition=@Condition
if @OrderBy='' or @OrderBy is null
set @OrderBy=@PrimaryKeyName
declare @OrderByAsc_Desc nvarchar(6)
if (@OrderByAsc='false' or @OrderByAsc is null)
set @OrderByAsc_Desc=' Desc'
else if @OrderByAsc='true'
set @OrderByAsc_Desc=' Asc'
declare @SQLQuery nvarchar(max)
set @SQLQuery='SELECT
*
FROM (
SELECT
*,
ROW_NUMBER() OVER (order by '+@OrderBy+' '+@OrderByAsc_Desc+') AS RowNumber
FROM (
SELECT '+@SelectedColumn+'
FROM '+@viewName+' where ' + @Condition +'
) AS d
) AS c
where RowNumber >'+cast(@RowNumberFrom as nvarchar(10))+' and RowNumber < '+cast(@RowNumberTo as nvarchar(10))
EXECUTE sp_executesql @SQLQuery
set @ErrorNumber=@@ERROR
END TRY
BEGIN CATCH
END CATCH
end
我在具有 700.000 条记录的视图上运行查询。 当我在视图上选择查询时,运行时间为零。 但是当我运行这个 sp 进行分页时,每页获取 10 条记录需要 50-60 秒
如何优化?
【问题讨论】:
-
您确实应该考虑升级您的 SQL Server 版本。对 2008 年的扩展支持将于下个月结束。话虽如此,没有理由认为what worked on 2000 不会在 2008 年工作。
-
@Zohar Peled:你推荐什么 SQL Server 版本来解决这个问题?
-
不是为了解决这个特殊问题,但总的来说,使用受支持的版本总是更好。 AFAIK 最后一个稳定版本是 2017(2019 仍然是预览版),2012 很快将成为最旧的受支持版本。您应该至少升级到以上 2-3 个版本,这样您就不必过早再次升级 - 所以 2016-2017 应该是一个不错的选择。
-
这看起来像是一场巨大的注射噩梦。你需要引用你的对象。当列的最大长度也为 128 个字符时,您正在给某人使用
nvarchar(MAX)的机会。事实上,整个 SO 都需要去。这是一个巨大的安全风险。 -
解释计划和表格结构会很好..
标签: sql-server pagination