我有2张千万数量级的表,即用户表和成绩表,“用户表”里有5个字段:学号XH(字符型)、姓名XM(字符型)、出生年月CS(日期型)、身份证号SFZH(字符型)、注册时间ZC(日期型);
“成绩表”里有2个字段:学号XH(字符型)、成绩CJ(数字型)。现要求写一个查询SQL语句,要求最优化的,查询速度最快的:1、要求这两张表要关联;2、根据姓名、出生年月、身份证号、注册时间的多条件进行查询,其中姓名和身份证号是要全模糊查询的,我原来是这样写的:select * from 用户表 a, 成绩表 b where a.XH=b.XH and XM like ''%'+Edit1.text+'%'' and a.CS>=to_date('''+Edit2.text+''','YYYY-MM-DD') and a.CS<=to_date('''+Edit3.text+''','YYYY-MM-DD') and a.SFZH like ''%'+Edit4.text+'%'' and a.ZC>=to_date('''+Edit5.text+''','YYYY-MM-DD HH24:mi:ss') and a.ZC<=to_date('''+Edit6.text+''','YYYY-MM-DD HH24:mi:ss')可是,这样写执行效率非常低(前提已经把学号、姓名、身份证号、注册时间都加了索引),请问大侠还有什么更好的写法?可以写成分页的也行,如ROWNUM>=0 and ROWNUM<=100的也行,总之,一定要执行效率高的。谢谢!
“成绩表”里有2个字段:学号XH(字符型)、成绩CJ(数字型)。现要求写一个查询SQL语句,要求最优化的,查询速度最快的:1、要求这两张表要关联;2、根据姓名、出生年月、身份证号、注册时间的多条件进行查询,其中姓名和身份证号是要全模糊查询的,我原来是这样写的:select * from 用户表 a, 成绩表 b where a.XH=b.XH and XM like ''%'+Edit1.text+'%'' and a.CS>=to_date('''+Edit2.text+''','YYYY-MM-DD') and a.CS<=to_date('''+Edit3.text+''','YYYY-MM-DD') and a.SFZH like ''%'+Edit4.text+'%'' and a.ZC>=to_date('''+Edit5.text+''','YYYY-MM-DD HH24:mi:ss') and a.ZC<=to_date('''+Edit6.text+''','YYYY-MM-DD HH24:mi:ss')可是,这样写执行效率非常低(前提已经把学号、姓名、身份证号、注册时间都加了索引),请问大侠还有什么更好的写法?可以写成分页的也行,如ROWNUM>=0 and ROWNUM<=100的也行,总之,一定要执行效率高的。谢谢!
like '%x%' 的情况不走索引,走全表扫描,所以,你建立的所有索引都没用。先看看执行计划
你只会走一个索引!那边是CS、ZC其中的一个!
如果CS和ZC已经可以将结果集限制到比较小,那么你可以去了其他两个列的索引!
如果你是在要在like列加索引:
只能加:
create index 索引名 on 表(列名[,列名]) indextype is CTXSYS.CONTEXT;
将like改写为:contains(列名,:paramete)>0
利用hint:提示下!可以让查询走到所有索引!