HSQLDB查询性能不佳且内存不足

时间:2014-08-01 11:43:40

标签: out-of-memory relational-database hsqldb query-performance

我对使用HSQLDB的当前项目有疑问。

我有一个巨大的联系,应该给我一个关于哪个地区的不同产品的selled amunt的反馈。该声明适用于完整的核心,但性能非常糟糕。

SELECT Verkaufsgebiet.verkaufsgebiet, Artikel.Artikel_Name, sum(Artikel_Liste.Menge)

FROM Artikel_Liste

JOIN Artikel ON Artikel_Liste.Artikel = Artikel.Artikel

JOIN Rechnung ON artikel_liste.rechnungsnummer = Rechnung.rechnungsnummer

JOIN Bearbeiter ON Rechnung.Bearbeiter = Bearbeiter.B_Bearbeiter_ID

JOIN Verkaufsgebiet ON Bearbeiter.b_verkaufsgebiet = Verkaufsgebiet.verkaufsgebiet_id

GROUP BY Artikel.Artikel_Name, Verkaufsgebiet.verkaufsgebiet

解释分析:

isDistinctSelect=[false]
isGrouped=[true]
isAggregated=[true]
columns=[  COLUMN: PUBLIC.VERKAUFSGEBIET.VERKAUFSGEBIET nullable
  COLUMN: PUBLIC.ARTIKEL.ARTIKEL_NAME not nullable

  SUM  arg=[   COLUMN: PUBLIC.ARTIKEL_LISTE.MENGE
 nullable

]
[range variable 1
  join type=INNER
  table=ARTIKEL_LISTE
  cardinality=4000009
  access=FULL SCAN
  join condition = [index=SYS_IDX_ARTIKEL_LISTE_PK_10099
  ]
  ][range variable 2
  join type=INNER
  table=ARTIKEL
  cardinality=11
  access=INDEX PRED
  join condition = [index=SYS_IDX_ARTIKEL_PK_10093
    start conditions=[
    EQUAL arg_left=[     COLUMN: PUBLIC.ARTIKEL.ARTIKEL
] arg_right=[     COLUMN: PUBLIC.ARTIKEL_LISTE.ARTIKEL
]]
    end condition=[
    EQUAL arg_left=[     COLUMN: PUBLIC.ARTIKEL.ARTIKEL
] arg_right=[     COLUMN: PUBLIC.ARTIKEL_LISTE.ARTIKEL
]]
  ]
  ][range variable 3
  join type=INNER
  table=RECHNUNG
  cardinality=1332427
  access=INDEX PRED
  join condition = [index=SYS_IDX_RECHNUNG_PK_10120
    start conditions=[
    EQUAL arg_left=[     COLUMN: PUBLIC.RECHNUNG.RECHNUNGSNUMMER
] arg_right=[     COLUMN: PUBLIC.ARTIKEL_LISTE.RECHNUNGSNUMMER
]]
    end condition=[
    EQUAL arg_left=[     COLUMN: PUBLIC.RECHNUNG.RECHNUNGSNUMMER
] arg_right=[     COLUMN: PUBLIC.ARTIKEL_LISTE.RECHNUNGSNUMMER
]]
  ]
  ][range variable 4
  join type=INNER
  table=BEARBEITER
  cardinality=50
  access=INDEX PRED
  join condition = [index=SYS_IDX_BEARBEITER_PK_10108
    start conditions=[
    EQUAL arg_left=[     COLUMN: PUBLIC.BEARBEITER.B_BEARBEITER_ID
] arg_right=[     COLUMN: PUBLIC.RECHNUNG.BEARBEITER
]]
    end condition=[
    EQUAL arg_left=[     COLUMN: PUBLIC.BEARBEITER.B_BEARBEITER_ID
] arg_right=[     COLUMN: PUBLIC.RECHNUNG.BEARBEITER
]]
  ]
  ][range variable 5
  join type=INNER
  table=VERKAUFSGEBIET
  cardinality=5
  access=INDEX PRED
  join condition = [index=SYS_IDX_VERKAUFSGEBIET_PK_10129
    start conditions=[
    EQUAL arg_left=[     COLUMN: PUBLIC.VERKAUFSGEBIET.VERKAUFSGEBIET_ID
] arg_right=[     COLUMN: PUBLIC.BEARBEITER.B_VERKAUFSGEBIET
]]
    end condition=[
    EQUAL arg_left=[     COLUMN: PUBLIC.VERKAUFSGEBIET.VERKAUFSGEBIET_ID
] arg_right=[     COLUMN: PUBLIC.BEARBEITER.B_VERKAUFSGEBIET
]]
  ]
  ]]
groupColumns=[COLUMN: PUBLIC.ARTIKEL.ARTIKEL_NAME
COLUMN: PUBLIC.VERKAUFSGEBIET.VERKAUFSGEBIET
]
PARAMETERS=[]
SUBQUERIES[]

My Questin是,我怎样才能更好地表现这个查询。例如,我将使用4.000.000的数据运行查询。

HSQLDB在具有2x vCPU Intel XEON E5540 2,53 GHz的虚拟服务器上运行,在带有Openjdk-1.5的OpenSuse 11.4服务器上运行6GB RAM,我知道这不是最好的Java版本,但我不想要在升级的情况下,在我的期末考试结束时会遇到很多麻烦;)

我的问题是如何才能获得更好的查询性能?

我的其他问题如何在服务器内存模式下将更多数据输入这些数据库?

目前我的内存耗尽,如果我尝试将更多4.000.000条记录到数据库中。服务器以-Xmx2048M参数启动,如果我尝试启动更多RAM,则无法启动JVM。他们正在为此数据集使用2GB RAM。

是否有可能获得更好的RAM处理?也许用CHECKPOINT语句应该有用吗?

或者仅仅是HSQLDB的限制。我真的不想拥有CACHED表,它们也应该存储在内存中。

0 个答案:

没有答案