客户端和服务端都是jave的程序,服务端有一个服务就是一个查询sql。用loadrunner做压力测试,模拟10个客户端调用服务。oracle所在的服务器cpu占用接近100%。SELECT
  A.ID AS ID
FROM 
    A,
    B
WHERE A.ID=B.ID 
AND A.SS=B.SS 
and A.A_date=to_date('2009-11-22','yyyy-mm-dd')
其中A表ID是主键,B表ID和MM是组合主键,两个表主键都建立了索引。
查询计划中B表是全表扫描,A表使用了索引。
A表大约2000条记录,B表大约4000条记录。应用服务器cpu占用很低,数据库服务器和应用服务器性能都比较好,是专门用来做压力测试的,数据库是oracle 9i。在什么情况下一个简单的查询会占满数据库服务器的CPU呢

解决方案 »

  1.   

    查询结果得到了?正确的结果?and A.A_date=to_date('2009-11-22','yyyy-mm-dd')A_DATE是什么类型的,去掉此句呢,
      

  2.   

    访问数据库用mybatis 2.3.5
    数据库4cpu
    A_DATE是date类型,去掉还没试过,明天试试,感觉没有什么大关系啊
    执行计划明天贴一下
      

  3.   

    执行计划:
    SELECT STATEMENT, GOAL = CHOOSE
     NESTED LOOPS
      TABLE ACCESS FULL username B
      TABLE ACCESS BY INDEX ROWID username A
       INDEX UNIQUE SCAN username A_PK
      

  4.   

    试试对a表A_date字段建索引,对b表建(id,ss)的组合索引
      

  5.   

    b表有组合索引,a表查询条件有很多,a_date只是其中一种可能。不可能每个字段都建索引,即使全表扫描,2000多条数据也不至于这样吧。
      

  6.   

    A_date字段建索引后,cpu降了一些,降到82%,还是很高
      

  7.   

    B表在id,ss,和a_date字段上建立组合索引,然后在a表的id上唯一索引呢?
      

  8.   

    你这几千条数据,loadrunner压500并发没撒问题,
      

  9.   

    针对CPU高的时间段做ASH报告,看主要等待事件和Top SQL是什么? lib catch做spin也相当耗费cpu,sort,未绑定变量做硬解析也耗费CPU,看看是什么原因卡住了。
      

  10.   

    ---先把过滤条件位置调换下
    SELECT A.ID AS ID
    FROM  B,A
    WHERE 
    A.A_date=to_date('2009-11-22','yyyy-mm-dd') and
    A.ID=B.ID AND A.SS=B.SS 
     
      

  11.   

    lib catch做spin也相当耗费cpu这是什么意思
      

  12.   

    内存竞争,CPU不断去找是不是有空闲内存。只有多核(CPU)才会发生这种情况。