我正在使用拉曼棒球数据库进行一个关于比较不同查询技术的项目。我已经在SQL中执行了一系列查询,然后使用SQL workbench将表移植到XML文件。然后我将它们上传到existdb服务器上,并尝试在其上运行查询,但速度太慢了。
我有一个称为外观的xml文件。看起来像这样的xml。但是,它有98146行元素。
<appearances>
<ROW>
<yearID>1871</yearID>
<teamID>BS1</teamID>
<lgID>NA</lgID>
<masterID>barnero01</masterID>
</ROW>
<ROW>
<yearID>1871</yearID>
<teamID>BS1</teamID>
<lgID>NA</lgID>
<masterID>barrofr01</masterID>
</ROW>
</appearances>
我还有一个名为master的xml文件。看起来像这样的xml,它有18354个行元素。
<master>
<ROW>
<masterID>aardsda01</masterID>
<nameFirst>David</nameFirst>
<nameLast>Aardsma</nameLast>
</ROW>
<ROW>
<masterID>aaronha01</masterID>
<nameFirst>Hank</nameFirst>
<nameLast>Aaron</nameLast>
</ROW>
</master>
我正在尝试运行一个XQY查询来连接这两个表,并找到每个teamID为“LAN”的条目的名字和姓氏。
let $laPlayers := for $appearance in /appearances/ROW
let $player := /master/ROW/masterID=$appearance/masterID
where $appearance/teamID eq "LAN"
return fn:concat($player/nameFirst/text(),' ',
$player/nameLast/text())
return $laPlayers
它跑得很好,但速度太慢了!在外观表中,每个masterID都有多个条目,因为yearID(我在这里不使用),所以我尝试先调用不同的值。
let $laIds = fn:distinct-values(for $appearance in /appearances/ROW
where $appearance/teamID eq "LAN"
return $appearance/masterID/text())
let $laPlayers = for $player in /master/ROW
for $id in $laIds
where $id eq $player/masterID
order by $player/nameLast
return fn:concat($player/nameFirst/text(),' ',
$player/nameLast/text())
return $laPlayers
这使得它的速度更快,但仍然比它的SQL等价物慢得多。我能做些什么来加快速度吗?
(以下是SQL等效项)
SELECT DISTINCT m.nameFirst, m.nameLast FROM appearances a, master m
WHERE a.teamID = "LAN" AND a.masterID = m.masterID ORDER BY m.nameLast, m.nameFirst;