我做了一个信息查询的页面,大概一次查询100个左右的数据(并且还要放到ArrayList列表里循环查询,大概循环10次,所以一个页面就得显示大概1000个左右的数据),sql语句就是简单的select * from 表名。
并且每个数据在查询出来之前都要做一个判断,就是判断这个数据在另外一个表里有没有这个值(判断方法写在了数据库查询方法里),这样一来导致查询非常慢,查一次需要10几秒钟,我想知道应该如何解决这个问题,急求,谢谢各位!!

解决方案 »

  1.   

    是数据库查询慢,还是页面显示慢?你把sql语句直接在数据库执行,看速度如何?如果是页面慢,那就是你的table动态显示的内容太多了,可以在table中加<tbody>或使用js处理。
      

  2.   

    1,select * from 表名 能少用select * 尽量少用,因为是无序查询,每次查询100就TOP 100 ,也可以加索引。
      

  3.   

    select * from 表名,然后再数据库里面判断是否符合条件?最好用一条sql解决问题,判断的都写在这条查询sql里面,不要另外判断。
      

  4.   

    1.可以使用分页
    2.尽量不要使用select * .....,你可以选择字段查询
      

  5.   

    查询 1000 次不慢才怪呢,连问问题都不会问!如果你只说查询 1000 次,鬼知道你查的是什么东西!问到现在一行代码都没看到,看到的竟是对于解决这个问题没用的废话,而且在 0 楼说了一次,在 16 楼又说了一次。这种问题你必须提供下面这些信息,否则没人帮你1,数据库管理系统类型、版本
    2,所使用到的表,以及表结构和索引结构
    3,这些表的关系是什么
    4,需要从这些表中查出什么数据供页面显示
    5,简要地从技术角度(你是怎么写 SQL 语句的)描述一下你现在是怎么做的
    6,你是用原始的 JDBC,还是什么 ORM 工具
      

  6.   

    1000次就慢?不会吧 你们的数据库有点烂哦
    select * 是不好的,影响效率。能在数据库处理的东西 就要在JAVA处理了
    你的问题 还真的是没有几个人能看懂。
    不能提供更详细的情况的话,大家只能建议你分页或优化SQL了。
    因为一无所知啊
      

  7.   

    我见过类似的问题,在外部判断完dataset之后loop住访问数据库取得数据
    然后再将数据合并在一起送还页面展示当时差点被雷死
    直接改成存储进程在db端全部解决完之后直接返回dataset了1000次绝对不至于慢的,access也不会很慢
    重新架构一下你的数据访问流程了
      

  8.   

    其实现在楼主的查询慢的原因是。先查询100条记录出来。
    在这里做循环。。而且在循环的时候,还要查询数据库
    最后要比较数据是否存在于另一个表中。。至此,才算一个业务逻辑走完。。关键在这里。100 * 10 如果是用JDBC那会更慢。用联接池还好点。。但是开销也是很大的。。建议换个思路,改变一下逻辑。。尽量不要在循环里面再去查询数据库
      

  9.   

    改下sql吧,
    假設表A,B,C
    從A中查詢100條記錄,然後逐條查詢表B中對應的記錄,結果出來前判斷該條記錄是否在表C中存在,是這樣嗎?或者理解2是,只有兩張表A,B,查詢結果出來前判斷是否在表B中存在。無論是哪種情況,你都可以通過改sql來解決的。
    如第一種情況,可以一次查出所有結果,jdbc只需要連接一次.select a.c1,b.c2,b.c3 from a,b where a.c1 = b.c1 and exists (select 1 from c where c.c4 = b.c4);不知道所用的數據庫是什麽,不過強烈建議樓主你好好讀讀《Oracle 9i10g编程艺术》,瞭解數據庫是如何工作的,項目中見過太多如類似樓主這樣的情況了,為了出來結果未考慮結果寫出來的代碼,在上線時是完全不能用的。比如在幷發情況下,若100個人在操作這個頁面,那麼JDBC對數據庫的請求數是100000,即使改數據庫session最大連接值也無濟於事了。
      

  10.   

    你用的是什么数据库?
    你用的是Ms sql server 2008 当然慢啦
      

  11.   

    不会不懂回个P帖啊  还占楼层
    技术区得分就靠这么关心问题而得分吗虽然我这回的也是P帖  但是我像纠正一下技术区的风气  技术分不是这么得的会就帮着解决  不会就观望得了呗总一副什么都关心的姿态  分真的那么总要吗  你关心半天得到了分自己不会不也白搭吗BS不解决问题的还回帖的
      

  12.   


    楼主在 MS SQL Server 版块发了一个同样的帖子
      

  13.   

    select 时,最好把字段名都写出来,也会快点
      

  14.   

    尽量用一句sql解决,不行的话用存储过程
      

  15.   

    楼主问题表述过于简单,
    起码最基本的信息包括:数据库、表结构,既然2个表有联系,你得列出来,不要为了简单应付了事。
    楼上很多人也提到,你必须说出你用到的ORM 是JDBC 还是hibernate? 
    另:楼主用ArrayList 这么一个类来存储结果集,这明显有很大的漏洞,因为搞web开发的人都清楚,ArrayList并不是线程安全的类,不适合作为结果集的迭代类。建议用Vector.
    另:你所使用的前台页面迭代标签是怎样的? 表数据大概是多少万条记录?如果只是很小的表也不需要索引。
      

  16.   

    判断这个数据在另外一个表里有没有这个值----------------------------------------
    最直接有效的方法是减少SQL执行次数。看你描述至少执行11次左右---一次基本1秒,速度正常,变成一次不就行了。
    把表结构,代码都贴出来,业务需求什么的。一次给你优化到底。健步如飞。
      

  17.   

    sql语句就是简单的select * from 表名。 
    并且每个数据在查询出来之前都要做一个判断,就是判断这个数据在另外一个表里有没有这个值(判断方法写在了数据库查询方法里),
    单这一点就可确认出LZ查询语句本身存在问题。
      

  18.   

    导致你慢的原因我觉得很多,比如用了select *,没有直接在数据库了分页,但是我觉得这个不是主要原因,主要原因在这里                          并且每个数据在查询出来之前都要做一个判断,就是判断这个数据在另外一个表里有没有这个值(判断方法写在了数据库查询方法里),,建议这个放到sql语句中完成。
      

  19.   

    一个<table>里的数据太多会导致页面显示速度很慢,建议用<tbody>
      

  20.   

    可能主要瓶颈在你每查一条记录都要判断一次。试一试在sql里面判断如何?
      

  21.   

    可能主要瓶颈在你每查一条记录都要判断一次。试一试在sql里面判断如何?
      

  22.   

    你要把你的SQL优化一下.....不要用*号查了.....分页一页显示多少一次就查多少
      

  23.   

    你先用查询分析器查询一下,如果比较快,那么就是你的程序的问题,如果是你数据库执行简单的查询就比较慢的话,那可能是你数据比较多,可以把你的数据迁移到sql server 2005上 2005对于数据量大的执行效率要比2000的要好。
      

  24.   

    判断的语句 也写在 SELECT中好点,要不循环100次  时间肯定有点长
    另外100条数据还是分一下页吧