2010-07-15 7 views
-1

Je cours une requête dans Oracle avec CTE. Quand je exécuter la requête, il fonctionne très bien dans l'instruction select, mais quand je l'utilise INSERT prend suffisamment de temps pour execute.Any l'aide ici est le codeCTE avec insertion dans Oracle

INSERT INTO port_weeklydailypricesTest (co_code,start_dtm,end_dtm) 
    SELECT * FROM 
     (
      WITH CTE(co_code, start_dtm, end_dtm) AS 
      (
       SELECT co_code              , 
       CAST(NEXT_DAY(MIN(dlyprice_date),'FRIDAY')-6 AS DATE) start_dtm , 
       CAST(NEXT_DAY(MIN(dlyprice_date),'FRIDAY') AS DATE)  end_dtm 
       FROM feed_dlyprice 
       GROUP BY co_code 
       UNION ALL 
       SELECT co_code  , 
       CAST(TO_CHAR(end_dtm + INTERVAL '1' DAY,'DD-MON-YYYY') AS DATE), 
       CAST(TO_CHAR(end_dtm + INTERVAL '7' DAY,'DD-MON-YYYY') AS DATE) 
       FROM CTE 
       WHERE CAST(end_dtm AS DATE) <= TO_CHAR(TO_DATE(SYSDATE+1,'DD-MON-YYYY')) 
      ) 
      SELECT co_code,start_dtm,end_dtm 
      FROM CTE 
     ); 
+1

Veuillez utiliser la mise en forme de code fournie (je l'ai fait pour vous cette fois). –

+0

Pourquoi insérer les enregistrements du tout - Pourquoi ne pas utiliser une vue? –

Répondre

2

Si, comme vous le dites, la performance du SELECT à lui seul, le problème doit résider dans la partie INSERER de la déclaration.

Il y a un certain nombre de choses qui pourrait provoquer un insert à courir lent:

  • Le plus probable est la présence d'un déclencheur sur la table cible qui exécute quelque chose de très cher. Une autre possibilité est que l'insertion attende une ressource verrouillée (disons qu'un autre processus a un verrou de niveau table exclusif sur la table cible, ou une autre ressource partagée telle qu'une table de contrôle de code).
  • Il peut s'agir d'un problème d'allocation de stockage, de chaînage ou de migration de ligne, d'un trop grand nombre d'index ou d'un grand nombre de colonnes dérivées.
  • peut-être qu'il s'agit de matériel - réseau sous-alimenté, interconnexions douteuses, un mauvais disque.

Ceci n'est en aucun cas exhaustif. Les éléments en haut sont des problèmes d'application que vous devriez pouvoir étudier et résoudre. Plus vous descendez la liste, plus vous avez de chances d'avoir besoin d'aide pour un DBA sur site.

+1

Un avertissement est le SELECT peut être optimisé pour FIRST_ROWS (en fonction de l'objectif optimiseur de la base de données). Un INSERT est toujours optimisé pour ALL_ROWS car il s'agit d'une seule exécution. Donc, vous pouvez consulter les deux déclarations avec un PLAN EXPLAIN et voir s'il y a une différence –