select distinct a.code,b.ip, g.techname, d.name
  from t1 a, t2 d, t3 g
 where a.line in('5681','5693','5671')
   and a.no = g.no
   and a.code = d.code主要是 in那里 大侠们怎么优化优化???SQL PLSQL、语句优化

解决方案 »

  1.   

    1)line这个字段上有索引吗?
    2)改成exists试试效果会怎样?
      

  2.   

    每个表的数据量多大?
    可以考虑在A 表的line no code 建索引!
    B表的No建索引
    G表的code 建索引!
      

  3.   

    a.line in('5681','5693','5671')
    可以给line 加索引
    效率慢应该不是这个IN造成的,一般都是关联了大造成查询效率低,
    从SQL来看应该是t1 a, t3 g中有一个大表,
    建议给大表的no 字段加索引就OK!!!
      

  4.   

    SELECT DISTINCT MT.CODE,G.TECHNAME, D.NAME
    FROM(
    SELECT A.CODE, A.NO
    FROM T1 A
    WHERE A.LINE IN ('5681','5693','5671')) MT
    LEFT OUTER JOIN T2 D ON MT.NO = D.NO
    LEFT OUTER JOIN T3 G ON MT.CODE = G.CODELINE上面要建索引,看你这三个条件的数据量,IN会走索引的。
    你的T2, T3表直接拿来关联,有没有什么条件可以过滤T2, T3. 可以优化。
    DISTINCT 可以考虑其他写法。
      

  5.   

    SELECT DISTINCT MT.CODE,G.TECHNAME, D.NAME, RANK() PARTITION BY (ORDER BY MT.CODE, G.TECHNAME, D.NAME) MYRANK
    FROM(
    SELECT A.CODE, A.NO
    FROM T1 A
    WHERE A.LINE IN ('5681','5693','5671')) MT
    LEFT OUTER JOIN T2 D ON MT.NO = D.NO
    LEFT OUTER JOIN T3 G ON MT.CODE = G.CODE
    WHERE MYRANK = 1
    看这个行不行。不行再调。