gpt4 book ai didi

java - Oracle查询的性能行为不一致

转载 作者:太空宇宙 更新时间:2023-11-04 06:09:41 25 4
gpt4 key购买 nike

考虑以下查询:

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 中生成的计划给出:

Explain plan in SQuirreL

但是对于相同的查询,Oracle SQL Developer 中会生成不同的解释计划:

Explain plan in Oracle SQL Developer

你知道这种行为差异是怎么可能的吗?我无法理解它。我尝试使用 JPA 和原始 JDBC。在应用程序中,我需要解析所有 10 000 000 条记录,并且此查询用于分页,因此等待 4 分钟不是一个选择(这将需要 27 天)。

注意:我在 SQuirreL 和我的应用程序中使用相同的 Oracle jdbc 驱动程序,因此这不是问题的根源。

最佳答案

显然,国家语言支持或 NLS 参数与此有关。 Oracle SQL Developer 将它们设置为“荷兰语”,这是基于您的区域设置的默认设置,而 SQuirreL 将其设置为 BINARY。这种差异使得优化器使用不同的路径来解决查询。为了在 jdbc session 中使用正确的 NLS_SORT 参数,需要使用以下命令:

ALTER SESSION SET NLS_SORT=BINARY

然后将在查询中使用正确的索引。

关于java - Oracle查询的性能行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28896564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com