两个表pub_goods_price和resa_sa_dtl 
------------------------------------------
select count(1) from pub_goods_price   ---387370条记录           ---0.562秒
select count(1) from resa_sa_dtl       ---3348437条记录          ---54.297秒
------------------------------------------
resa_sa_dtl 表索引
-----------------------
CREATE INDEX FBS.RESA_SA_DTL_GOODSID_IDX
ON FBS.RESA_SA_DTL
(GOODSID)
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE INDX
STORAGE(INITIAL 80384K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
LOGGING
/
----------------
CREATE INDEX FBS.RESA_SA_DTL_USEDAY_IDX
ON FBS.RESA_SA_DTL
(USEDAY)
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE INDX
STORAGE(INITIAL 80384K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
LOGGING
/
----------------
CREATE INDEX FBS.RESA_SA_DTL_COUNTERID_IDX
ON FBS.RESA_SA_DTL
(COUNTERID)
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE INDX
STORAGE(INITIAL 80256K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
LOGGING
/------------------------------------------
pub_goods_price表索引
-----------------------
CREATE UNIQUE INDEX FBS.PUB_GOODS_PRICE_PK
ON FBS.PUB_GOODS_PRICE
(GOODSID, PRICEID)
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE INDX
STORAGE(INITIAL 9984K NEXT 128K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
LOGGING
/
--------------------------
 执行 ---73.406 秒 
select a.useday,counterid,sum(a.realmoney) xsje,count(distinct rsaid) lks
from resa_sa_dtl a where to_char(a.useday,'yyyy-mm-dd')='2010-07-24' 
group by a.useday,counterid
-------------------------------
我想统计以下数据,可是运行了半个小时也没出来,通过什么方法,能实现5分钟查出结果?
--------------------------------
select a.useday,counterid,sum(a.realmoney) xsje
,sum(a.goodsqty*b.price) cbje ,sum(a.realmoney-a.goodsqty*b.price) ml
,count(distinct rsaid) lks
from resa_sa_dtl a,PUB_GOODS_PRICE b where 
 a.goodsid=b.goodsid  and b.priceid=5 and  to_char(a.useday,'yyyy-mm-dd')='2010-07-24' 
 group by a.useday,counterid

解决方案 »

  1.   


    SELECT A.USEDAY,
           COUNTERID,
           SUM(A.REALMONEY) XSJE,
           SUM(A.GOODSQTY * B.PRICE) CBJE,
           SUM(A.REALMONEY - A.GOODSQTY * B.PRICE) ML,
           COUNT(DISTINCT RSAID) LKS
      FROM RESA_SA_DTL A, PUB_GOODS_PRICE B
     WHERE A.GOODSID = B.GOODSID
       AND B.PRICEID = 5
       ----这里不要用TO_CHAR,会导致你的索引FBS.RESA_SA_DTL_USEDAY_IDX失效,第一个sql也改下,速度会快很多。
       AND A.USEDAY BETWEEN  
           TO_DATE('2010-07-24 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND
           TO_DATE('2010-07-24 23:59:59', 'yyyy-mm-dd hh24:mi:ss')
     GROUP BY A.USEDAY, COUNTERID
      

  2.   

    2点,
    1、第一楼主注意,RESA_SA_DTL_USEDAY_IDX是针对日期的索引,不能在条件语句中to_char,这样会使索引失效,要使用to_date转换。
    2、PUB_GOODS_PRICE_PK为联合索引,2个字段必须同时建立关系,不然索引没有驱动,也会很慢。