XQY查询运行方式减慢从lahman棒球数据库加入两个大表

时间:2018-04-05 15:30:19

标签: join xquery

我正在使用Lahman Baseball数据库进行有关比较不同查询技术的项目。我已经在SQL中执行了一堆查询,然后使用SQL工作台将表移植到XML文件。然后我将它们上传到existsdb服务器,我正在尝试对它运行查询,但它们太慢了。 我有一个名为appearances.xml的xml文件,看起来像这样。但它有98,146个ROW元素。

<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文件,它看起来像18,354个ROW元素。

<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查询来加入这两个表,并找到每个条目的第一个和最后一个名称为&#39; LAN&#39;。

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(我不在这里使用)所以我尝试先调用distinct-values。

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;

1 个答案:

答案 0 :(得分:1)

您的查询将受益于<teamID><masterID>元素上xs:string类型的范围索引,因为索引允许数据库仅执行索引值的快速查找而不是扫描跨所请求的元素和值的所有数据。要配置此类索引,请创建如下所示的集合配置文档:

<collection xmlns="http://exist-db.org/collection-config/1.0">
    <index xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <range>
            <create qname="teamID" type="xs:string"/>
            <create qname="masterID" type="xs:string"/>
        </range>
    </index>
</collection>

保存此文档,将其命名为collection.xconf,将其放在与包含数据的集合对应的/db/system/config内的位置。例如,如果您的数据位于/db/apps/my-app/data,请将collection.xconf文件保存在/db/system/config/db/apps/my-app/data中。

以下是有关范围索引和更广泛主题的eXist文档的链接,可以帮助您学习: