Python 在递归函数中执行数据库查询的最快方法是什么?
我的一个程序查询数据库,查找给定元素的所有子元素,以及它们的所有子元素,等等,直到没有更多的子元素,我才能访问叶元素。数据库使用两列存储我想要的信息。一列具有元素id,另一列具有子元素id。一个平均用例会生成一个包含500多个元素的树,完成所有查询需要30秒以上的时间。我可以做些什么来优化查询并减少服务器上的瓶颈吗Python 在递归函数中执行数据库查询的最快方法是什么?,python,sql-server,python-2.7,sql-server-2008,Python,Sql Server,Python 2.7,Sql Server 2008,我的一个程序查询数据库,查找给定元素的所有子元素,以及它们的所有子元素,等等,直到没有更多的子元素,我才能访问叶元素。数据库使用两列存储我想要的信息。一列具有元素id,另一列具有子元素id。一个平均用例会生成一个包含500多个元素的树,完成所有查询需要30秒以上的时间。我可以做些什么来优化查询并减少服务器上的瓶颈吗 cursor = conn.cursor() rootNode = Node(initialId) nodeList.append(baseNode) # all nodes go
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 首先,您需要以某种方式将查询逻辑与模型(树表示)分开,这将使您更加灵活
1) 在这里首先想到的是使用它一次获取所有需要的数据,
但您需要小心,因为SQLServer对递归调用有限制
2) 第二种方法是使用第一种方法或下一种方法编写存储过程。这将通过避免传输和查询解析成本来减少时间(但会防御性地增加代码支持的复杂性)
3) 下一步是通过选择每个级别而不是每个项目来最小化数据库查询数量。这样地:
1.选择所有根节点
2.在查询中使用获取所有ID并查询所有子节点
3.从2…开始重复
4) 最后,如果您没有太多的记录,并且它们的数量不会随着时间的推移而显著增加,那么您可以将所有记录加载到内存中,然后构建树。您可以认为这会减慢代码的速度,但如果没有成千上万条记录,则不会
在任何情况下,它实际上取决于您的数据大小和其他要求,例如,如果您的嵌套级别不大,那么选项3将很好地工作,否则它将与您的代码相同 首先,您需要以某种方式将查询逻辑与模型(树表示)分开,这将使您更加灵活 1) 在这里首先想到的是使用它一次获取所有需要的数据, 但您需要小心,因为SQLServer对递归调用有限制 2) 第二种方法是使用第一种方法或下一种方法编写存储过程。这将通过避免传输和查询解析成本来减少时间(但会防御性地增加代码支持的复杂性) 3) 下一步是通过选择每个级别而不是每个项目来最小化数据库查询数量。这样地: 1.选择所有根节点 2.在查询中使用获取所有ID并查询所有子节点 3.从2…开始重复 4) 最后,如果您没有太多的记录,并且它们的数量不会随着时间的推移而显著增加,那么您可以将所有记录加载到内存中,然后构建树。您可以认为这会减慢代码的速度,但如果没有成千上万条记录,则不会
在任何情况下,它实际上取决于您的数据大小和其他要求,例如,如果您的嵌套级别不大,那么选项3将很好地工作,否则它将与您的代码相同 可能相关:@Robᵩ 谢谢,看起来会有帮助的。我会玩它,看看它是怎么做的。你考虑过递归SQL吗?Sql server 2008 R2应该已经有了。可能相关:@Robᵩ 谢谢,看起来会有帮助的。我会玩它,看看它是怎么做的。你考虑过递归SQL吗?SQLServer2008R2应该已经有了,我使用了递归查询。和我大量选择所有记录相比,它的运行速度更快,代码更简洁。正如我在回答中提到的,这取决于你们的情况。如果其他选项不可行,则加载内存中的所有数据始终是最后一个选项。这就是为什么这是我列表中的最后一个选项)我使用了递归查询。和我大量选择所有记录相比,它的运行速度更快,代码更简洁。正如我在回答中提到的,这取决于你们的情况。如果其他选项不可行,则加载内存中的所有数据始终是最后一个选项。这就是为什么这是我列表中的最后一个选项。)