我有用于保存 XML 文档的数据库。数据库看起来像这样:
所以我可以将任何 XML 文件保存到我的通用数据库中。
然后我将 XPATH 查询转换为 SQL 查询,用于选择元素。
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条件来确定该节点应位于的位置。
问题是,查询 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句