Performance Oracle中带Insert的CTE
我正在用CTE在oracle中运行一个查询。 当我执行查询时,它在select语句中工作得很好,但当我使用insert语句时,它需要足够的时间来执行Performance Oracle中带Insert的CTE,performance,oracle,insert,Performance,Oracle,Insert,我正在用CTE在oracle中运行一个查询。 当我执行查询时,它在select语句中工作得很好,但当我使用insert语句时,它需要足够的时间来执行 INSERT INTO port_weeklydailypricesTest (co_code,start_dtm,end_dtm) SELECT * FROM ( WITH CTE(co_code, start_dtm, end_dtm) AS (
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
);
如您所说,如果SELECT本身的性能令人满意,那么问题一定在于语句的INSERT部分 有许多因素可能会导致插入运行缓慢: 最有可能的情况是目标表上存在一个触发器,它执行一些非常昂贵的操作。 另一种可能性是,insert正在等待一个锁定的资源,比如其他进程在目标表上有一个排他的表级锁,或者其他共享资源,比如代码控制表。 这可能是存储分配问题、链接或行迁移、索引过多或派生列过多。 也许这是由于硬件——网络动力不足、互连不可靠、磁盘不好。
这绝非详尽无遗。顶部的项目是您应该能够调查和解决的应用程序问题。列表越靠下,您就越有可能需要现场DBA的帮助。如您所说,如果SELECT本身的性能令人满意,那么问题一定出在语句的INSERT部分 有许多因素可能会导致插入运行缓慢: 最有可能的情况是目标表上存在一个触发器,它执行一些非常昂贵的操作。 另一种可能性是,insert正在等待一个锁定的资源,比如其他进程在目标表上有一个排他的表级锁,或者其他共享资源,比如代码控制表。 这可能是存储分配问题、链接或行迁移、索引过多或派生列过多。 也许这是由于硬件——网络动力不足、互连不可靠、磁盘不好。
这绝非详尽无遗。顶部的项目是您应该能够调查和解决的应用程序问题。列表越靠下,您就越可能需要现场DBA的帮助。请使用我这次为您提供的代码格式。为什么要插入记录?为什么不使用视图?请使用我这次为您提供的代码格式。为什么要插入记录?为什么不使用视图?一个警告是,根据数据库的优化器目标,可以针对第一行优化选择。插入总是针对所有_行进行优化,因为它是一次执行。因此,您可以使用EXPLAIN计划检查这两个语句,并查看是否存在差异。一个警告是,根据数据库的优化器目标,可以针对第一行优化a SELECT。插入总是针对所有_行进行优化,因为它是一次执行。所以你可以用解释计划来检查这两种说法,看看是否有区别