【发布时间】:2019-12-30 18:51:48
【问题描述】:
我一直在尝试以最有效的方式从数据库中获取一组值,并将它们与各自的子字符串进行比较以保存特定值...这是一个示例:
我有这张表,其中包含一个 PRODUCT(ID),来自 LVL - 7 中的那些我必须对这些值进行子串化,直到我到达 LVL1
LVL PRODUCT DESCRIPTION
5 01AR2TGELL DESLVL5
6 01AR2TGELLGS DESLVL6
7 01AR2TGELLGSQKA DESLVL7
6 01AR2TGELLDE DESLVL6
7 01AR2TGELLDEUDP DESLVL7
7 01AR2TGELLDEUZN DESLVL7
所以我可以得到这样的东西:
LVL PRODUCT DESCRIPTION | LVL PRODUCT DESCRIPTION | LVL PRODUCT DESCRIPTION
7 01AR2TGELLGSQKA DESLVL7 | 6 01AR2TGELLGS DESLVL6 | 5 01AR2TGELL DESLVL5
7 01AR2TGELLDEUDP DESLVL7 | 6 01AR2TGELLDE DESLVL6 | 5 01AR2TGELL DESLVL5
7 01AR2TGELLDEUZN DESLVL7 | 6 01AR2TGELLDE DESLVL6 | 5 01AR2TGELL DESLVL5
我正在使用 Java(要求),并且我正在使用 JDBC 连接到 Oracle DB。我所做的是通过查询从 LVL7 中获取所有值,然后将所有这些值保存在 ArrayList 中,然后使用 LVL 和 PRODUCT 子字符串的值比较这些值,如下所示:
"select * from PRODHIERARCHY where LVL=7"
"select * from PRODHIERARCHY WHERE LVL= 6 AND PRODUCT_HIERARCHY="+"'"+descLv7.get(j).substring(0, descLv7.get(j).length() - 4)+"'"
我的问题是,大约有。 3.5 万个 LVL7 值,总共大约 6.5 万个,因此效率非常低。 (获得 35,000 个 LVL7 值大约需要 3 分钟,因为 DB 正在处理所有内容,当它与 ArrayList 进行比较时,每个 LVL 大约需要 30 分钟)。
谁能推荐我一种方法来修改查询或我的比较过程,使其与第一个查询所需的时间大致相同?谢谢!
【问题讨论】:
-
补充一下,我还有另外两种方法:一种是与最后一个值进行比较,但每次比较每个 LVL 时都需要建立新的连接,这比我的主要解决方案要多得多。另一个不需要建立新连接,但我不断收到 java.sql.SQLException: Exhausted Resultsset
-
你好!我不太了解数据库结构,所以我可以提供更好的建议。但我可以推荐的是 1) 索引您需要搜索的列。您可以使用基于函数的索引example 2) 或者您可以放置一些virtual columns 并对它们进行索引,以便您可以构建一个递归视图并通过视图进行选择,将繁重的内容留给数据库。希望这些想法有所帮助!
-
就像 Hazel 会说的:详细说明。有关数据结构或 DB 表设计的更多信息可以帮助我们了解更多信息并为您提供更多见解。
-
这绝对是您在尝试在应用程序端解决之前需要在数据库端尝试解决的问题。找一个最好的 Oracle 人员来制作索引和一个好的查询,或者在 dba.SE 上询问。
-
谢谢@lazha 第一个表几乎是数据库。它有 LVL7、6、5、4、3、2、1。每一个 LVL7 都是一个唯一的 ID,它是一个 LVL6-PRODUCT 的分支,一个 LVL5-PRODUCT 的分支等等。我需要根据子字符串获取所有级别的描述,因为我试图在第二个表上表示。感谢cmets,我会检查两个链接! Kayaman 我在星期五发布了这个,但我想我没有解释自己哈哈stackoverflow.com/questions/59506632/…?
标签: java sql performance jdbc