改进用于 xpath 评估的 SQL 查询

扬·克鲁帕

数据库

我有用于保存 XML 文档的数据库。数据库看起来像这样:

在此处输入图片说明

所以我可以将任何 XML 文件保存到我的通用数据库中。

XPath 查询

然后我将 XPATH 查询转换为 SQL 查询,用于选择元素。

  • 翻译的 xpath 查询示例:

1) //空[./期间]

 SELECT e2.docId
 , e2.startPos
 , e2.endPos
 , p2.NodeName
 , p2.levelEl
 , p2.pathID

 From Path p2
 , Element e2
 , Path p3
 , Element e3

 WHERE e2.docID = p2.docID
 AND e2.pathID = p2.pathID
 AND p2.NodeName =  'EMPTY'
 AND p2.levelEl >= 1
 AND e3.docID = p3.docID
 AND e3.pathID = p3.pathID
 AND p3.NodeName =  '_PERIOD_'
 AND e2.startPos < e3.startPos
 AND e2.endPos > e3.endPos
 AND e2.docId = e3.docId
 AND p2.levelEl = p3.levelEl - 1

 AND e2.docId
 = 3147524262 GROUP BY e2.docId
 , e2.startPos
 , e2.endPos
 , p2.NodeName
 , p2.levelEl
 , p2.pathID

 ORDER BY startPos;

2) //空[./期间]/S/NP

 SELECT e5.docId
 , e5.startPos
 , e5.endPos
 , p5.NodeName
 , p5.levelEl
 , p5.pathID

 From Path p2
 , Element e2
 , Path p3
 , Element e3
 , Path p4
 , Element e4
 , Path p5
 , Element e5

 WHERE e2.docID = p2.docID
 AND e2.pathID = p2.pathID
 AND p2.NodeName =  'EMPTY'
 AND p2.levelEl >= 1
 AND e3.docID = p3.docID
 AND e3.pathID = p3.pathID
 AND p3.NodeName =  '_PERIOD_'
 AND e2.startPos < e3.startPos
 AND e2.endPos > e3.endPos
 AND e2.docId = e3.docId
 AND p2.levelEl = p3.levelEl - 1
 AND e4.docID = p4.docID
 AND e4.pathID = p4.pathID
 AND p4.NodeName =  'S'
 AND e2.startPos < e4.startPos
 AND e2.endPos > e4.endPos
 AND e2.docId = e4.docId
 AND p2.levelEl = p4.levelEl - 1
 AND e5.docID = p5.docID
 AND e5.pathID = p5.pathID
 AND p5.NodeName =  'NP'
 AND e4.startPos < e5.startPos
 AND e4.endPos > e5.endPos
 AND e4.docId = e5.docId
 AND p4.levelEl = p5.levelEl - 1

 AND e5.docId
 = 3147524262 GROUP BY e5.docId
 , e5.startPos
 , e5.endPos
 , p5.NodeName
 , p5.levelEl
 , p5.pathID

 ORDER BY startPos;

问题

正如我们所看到的,对于 xpath 中的每个其他节点,我将表元素路径添加FROM语句中,代表该节点,并使用一些where条件来确定该节点应位于的位置。

  • 元素大约有 145 000 行。
  • 路径大约有 41 000 行。

问题是,查询 1) 运行得非常快,但是对于每个新节点,sql 都要慢得多。例如查询 1) 需要 24 毫秒,但查询 2) 运行大约 5 分钟。

我添加了索引,因此查询计划仅使用索引查找(根据 Microsoft sql server)。

在此处输入图片说明

问题

您知道如何以其他方式生成 SQL 查询以加快执行速度的任何解决方案吗?或者对现有查询(数据库表引擎等)进行一些改进?

我正在从 Xpath 创建 TREE 看起来像这样

ROOT-ROOT   (type: ROOT) False                                                                                            
   //-EMPTY   (type: NODE) False                                                                                             
       /-_PERIOD_   (type: NODE) False                                                                                         
       /-S   (type: NODE) False                                                                                                  
          /-NP   (type: NODE) True  

从那棵树我生成 SQL

我为 Bac 工作

关于这个主题很多研究,你的方法将不可避免地导致很多缓慢的自连接。它非常接近这个解决方案。我建议您使用一些原生 XQuery 数据库,例如BaseXSaxon,它们在本质上经过优化以处理 XQuery,而无需将它们重写到 SQL 中。

但是,如果您真的想将 XQueries 重写为 SQL,那么请阅读Torsten Grust 提出的XPath 加速器示例。他的工作背后的想法是在MonetDB XQuery 引擎中实现的他使用的标签方案与您略有不同,但我想这些想法也可以在您的方法中实现。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章