gpt4 book ai didi

sql - 改进 xpath 评估的 SQL 查询

转载 作者:行者123 更新时间:2023-12-03 17:02:22 25 4
gpt4 key购买 nike

数据库

我有用于保存 XML 文档的数据库。
数据库如下所示:

enter image description here

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

XPath 查询

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

  • 翻译后的 xpath 查询示例:

  • 1) //空[./PERIOD]
     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) //空[./PERIOD]/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 语句中,带有一些 在哪里 条件来确定该节点应位于何处。
  • 元素 大约有 145 000 行。
  • 路径 大约有 41 000 行。

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

    我已经添加了索引,所以查询计划只使用索引搜索(根据 Microsoft sql server)。

    enter image description here

    问题

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

    我正在从 Xpath 创建树,看起来像这样
    ROOT-ROOT   (type: ROOT) False                                                                                            
    //-EMPTY (type: NODE) False
    /-_PERIOD_ (type: NODE) False
    /-S (type: NODE) False
    /-NP (type: NODE) True

    然后从那棵树生成 SQL

    最佳答案

    关于这个主题有一个 lot of research ,你的方法将不可避免地导致很多缓慢的自我加入。它非常接近 this 解决方案。我建议您使用一些 native XQuery 数据库,例如 BaseXSaxon ,它们天生就可以处理 XQuery 而无需将它们重写到 SQL 中。

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

    关于sql - 改进 xpath 评估的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47015383/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com