如何使用过滤器和分页优化 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] &gt;= ' + CAST((@NumberItemsPerPage * @PageCount) AS nvarchar(10)) + ' AND [RowCount] &lt; ' + CAST((@NumberItemsPerPage * @PageCount)+@NumberItemsPerPage AS nvarchar(10))...这应该给你分页方面。

至于性能,欢迎来到试错的奇妙世界。索引、键和架构都会发挥作用,所以我最好的建议是尝试不同的查询方法,使用查询分析器查看是否有任何额外的索引可以工作...... 戴夫

【讨论】:

是的,没有其他选择,我猜只有反复试验

以上是关于如何使用过滤器和分页优化 SQL Server 查询?的主要内容,如果未能解决你的问题,请参考以下文章

具有自己数据库的微服务的聚集,排序,过滤和分页

javascript 使用过滤器和分页获取所有元素

过滤和分页不适用于 ngxpagination 模板

SQL Server基础优化

Tablesorter 过滤器小部件,Tablesorter-filter 和分页问题

用SpringBoot+MySql+JPA实现对数据库的增删改查和分页