oracle9i,数据量目前在10万左右.
如果我直接用:
select * from table_name ;
这个很快,大约1秒就返回数据到界面了.但是,当有条件查询的时候,比如:
select * from table_name where type="xx";就很慢了,要大约1分钟左右才能返回数据.这才加一个条件就这么慢了,如果我加条件那就更慢了.
请教高手有什么优化的手段?
谢谢!

解决方案 »

  1.   

    select * from table_name where type="xx"
    尽量不要写 select*,写你需要的字段。在查询条件字段上非聚集建立索引,
      

  2.   

    多谢.其实我的SQL里是指明了具体的列名,而且还是大写字母的.同时,我也在Type上建立了索引了,但是因为有很多记录Type是一样的,我直接指定使用这个索引查询,好象没什么效果.
      

  3.   

    如果不产生歧义,尝试下
    select * from table_name where type like 'xx%'
      

  4.   

    我再说清楚点吧!
    oracle9i
    数据量为10万条记录表为:
    myTable
    字段都有:
    serialnumber,city,provice,mail,tel,name,age,status,address其中serialnumber是PK,status为状态有5种分别是0,1,2,3,4,5如果纯粹的
    select t.serialnumber,t.city,t.provice,t.mail,t.tel,t.name,t.age,t.status,t.address
    from myTable t
    执行这个语句是很快的,1秒左右就可以提取数据并显示在程序界面上.如果按照status来查询的话,sql语句为
    select t.serialnumber,t.city,t.provice,t.mail,t.tel,t.name,t.age,t.status,t.address
    from myTable t
    where t.status=0
    这个就很慢了,大约要40秒才能把数据显示在界面上.
      

  5.   


    to:apollolb2005 刚刚尝试了,用like 更慢
      

  6.   

    给你点建议:
    1. 如果这个查询与其他的表的查询有关系的话,最好先根据条件做表的合并再做查询,那样可以减小查询表的大小;
    2. 如果数据还是很多,那么看看能否在where上下功夫,把条件分析一下:比如说select * from table_name where type="xx",看看xx是否在type中有一定的规律,如:xx全是大于1000的数字.则可以对table_name先search 出type大于1000的值,那么现在再用这个表的数据去search"xx";
    3. 如果前面两种方法都不适用,那么就得注意数据在往数据库中插入得过程了,首先:在插入之前就应该知道将来会做高频率search或者海量数据search的具体search条件,比如说这里的type = "xx",我们在插入的时候就可以先对数据按一定的顺序插入. 以便将来search能减小search的数据量.总之:大多数据库的查询优化都是那么几点,优化条件,减小查询表,减少查询次数,你从这几个方面考虑下吧.
    还有,你给的条件好象不是很足够.不好具体说怎么做.希望对您有帮助.
      

  7.   

    to:apollolb2005 刚刚看了一下时间:用like 执行话了 花了19.969秒不用like,直接用= 查询花了17.938秒
      

  8.   

    同意10楼
    另外可以将大的表分割成若干个子表
    比如按type或者serialnumber将表分割开。
      

  9.   

    to:apollolb2005每次返回的数据是20条,分页显示的. 使用oracle的rownum来分页,具体的分页代码是SELECT * FROM ( 
      SELECT A.*,rownum as rn FROM (
          select t.serialnumber,t.city,t.provice,t.mail,t.tel,t.name,t.age,t.status,t.address 
          from myTable t 
          where t.status=0 ) A
      where rownum <=20)B 
    where rn>=1;我是在PL/SQL中执行
    select t.serialnumber,t.city,t.provice,t.mail,t.tel,t.name,t.age,t.status,t.address 
          from myTable t 
          where t.status=0
    看的花费时间.
    如果能在PL/SQL中执行花费大约1-2秒,那么在我程序的界面显示也就不至于感觉很慢了.
    或者各位兄弟,有其他的oracle快速分页代码吗?
      

  10.   

    to:apollolb2005 之前我也建议将这个mytable按status类型来分解成几个表.但是,因为之前 做系统设计的同事更本没考虑这个性能的问题,现在项目老大也不想分解成多个表.因为分解后对程序和业务逻辑改动太大了.所以,只有来求助这个兄弟姐妹了!
      

  11.   

    要查的列建索引,
    写的时候最好别写成select *
      

  12.   


    1.貌似Oracle的分页也就是你用的方法比较好了。
    2.所以若提高效率,只能从两个方面考虑。
      a.采用异步预读处理,在系统相对空闲的时候,用别的线程读出数据到DataSet,画面处理时只从DataSet里取出数据进行显示。
      b.分割表,可以做个触发器,当是做查询/更新的时候,根据条件到对应表里去查询/更新。从.net看过来,还是对原来的表进行操作,所以没有什么影响的。
      

  13.   

    我是在PL/SQL中执行 
    select t.serialnumber,t.city,t.provice,t.mail,t.tel,t.name,t.age,t.status,t.address 
          from myTable t 
          where t.status=0 
    看的花费时间. 
    如果能在PL/SQL中执行花费大约1-2秒,那么在我程序的界面显示也就不至于感觉很慢了. ================================
    pl/sql显示结果是分了页的.当然会很快.它不会把所有的数据全拿出来.
      

  14.   

    你的type是什么类型,是不是char类型啊?可以换成char试试.
    比如,如果是char(5)
    select * from table_name where type="x    "   -->后面是四个空格.
      

  15.   

    我们老师说在数据多的时候,绝对禁止实用select *
      

  16.   

    select * 写全列名 减少嵌套层 加索引试试
      

  17.   

    先查一下你到数据库服务器的连接速度如何?然后看看数据库服务器的硬件条件吧,是不是应用太多导致内存紧张了。如果还没找到问题,就去调整一下oracle的设置,特别是内存方面的。
      

  18.   

    鉴于Status 有5种状态,你又不能改表的结构,那么你可以在数据库中建5个对应图试试,视图的建立可以在你程序空闲的时候用一个新的线程建好,后面去查询的时候先判断Status的值,然后去相应的视图中的查询,这样速度理论上来说应该能提高80%.然后如果还是不是很理想,你可以想办法在每个视图中加入索引.估计性能会再好点.建立视图
            Thread CreateViewThread = new Thread(ThreadBegin);
            ThreadStart ThreadBegin = new ThreadStart(CreateView);
            public void CreateView()
            {
               //Sql 脚本语言创建VIEW 
            }SQl:
    Create View StateuIs0
    select * from myTable t where t.status=0 
    Create View StateuIs1
    select * from myTable t where t.status=1
    ....注:CreateViewThread 线程你可以在程序空闲的时候开启,应该不会有什么影响.
      

  19.   

    在STATUS 上建个索引,速度会很快了
      

  20.   

    建立type字段索引,速度至少要快10倍
      

  21.   

    MARK
    PS: 
    我的目标是 ----> ^_^
      

  22.   

    不要用select *,在数据库中建立索引。
      

  23.   


    谢谢各位兄弟,问题解决了。还是SQL语句的问题。数据库这边的表没有问题,建立的索引也没问题,存储过程也没问题。结果是程序那边调用存储过程时传递过来的SQL语句多加了一个order by xxx 做了一次排序,导致这个了问题。
      

  24.   

    再请教一个问题。如果优化使用 like 来进行模糊查询的语句呢?
    我尝试过建立索引,使用系统函数instr代替,全文检索,效果都没我想象中那样好。不知道各位兄弟姐妹还有其他的什么方法优化吗?