zoukankan      html  css  js  c++  java
  • mssql数据库分页查询效率的一次体会

      这几天在一个项目,合同管理系统(是对老系统的升级和改造,老系统是VS2008做的),由于数据库的表是项目组根据老系统的数据库建的,所以在查询的适合我就需要自己创建视图来完成多表的查询,起初我是读取项目组成员建好的视图,里面有7张表,其中还包含视图,由于视图中join视图是不支持索引的,所以在查询第一页的时候(每一页20条数据,总共数据量是10W条左右),耗时800毫秒,但是

    当row_number达到上千的时候,基本查询要6秒以上,每点击下一页,耗时会增加十几毫秒,到40000条也就是中间的时候,基本是超时了,在数据库执行也要3分钟多,这还没有加上查询条件和join Dictionary表去value的值(数据查询出来的很多字段都是key 需要自己去到Dictionary表取value)

    对这类情况我是头一次碰到,通过分析和了解发现row_number越往后越慢是普遍存在的现象,

    第一种解决方案是 项目组给的建议是写存储过程,写了之后,效果一样不理想,

    第二个解决方案是 改变分页方法,用正反分页的方式来完成查询功能, 这样导致的结果是两头比较快,中间最慢,通过编写存储过程的测试后,发现中间部分最慢的地方需要3-7秒, 这个也不理想

    第三个解决方案是我自己想出来的, 就是在不影响业务的情况下,把视图中的表减少,通过分析所以的查询条件全部在两张表里面,那我就把这两张表建了一个视图,然后在查询的时候也做了一些小的变动,就是再通过排序和条件筛选后,先取出1页的数据,然后再拿这1页的数据去join其他表和视图,取出对应value值, 这样测试后得到的结果是 所有的页都可以保证在1秒内完成查询,不会出现每点击下一页偏移几十毫秒的情况(没有用存储过程,是通过linq的方式完成的查询)

      对于linq动态拼接条件有两种方式,我是参考了 http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx 这里面的方式编写的,

      好了今天就到这里了,明天继续,有更好的分页方式希望能分享一下,写的不好请大牛们手下留情...

  • 相关阅读:
    How to install VXDIAG Honda, Toyota and JLR SDD software
    16% off MPPS V16 ECU tuning tool for EDC15 EDC16 EDC17
    Cummins INSITE locked and ask for verification code
    How to use BMW Multi Tool 7.3 to replace lost key for BMW X1
    Bleed Brake Master Cylinder with Intelligent Tester IT2
    Porsche Piwis Tester II “No VCI has been detected”,how to do?
    Creader VIII VS. Creader VII+
    How to solve GM MDI cannot complete the installation
    汽车OBD2诊断程序开发 (原文转载,思路很清晰!)
    汽车节温器单片机开发思路
  • 原文地址:https://www.cnblogs.com/guobingbing/p/3863736.html
Copyright © 2011-2022 走看看