如何使用过滤器和分页优化 SQL Server 查询?
Posted
技术标签:
【中文标题】如何使用过滤器和分页优化 SQL Server 查询?【英文标题】:How to optimize SQL Server query with Filters and Pagination? 【发布时间】:2018-02-08 13:50:33 【问题描述】:我需要此查询的优化建议(无权修改索引),出于安全原因,我省略了一些变量名,但这基本上是我的查询,它在 300 到 900 毫秒左右波动,当我使用时c# 它快一点,但我想低于 100 毫秒。 SQL 服务器 2008
有什么想法吗?
CREATE PROCEDURE [dbo].MyProcedure (
PARAMETERS!!!
AS
BEGIN
SET NOCOUNT ON;
create TABLE #SearchTable
(
TEMP TABLE PARAMETERS!!!
)
insert into #SearchTable (COLUMNS!!!)
SELECT DISTINCT MYDATA!!!
FROM VIEW!!!
WHERE ID = @ID
AND ((( @Variable is null) or (VARIABLE LIKE @Variable + '%' ) )
AND ((( @Variable is null) or (VARIABLE LIKE @Variable + '%' ) )
AND ((( @Variable is null) or (VARIABLE LIKE @Variable + '%' ) )
AND ((( @Variable is null) or (VARIABLE LIKE @Variable + '%' ) )
AND ((( @Variable is null) or (VARIABLE LIKE @Variable + '%' ) )
AND ((( @Variable is null) or (VARIABLE LIKE @Variable + '%' ) )
declare @sql NVARCHAR(max)
set @sql = '
select * from (
select ROW_NUMBER() over (order by '+ @orderBy +') as RowNumber,*
from #SearchTable) table
WHERE (RowNumber > '+ cast(((@CurrentPage -1) * @PageSize) as varchar(max)) +'
AND RowNumber <= '+ cast( ((@CurrentPage) * @PageSize) as varchar(max)) +'
OR ' + cast( (@PageSize) as varchar(max)) +' = 0)'
EXEC sp_executesql @sql
--exec(@sql)
select @totalCount = count(*) from #SearchTable
print @totalCount
【问题讨论】:
【参考方案1】:对不起...需要编辑...这就是您得到的“头顶”...
为了分页,你已经有了动态 sql,所以只要你能确保你的项目顺序得到保留,你就可以使用'select TOP ' + CAST(@NumberItemsPerPage AS nvarchar(10)) + ' * FROM...WHERE [RowCount] >= ' + CAST((@NumberItemsPerPage * @PageCount) AS nvarchar(10)) + ' AND [RowCount] < ' + CAST((@NumberItemsPerPage * @PageCount)+@NumberItemsPerPage AS nvarchar(10))
...这应该给你分页方面。
至于性能,欢迎来到试错的奇妙世界。索引、键和架构都会发挥作用,所以我最好的建议是尝试不同的查询方法,使用查询分析器查看是否有任何额外的索引可以工作...... 戴夫
【讨论】:
是的,没有其他选择,我猜只有反复试验以上是关于如何使用过滤器和分页优化 SQL Server 查询?的主要内容,如果未能解决你的问题,请参考以下文章