现在有两张表,字段结构基本上相同,现在要查这两张表返回的结果集使用的是union allselect  
t.line_id as lineId,t.item as item,t.name,t.created_on as createdOn,t.require_time as requireTime,
t.supplier_name as supplierName,t.producter as producter,t.status_flag as statusFlag 
from

select  line_id,item,name ,created_on,require_time,supplier_name,producter,status_flag 
from Mes_Mp_Material_Outside 
where item is not null 
union all  
select  line_id,item,name,created_time,require_time,supplier_name,producter,status_flag 
from Mes_Mp_Material_Seq 
where outside_id is not null) as t 返回一百多万条数据       总共花了 两分钟半的时间
怎么样优化列,让他几秒钟就能全部查出来  后面还要跟条件判断

解决方案 »

  1.   

    不要使用not in,它会进行一次全表遍历的子查询(即使字段上有索引也是不使用该索引的),用NOT EXISTS试试
    而且把你的判断条件加在里面的两个union all子查询上,能过滤大量数据的条件放到where的最后面
      

  2.   

    貌似楼主的SQL没有NOT IN楼主也没说数据库是什么,为什么要把过滤大量数据的条件放到where的最后面?百万条数据两分钟我觉得很正常啊楼主是在什么环境下执行SQL的?如果是Oracle在PL/SQL里执行的话,PL/SQL的图形界面会报内存溢出的如果是程序里执行,这么多数据也一样会内存溢出吧问数据库优化,要至少给出表结构,表间关系,数据量,要做的操作和具体业务这么问,很难回答诶
      

  3.   

    item is not null 
    是不会应用索引的,因为索引是不索引空值的。
    建议改成item>0或者item>'',不允许字段为空,而用一个缺省值代替空值.
    前提是你建立了索引
      

  4.   

    把where条件写到里边去试试。 如果返回信息数目有限制,就在里边返回n*2条
      

  5.   

    是在sql下面执行的,两张表暂时不考虑他们的关系,然后查询这两张表返回的结果集,还有些判断条件,为什么union all和order by  <t>一起用速度会非常慢,能不能几秒钟就能全查出来列?