一个小程序用delphi 5 开发的, 
数据库是MS sqlserver 2000, 主要只有一个表,记录现在只有6000条左右,
字段有varchar, int还有一个Text; 
客户端用户有20个左右;
对表的操作查询比较多,添加 ,修改,成批倒入,
现在的问题是:
1。查询的时候会比较慢(结果集较大的时候)
2。在成批倒入的时候会把表给锁住,真要命恳请大家解答。

解决方案 »

  1.   

    1.按排序字段建索引,没有必要的话一次不要取太多数据,用where field=xxx
    这里的field最好有建索引,再就是order by中的字段也最好有索引,区区6000条记录,这样还不够快找我
    2.成批导入用缓存模式,每一百条提交一次(可以试一试再多少条提交时会更快),若用的事务,事务的处理过程不要太长(不要太花时间),不然则分成多段处理
      

  2.   

    查询的时候加上一些条件和order by 应该不算慢
    成批导入时如果数据很多,可以选择在空闲的时候做这个操作,如果一边查询一边导数据肯定不行了。
    想问一下你用什么方法导数据。
      

  3.   

    先谢谢大家,查询速度慢的问题解决了,
    第二个问题:
    我想知道查询(简单的select)会锁表吗?如果不会的话,对一个表的写入怎么可能会死锁呢?
      

  4.   

    锁机制(模式):
    1、共享锁:用于只读数据操作,它允许多个并发事务读取所锁定的资源
    2、修改锁:在修改操作的初始化操作
    3、排它锁:用于数据修改时操作(在数据修改时引发此锁,比如你的更新操作)
    4、结构锁和意向所,就不多说了!具体请参阅《SQLServer数据库系统管理与应用开发》一书!
      

  5.   

    现在又碰到一个很郁闷的问题,
    1  比如我有一个表information, 有6000条记录
       我先有一个dbgrid, query, datasource 对应起来
       其中query中查询select * from information where field1=...
       查询出有5000条记录左右,显示在dbgrid中;2  现在我要修改其中一条,保存的时候要验证是否重复,于是用了另一个query,
       SQL语句为select * from information where field1=... and   
       field2=... 但是我Open的时候会非常慢,而且内存也很快增长;
       如果原先的query查询出的记录只有几百条时就很快。是什么原因呢?谢谢大家先~~
      

  6.   

    补充以下:
       用sql monitor看时,有很多的fetch
      

  7.   

    一个很有用的建议:使用查询时不要使用select *,需要哪些字段就查哪些出来,这样会提高速度的!不建议一次性将所有的数据查询出来,建议分批查询!
      

  8.   

    我用sql server 7 + delphi 6 + ado做的,80个字段,12000条记录,50个客户端,可以啊。
      

  9.   


    初步怀疑是delphi的数据库操作是单线程的,因为第一个query查询出5000条记录,但实际上送到客户端的只有很少的,
    因此在我执行其他查询(当然原先的query不能关闭)时,首先要把原先的查询执行完毕,5000条当然是很慢了,这也是用sql monitor看的时候为什么会有那么多的fetch,上网查了一下,解决方法好象都说要用两个database和session, 郁闷~~to: yczyk(小周)
      怎么分批查询呢?
      

  10.   

    对field1和field2建立索引
    用select count(*) from information where field1=... and   
       field2=... 
    open后检查fields[0].asinteger是否大于0或是
    用field1和field2定义关键字,你想写重复记录进去都难了
      

  11.   

    我觉得使用select count(*) where 条件就可能会快一些,还有,是不是因为你得sql server和应用程序在一个机器上的缘故而变慢的?
      

  12.   

    开发的时候应用程序和数据库是在同一台机器上,但我也试过数据库在另外的机器上,也是同样的问题。最近两天在忙其他事,等后天我决定从头开始试一下,用最简单的一个form, 两个query,再重建一个数据库,也许能发现问题
      

  13.   

    刚才迫不及待的试了一下,发现如下:
    数据库:sqlserver 7.0 
           表 :tbl_inf 有6000条记录 (其中有一个Text字段)
                tbl_inf_from 有<10 条记录程序:一个form, 两个query, 一个datasource,dbgrid(和其中一个query对应)
         query1的查询语句为select inf_id, inf_word, ... from tbl_inf(其 
         中不包括Text字段, 6000条记录), 查询结果显示在dbgrid中,现执行第二
         个query2(语句select * from tbl_inf_from)。结果: 虽然执行query2 的时候速度快一点(因为query1没select 那个Text字
          段), 但用sql monitor查看的时候,还是有6000个fetch, 表明问题依
          然。结论:我还是没有什么好的方法~~  :(请大家up一下(因为一个人不能连续回复三次以上,该死的作者 :)), 谢谢~~
      

  14.   

    没有where条件句,当然就全取了