我对使用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表,它们也应该存储在内存中。