递归数据库查询的最快方式是什么?

2024-05-29 11:04:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我的程序的一部分查询数据库以查找给定元素的所有子元素,以及它们的所有子元素,等等,直到没有更多的子元素,我才找到叶元素。数据库使用两列来存储我需要的信息。一列具有元素的id,另一列具有子元素的id。一个平均的用例生成一个包含500多个元素的树,完成所有查询需要30秒以上。我能做些什么来优化查询并减少服务器上的瓶颈吗?在

cursor = conn.cursor()
rootNode = Node(initialId)
nodeList.append(baseNode) # all nodes go into a list for debugging output
buildTree(baseNode, cursor)

def buildTree(self, node, cursor):
    query = "SELECT childId FROM Pairs WHERE parentId=?"
    cursor.execute(query, node.value)
    results = cursor.fetchall()
    for entry in results: # for each result returned, make a new node for each child
                          # and then query each child to see if it has children
        if entry[0] is not None:
            newNode = Node(entry[0], parent=node)
            nodeList.append(newNode)
            buildTree(newNode, cursor)

Node是一个短类,它充当一个数据结构来存储节点的id、它可能拥有的任何子节点以及父节点。我正在使用pyodbc连接到SQL Server'08。在


Tags: idnode元素for节点querycursoreach
1条回答
网友
1楼 · 发布于 2024-05-29 11:04:41

首先,您需要以某种方式将查询逻辑从模型(树表示)中分离出来,这将使您更加灵活。在

1)这里首先想到的是使用recursive query in SQL server一次获得所有需要的数据, 但您需要小心,因为SQLServer对递归调用有限制。在

2)第二种方法是使用第一种方法或下一种方法编写存储过程。这将通过避免传输和查询解析成本来减少时间(但会在防御性上增加代码支持的复杂性)

3)下一步是通过选择每个级别而不是每个项目来最小化数据库查询数。这样地: 1选择所有根节点 2获取所有ID并使用IN查询查询所有子节点 三。从2开始重复。。。。在

4)最后,如果您没有真正的大量记录,并且它们的数量不会随着时间的推移而显著增长,您可以将所有记录加载到内存中,然后构建树。你可以认为这会减慢你的代码,但没有成千上万的记录,它不是。在

任何情况下,它实际上取决于你的数据大小和其他要求,例如,如果你的嵌套级别不是很大,选项3将很好地工作,否则它将与你的代码相同。在

相关问题 更多 >

    热门问题