• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
    POST TIME:2021-10-18 18:54
    复制代码 代码如下:

    --代码一DECLARE @cc INT
    SELECT NewsId,ROW_NUMBER() OVER(ORDER BY SortNum DESC) AS RowIndex INTO #tb FROM news WITH(NOLOCK) WHERE NewsTypeId=@NewsTypeId AND IsShow=1
    SET @cc = @@ROWCOUNT
    SELECT n.* FROM news AS n WITH(NOLOCK), #tb As t WHERE t.RowIndex>@PageIndex*@PageSize AND t.RowIndex=(@PageIndex+1)*@PageSize AND t.newsid=n.newsid
    SELECT @cc
    DROP TABLE #tb

    复制代码 代码如下:

    --代码二
    DECLARE @cc INT
    SELECT NewsId,ROW_NUMBER() OVER(ORDER BY SortNum DESC) AS RowIndex INTO #tb FROM news WITH(NOLOCK) WHERE NewsTypeId=@NewsTypeId AND IsShow=1
    SET @cc = @@ROWCOUNT
    SELECT NewsId INTO #tb2 FROM #tb As t WHERE t.RowIndex>@PageIndex*@PageSize AND t.RowIndex=(@PageIndex+1)*@PageSize
    SELECT * FROM news WITH(NOLOCK) WHERE NewsId IN (SELECT * FROM #tb2)
    SELECT @cc
    DROP TABLE #tb
    DROP TABLE #tb2

    答案是代码二远远高于代码一。在代码一中加粗代码的操作会引起整表扫描,因为数据库引擎在认为WHERE表达式中满足条件记录大于一定阀值的时候,就不再去进行查询优化,而直接使用表扫描。看执行信息,:
    表 'news'。扫描计数 1,逻辑读取 342 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    (98361 行受影响)
    (1 行受影响)
    (40 行受影响)
    表 '#tb________________________________________00000004C024'。扫描计数 1,逻辑读取 257 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'news'。扫描计数 1,逻辑读取 2805 次,物理读取 0 次,预读 235 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    (1 行受影响)
    (1 行受影响)

    原本,我想的执行计划,加粗部分的代码应该是聚焦索引查找,这样性能就提高很多。看代码二:
    表 'news'。扫描计数 1,逻辑读取 342 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    (98361 行受影响)
    (1 行受影响)
    表 '#tb____________________________________00000004BEEF'。扫描计数 1,逻辑读取 257 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    (40 行受影响)
    (1 行受影响)
    (40 行受影响)
    表 'news'。扫描计数 0,逻辑读取 131 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 '#tb2___________________________________00000004BEF0'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    (1 行受影响)
    (1 行受影响)

    很明显,代码二与代码一中的IO操作数大大降低。且代码一随着@PageIndex越来越大,效率会越来越低;但代码二的效率不会随@PageIndex变化而改变。
    您可能感兴趣的文章:
    • SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同
    • 详解SQLServer和Oracle的分页查询
    • sqlserver2005利用临时表和@@RowCount提高分页查询存储过程性能示例分享
    • 高效的SQLSERVER分页查询(推荐)
    • 真正高效的SQLSERVER分页查询(多种方案)
    • oracle,mysql,SqlServer三种数据库的分页查询的实例
    • sqlserver分页查询处理方法小结
    上一篇:sqlserver 用户权限管理,LINQ去除它的重复菜单项
    下一篇:sqlserver清空service broker中的队列的语句分享
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信