【问题标题】:Improve performance in JDBC query - ArrayList comparison提高 JDBC 查询的性能 - ArrayList 比较
【发布时间】: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


【解决方案1】:

注意:我没有Oracle,所以我用MSSQL做的,只是使用substr而不是left作为人工键.

这是一个静态的想法。让我们看看,首先让我们创建一个包含一些计算列(人工键)的视图 (或者您可以将它们添加到您的产品表中并为它们编制索引)

create view vw_product_computed as
select
    a.lvl,
    a.Product,
    left(a.product, 12) as a12, -- your first lelvel down (artificial key) 
    left(a.product, 10) as a10  -- your seccond level down (artificial key) 
from
    products a;

然后只需使用人工键将产品表与视图连接起来即可:

select
    *
from
    desarrollo.vw_product_computed a
join dbo.products b on b.product = a.a12
join dbo.products c on c.product = a.a10
where
    a.lvl = 7;

然后,您可以根据需要获得结果集:

如果您想让它成为动态的东西,我猜数据透视表可能会派上用场。

希望这有助于交配。

【讨论】:

  • 很抱歉没有活动...哦,我明白了。非常感谢,如果有效,我会检查并尽快发布更新!
  • Acabo de ver que eres de México también, soy nuevo usuario en la plataforma también jaja Te agradezco de nuevo! y feliz año :)
  • 好的,我终于实现了它并按我想要的方式工作。非常感谢!现在我希望这是最好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2013-08-03
相关资源
最近更新 更多