1. 表是否作过统计了?
   analyze table khdd compute statistics;
   analyze table khddbh compute statistics;   然后写一个简单的测试语句,例如
    select count(*) from khdd where khddbh='01'
    看一下查询计划,索引是不是用上了 2. 究竟有没有必要一次取这么多数据出来???
    数据库什么版本? 优化器用的是CBO,还是RBO?
    如果是RBO,扫描时是自右向左,即from子句最外层的作为驱动表。 3. 两个大表连接代价是很高的,试着将嵌入查询(NESTED loop)
    改为HASH JOIN,或者强制指定HINTS试试。  

解决方案 »

  1.   

    select * from psb,khdd where psb.khddbh = khdd.khddbh这语句怎么都快不了  特别是 psb.khddbh = khdd.khddbh 有很多相同项得时候[email protected] >select count(*) from t1;  COUNT(*)
    ----------
       1739072已用时间:  00: 00: [email protected] >select count(*) from t2;  COUNT(*)
    ----------
        196608已用时间:  00: 00: [email protected] >select count(*) from t1,t2 where t1.owner=t2.username;  COUNT(*)
    ----------
       2097152    -- 这比任何一个表得数据都多已用时间:  00: 00: 05.00Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1784 Card=1 Bytes=30)
       1    0   SORT (AGGREGATE)
       2    1     HASH JOIN (Cost=1784 Card=1739072 Bytes=52172160)
       3    2       INDEX (FAST FULL SCAN) OF 'IND_T2' (NON-UNIQUE) (Cost=42 Card=196608 Bytes=2555904)
       4    2       INDEX (FAST FULL SCAN) OF 'IND_T1' (NON-UNIQUE) (Cost=385 Card=1739072 Bytes=2956422
              4)
      

  2.   

    oracle可以优化,也必须优化。
      

  3.   

    根据Oracle优化路径
    rule 模式下的规则:1、有两个索引存在的情况下,from后面大表在前。小表(返回记录少的表,不是记录少的表)在最后,作为驱动表,Oracle处理SQL语句是从左到右2、有一个索引,则顺序无关3、都没有索引,则大表应该在后
      

  4.   

    现在有两个表,分别是客户订单表(khdd),派送表(psb),两个表都有客户订单编号(khddbh)字段,均为字符型,其中khdd表30多万条数据,psb表大约150万条数据,两个表都建有khddbh字段的索引,执行如下sql语句:select * from psb,khdd where psb.khddbh = khdd.khddbh:
    你这查询根本用不上,哪有你这样看订单的?对于你这么大的表,建议用以下查询方法:
    select * 
    from
    (
    select * from khdd where ...
    ) a,
    (
    select * from psb where ...
    ) b
    where a.khddbh = b.khddbh这试过,这样查询,比一般的查询快了10倍左右!
    原因是:它这两个子查询已经去掉很多数据,省去了大量不必要的连接
    再者:最后的where它还能用到两个子查询的表的索引!
      

  5.   


     楼上说的方法就是hash join. 确实,在有些情况下,它的效率比嵌入查询高.
      

  6.   

    你说Oracle比SQLServer慢吗?如果在比较低的硬件配置下,Oracle的性能比SQL server差是正常的。
      

  7.   

    select * from psb,khdd where psb.khddbh = khdd.khddbh 改为
    select * from khdd,psb where khdd.khddbh = psb.khddbh