现有三张表:
     a表记录的是手机号码,以及其他信息
     b表记录号段,就是手机号码前7或者8位,还有就是这个号段属于的市id,以及市名称
     c表记录省市信息,其中有省id,市id,市名称
我要用这三张表关联,获得某省某市的信息,sql如下
     select t3.provinceid,t3.cityid,t1.*
       from a t1,b t2,c t3
      where (substr(t1.phoneid,1,7)=t2.segment or substr(t1.phoneid,1,7)=t2.segment)
        and t2.cityname =t3.cityname --市名称是唯一的,自辖市市id会有重复
数据库性能不会差到哪里去,a表有4,50w数据,b,c都几万出头,但是查询的时候基本跑一夜也跑不出数据,
将a表数据保留1000条,查询会有数据
请问下各位达人,我要分析这个数据库需要从哪些方面下手另,我将b,c表导入到新表b1,c1,再用上面的查询语句查询,速度还算正常感谢大家啦

解决方案 »

  1.   

    你将表导入新表,会降低高水位,高水位是会导致查询变慢的。 楼主原来的表里有做过大量的delete 操作吗? 
    看一下执行计划。 把执行计划贴出来。 还有收集一下统计信息,在看下执行计划。 Oracle 高水位(HWM: High Water Mark) 说明
    http://blog.csdn.net/tianlesoftware/article/details/4707900Oracle Statistic 统计信息 小结
    http://blog.csdn.net/tianlesoftware/article/details/4668723Oracle 执行计划(Explain Plan) 说明
    http://blog.csdn.net/tianlesoftware/article/details/5827245
      

  2.   

    a表其实是个动态表,比如表名位xx20110911,11号那天产生的业务数据,通过别的系统生成文档,然后我们系统会将文档里的内容导入到xx20110911表中,每天的做法都一样,所以不存在delete
    同样b,c表的数据都是通过这样的方式确保每日获得最新的数据
    只不过b,c是静态表,可能java程序里面对其进行的是delete操作,删除昨天的,导入今天新的表因为每天都更新,所以没有涉及索引和主外键,所以执行计划应该无法捕捉到路线吧
      

  3.   

    分別對substr(t1.phoneid,1,7),substr(t1.phoneid,1,7)建立兩個函數索引看看.