約 3500 の洪水制御施設があり、フロー パスを決定するためにネットワークとして表現したいと考えています (基本的に有向グラフ)。私は現在、SqlServer と CTE を使用して、すべてのノードとその上流コンポーネントを再帰的に調べています。これは、上流パスが多く分岐しない限り機能します。ただし、一部のクエリは、物理的にパスを下っていなくても (つまり、「ダウンストリーム」セグメントが 2 つまたは 3 つ)、アップストリームの複雑さが増すため、他のクエリよりも指数関数的に時間がかかります。場合によっては、クエリを強制終了する前に 10 分以上放置しました。私は単純な 2 列のテーブルを使用しています。1 つの列は施設自体で、もう 1 つは最初の列にリストされている施設の上流にある施設です。
現在の機能を使用してインデックスを追加して高速化を試みましたが、違いはありませんでした。また、グラフで可能な接続に関しては、どのノードも複数の上流接続を持つことができ、複数の「下流」ノードから接続することができます。
データに循環がある可能性は確かにありますが、これを確認する良い方法をまだ見つけていません (CTE クエリが最大再帰カウント ヒットを報告した場合を除き、それらは簡単に修正できました)。
それで、私の質問は、この情報を間違って保存しているのでしょうか? 上流のポイントを照会する CTE 以外のより良い方法はありますか?