考虑下面的查询:
SELECT *
FROM (
SELECT ARRM.*, ROWNUM
FROM CRS_ARRANGEMENTS ARRM
WHERE
CONCAT(ARRM.NBR_ARRANGEMENT, ARRM.TYP_PRODUCT_ARRANGEMENT) >
CONCAT('0000000000000000', '0000')
ORDER BY
ARRM.NBR_ARRANGEMENT,
ARRM.TYP_PRODUCT_ARRANGEMENT,
ARRM.COD_CURRENCY)
WHERE ROWNUM < 1000;
这个查询在具有10个000 000条目的表运行。 当从运行的Oracle SQL Developer或我的应用程序查询它需要4分钟跑 ! 不幸的也是我写的应用程序内的行为。 从1000的值更改为10根本没有影响,这表明它是做一个全表扫描。
但是从运行的SQuirreL查询时, 在几毫秒内返回。 这怎么可能? 解释SQuirreL中生成的计划,得到:
但不同的解释计划在Oracle SQL Developer中产生的,对于同一个查询:
任何想法,这种行为差异是如何可能的? 我无法理解。 我试着用JPA和原始JDBC。 在应用程序中,我需要通过所有10个000 000记录,分析和此查询用于寻呼,所以等待四分钟一不是一种选择(这将耗费27天)。
注 :我使用的松鼠一样Oracle JDBC驱动程序和我的应用程序,这样是没有问题的根源。