查询Oracle的性能不一致的行为(Oracle inconsistent performance

2019-10-22 04:30发布

考虑下面的查询:

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驱动程序和我的应用程序,这样是没有问题的根源。

Answer 1:

显然,国家语言支持或NLS参数有什么用它做。 Oracle SQL Developer中已经将它们设置为根据您所在区域的“荷兰”,默认设置,而SQuirreL中有它设置为BINARY。 这种差异所作的优化使用不同的路径来解决查询。 为了使用正确的NLS_SORT参数在JDBC会议的下列命令需要使用:

ALTER SESSION SET NLS_SORT=BINARY

那么正确的指标将在查询中使用。



文章来源: Oracle inconsistent performance behaviour of query