我插入的时候用的是insert into a() select 字段 from  我直接执行那个 select语句8秒出来结果可是不知道为什么如果全部执行的话 非常的慢,什么原因啊

解决方案 »

  1.   

    就一个select都需要八秒啊?
      

  2.   

    insert+select
    数据库是要先读一遍数据然后在写一遍数据,只读的时候8秒钟,再插入,我想就不只8秒了,我认为写磁盘要比读磁盘还要慢;
    还有,如果插入数据,那么数据库还要建立索引,如果索引列很多将会更慢!你可以拿出来你的目标表结构看看!
      

  3.   

    插入的表
    create table T_ANALYSIS
    ( FID          NUMBER(10) primary key ,
      USERID       NUMBER(5),
      CID          NUMBER(5),
      LOGDATE      DATE,
      FCUSTERID    NUMBER(10),
      CUSTERNAME   VARCHAR2(50),
      FCHANNELID   VARCHAR2(20),
      FCHANNELNAME VARCHAR2(50),
      ORDERCOUNT   NUMBER(10),
      ORDPEOPLE    NUMBER(10),
      ORDINCOME    NUMBER(10) 
      
    )
      

  4.   

    少量 insert,多次 commit。
    事务越短越好
      

  5.   

    INSERT INTO T_ANALYSIS
      (FID,USERID,FCHANNELID,ORDINCOME)
      SELECT SEQ_ANALYSIS.Nextval,USERID,
            
             FCHANNELID,
            
             ORDINCOME
        FROM (SELECT C.USERID,
                     C.CID,
                     NULL LOGDATE,
                     TO_NUMBER(A.FCUSTERID) FCUSTERID,
                     TO_NUMBER(A.FCUSTERID) CUSTERNAME,
                     A.FCHANNELID,
                     A.FCHANNELNAME,
                     NVL(SUM(ROUND(A.ORDERCOUNT * B.FSMSDB)), 0) ORDERCOUNT,
                     NVL(SUM(ROUND(A.ORDPEOPLE * B.FSMSUSER)), 0) ORDPEOPLE,
                     NVL(SUM(ROUND(A.ORDINCOME * B.FSMSDB)), 0) ORDINCOME
                FROM (SELECT TO_CHAR(A.LOGDATE, 'YYYY-MM-DD') LOGDATE,
                             TO_NUMBER(A.FCUSTERID) FCUSTERID,
                             TO_NUMBER(A.FCUSTERID) CUSTERNAME,
                             A.FCHANNELID,
                             A.FCHANNELNAME,
                             NVL(SUM(A.ORDERCOUNT), 0) ORDERCOUNT,
                             NVL(SUM(A.ORDPEOPLE), 0) ORDPEOPLE,
                             NVL(SUM(A.ORDINCOME), 0) ORDINCOME
                        FROM (SELECT T.LOGDATE,
                                     T.FPROVINCE,
                                     T.FCUSTERID,
                                     T.CUSTERNAME,
                                     T.FCHANNELID,
                                     T.FCHANNELNAME,
                                     T.ORDERCOUNT,
                                     T.ORDPEOPLE,
                                     T.ORDINCOME,
                                     T.INCOMEFLAG
                                FROM T_DAYLOG_SMSINCOME_FRONT T
                               WHERE T.LOGDATE >= '26-5月 -08'
                                 AND T.LOGDATE < '30-6月 -08'
                                 AND T.PARTID >= '0526'
                                 AND T.PARTID < '0630'
                                 AND T.HSFLAG = 1
                                 AND T.FCHANNELID NOT LIKE '106230309281%'
                                 AND T.FCHANNELID NOT LIKE '106208899281%'
                                 AND T.FCHANNELID NOT LIKE '106660609881%'
                                 AND T.FCHANNELID NOT LIKE '106230309281%'
                                 AND T.FCHANNELID NOT LIKE '106208899281%'
                                 AND T.FCHANNELID NOT LIKE '106660609881%') A
                       WHERE 1 = 1
                         AND A.INCOMEFLAG = 1
                       GROUP BY TO_CHAR(A.LOGDATE, 'YYYY-MM-DD'),
                                TO_NUMBER(A.FCUSTERID),
                                A.FCHANNELID,
                                A.FCHANNELNAME,
                                A.FPROVINCE
                       ORDER BY 1) A
               INNER JOIN (SELECT USERID, CID
                            FROM T_MPNEW_USER
                           WHERE USERID < 1000) C ON A.FCUSTERID = C.CID
               INNER JOIN (SELECT T.FID, T.FTIME, T.FSMSDB, T.FSMSUSER
                            FROM EMBED_COOPERATION_LIST T
                           WHERE T.FTIME >= '2008-05-26'
                             AND T.FTIME < '2008-06-30') B ON (A.LOGDATE =
                                                              B.FTIME AND
                                                              B.FID =
                                                              TO_CHAR(C.USERID))
               WHERE 1 = 1
               GROUP BY NULL,
                        TO_NUMBER(A.FCUSTERID),
                        A.FCHANNELID,
                        A.FCHANNELNAME,
                        C.CID,
                        C.USERID
               ORDER BY 1) A
      

  6.   

    执行下面的select 只要几秒,但是执行insert 就特别的慢
      

  7.   

    插入当然要慢很多,如果有索引那么插入和更新与直接查询的效率会相差很多。   在那个T_ANALYSIS 表中,fid是主键,我在userid上建了一个索引,结果还是和原来一样
      

  8.   

    插入当然要慢很多,如果有索引那么插入和更新与直接查询的效率会相差很多。
      在T_ANALYSIS 中我建了一个主见FID,在userid上建了一个 索引 ,结果还是和原来一样
      

  9.   

    --去掉Order by语句 ,试试
    --Order by 语句影响执行效率
      

  10.   

    不是显示用的sql语句
    一律把order by 去掉
    估计可以节省一半的时间
      

  11.   

    这个不一定!如果一个子查询中的结果集是已序的,那么很有可能会提高整个SQL的执行效率!
    例如:
    select t1.id,t2.a,t2.b,t1.c
    from t1,(select id,a,b from t order by id) t2
    where t1.id=t2.id
    实践中体会到的,id是索引