私のプログラムの一部は、データベースを照会して、特定の要素のすべての子要素、およびすべての子要素などを子要素がなくなるまで探し、リーフ要素を取得します。データベースは、2つの列を使用して必要な情報を格納します。要素のIDを持つ1つの列、子要素の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)
ノードは、ノードのID、ノードが持つ可能性のある子孫、および親ノードを格納するためのデータ構造として機能する短いクラスです。私はpyodbc
を使用してSQL Server '08に接続しています。
おそらく関連:http://sqlmag.com/t-sql/transitive-closure –
@Robᵩありがとう、それは助けになるようです。私はそれと一緒に遊んで、どのようにそれを参照してください。 – sommerjj
再帰SQLを検討しましたか? SQL Server 2008 R2にはすでにそれがあるはずです。 – LukStorms