我用的是Oracle9i数据库,SQL语句如下:
SELECT d.bureau_name, b.user_name, b.bind_tel, b.u_adsl_id, a.begintime, a.endtime, a.source, c.user_name,a.error_no
FROM t_accept_cases a, t_adsl_users b, t_sys_users c, t_bureaus d 
WHERE a.a_user_id = b.a_user_id
AND a.s_user_id = c.s_user_id(+) 
AND b.bureau_id = d.bureau_id
AND b.bureau_id = 'B00215'
AND a.begintime >= TO_DATE('2007-03-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') 
其中t_accept_cases表大约有30万条记录。
执行了该条SQL语句,过了10多分钟也不见查询结果返回。试着在该SQL语句中去掉了最后一个AND子句即“AND a.begintime >= TO_DATE('2007-03-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') ”然后执行,不到1秒就返回了查询结果。后在t_accept_cases表的begintime字段上加了索引,重新执行原来的SQL语句,结果还是一样,过了10多分钟也不见查询结果返回。为何多了这个限制时间的条件后,查询速度会一落千丈呢?恳请各位高手相助!

解决方案 »

  1.   

    SELECT d.bureau_name, b.user_name, b.bind_tel, b.u_adsl_id, a.begintime, a.endtime, a.source, c.user_name,a.error_no
    FROM t_accept_cases a, t_adsl_users b, t_sys_users c, t_bureaus d 
    WHERE a.begintime >= TO_DATE('2007-03-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
    and a.a_user_id = b.a_user_id
    AND a.s_user_id = c.s_user_id(+) 
    AND b.bureau_id = d.bureau_id
    AND b.bureau_id = 'B00215'你把这个时间条件放到紧跟WHERE后面的位置试试看 
      

  2.   

    sqlplus支持执行分析,你分析下看,执行这条语句时是否用到了BeginTime索引。
      

  3.   

    我把a.begintime子句提到前面也是老样子。我刚才select COUNT(*) FROM t_accept_cases一下,结果只有二百多条数据,原来的上万条数据上午被人删过了,这样下来查询速度应该飞快才是,但奇怪的是select COUNT(*) FROM t_accept_cases这条语句执行也花了7秒多,怎么回事,我把数据库服务器重启了试一下,还是老样子