ツリーを表すテーブルを作成する最適な方法は何ですか? 大きなデータでうまく動作する選択、挿入、更新、削除を実装したいと思います。 たとえば、selectは "Expand All"をサポートする必要があります - 指定されたノードのすべての子(および子)を取得します。SQL Server 2005で高性能ツリービューを実装する方法
答えて
CTE
さんの使用。ツリー状のテーブル構造を考えると
WITH v (id, parent, level) AS
(
SELECT id, parent, 1
FROM table
WHERE parent = 0
UNION ALL
SELECT id, parent, v.level + 1
FROM v
JOIN table t
ON t.parent = v.id
)
SELECT *
FROM v
id parent name
1 0 Electronics
2 1 TV
4 2 LCD
5 2 Plasma
3 1 Hi-Fi
6 3 Amplifiers
7 3 Speakers
のみ取得するparent = @parent
とparent = 0
を交換してください:
id parent name
1 0 Electronics
2 1 TV
3 1 Hi-Fi
4 2 LCD
5 2 Plasma
6 3 Amplifiers
7 3 Speakers
、このクエリはid
、parent
と深さのレベルを返しますが、ツリーとして注文しました木の枝。
table (parent)
にインデックスがある場合、このクエリは非常に大きなテーブルで効率的に動作します。これは再帰的にINDEX LOOKUP
を使用して各ペアレントのすべてのチャイルドンを検索するためです。 @parent
は、ブランチのルートである
WITH v (id, parent, level) AS
(
SELECT id, parent, 1
FROM table
WHERE parent = 0
UNION ALL
SELECT id, parent, v.level + 1
FROM v
JOIN table t
ON t.parent = v.id
)
UPDATE table t
SET column = newvalue
WHERE t.id IN
(
SELECT id
FROM v
)
:
は、特定のブランチ、問題を更新します。Joe Celko's book on trees and hierarchiesで、階層の問題に取り組むためのさまざまな方法があります。あなたが選ぶモデルは、あなたの体重の見通しと更新の比較と複雑さの違いによって決まります。隣接リストモデルを使用してルックアップを非常に高速に(特にノード内のすべての子を取得するために)行うことができますが、ツリーの更新は遅くなります。
ありがとう、私はそれを探します。 ユニオンはすべて再帰的に効率的ですか? mssql 2005にはツリーを扱う新しい方法があると聞いていますが、大きなDBでうまく動作するかどうかは分かりますか? – SirMoreno
CTE内のUNION ALLは再帰的ですが、SQL Serverがその背後でそれをどのように処理するか、またはパフォーマンスの調整があるかどうかはわかりません。パフォーマンスについて確かめるために、CTEで十分な大規模テストを行っていません。 –
あなたは自分自身にこれらの質問を最初にお願いします: 1)修正対修正の比は何ですか? (=ほとんど静的なツリーか、絶えず変化していますか?) 2)ツリーがどのくらい深く、どれくらい大きくなると思いますか?
ネストされたセットは、ブランチ全体で操作が必要なほとんど静的なツリーに最適です。それは問題のない深い木を扱う。
マテリアライズドパスは、拘束/予測可能な深度を持つ動的(変更)ツリーに適しています。
再帰的なCTEは、非常に小さいツリーには理想的ですが、ブランチ操作(「このブランチのすべての子を取得...」)は深い/大きなツリーで非常に高価になります。
http://www.sqlteam.com/article/more-trees-hierarchies-in-sql
私のツリーは非常に動的で、多くのアップデートがありますが、多くのものも選択されています。 そして私は10-15レベルとして深くなることができるようにしたいと思います。 この記事はネストされたセットについて見つかりました: http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/swinging-from-tree-to-tree-using-ctes-part-1-adjacency -to-nested-sets.aspx この資料に記載されているネストされたセットは、私の最善の選択肢ですか?ありがとうございます。 ありがとうございます。 – SirMoreno
は、最良のオプションは、ここで簡単に説明されているパス列挙モデルを、のようです。非常に効率的な読み込みと非常に簡単に書くことができます。
私は驚いて誰も言及していないClosure Tableと一緒に行く:あなたは、多くの更新と選択している場合は
- 1. SQL Server 2005でトランザクションの整合性を保証する方法
- 2. SQL Server 2005のxmlノードに属性を追加する方法
- 3. SQL Server 2005でサーバーサイドページングを実行する方法
- 4. SQL Server 2005とSQL Server 2005の互換性
- 5. PHPで高性能な非同期ソケットサーバーアプリケーションを実装する方法は?
- 6. SQL Server 2005クエリ実行計画をクリアする方法
- 7. SQL Server 2005のユーザーを探す方法
- 8. .NETとSQL Server 2005の最小日付互換性の方法
- 9. ウィンドウでmysqlの高可用性を実装する方法は?
- 10. SQL Server 2005でOPENQUERYを使用するストアドプロシージャの 'total_worker_time'が高い
- 11. SQL Server 2005のMySQL REPLACE INTOへの実装?
- 12. SQL Server 2008 r2でmodパーティショニングを実装する方法は?
- 13. SQL Serverで複数の関係を実装する方法は?
- 14. SQL Server CE 4.0でIDatabaseInitializerを実装する方法
- 15. SQL Serverで行列の概念を実装する方法
- 16. NodeJSで高性能プロキシを実装する
- 17. SQL Server 2005でDBCC FREESYSTEMCACHE( 'TokenAndPermUserStore')がハングする可能性がある場合
- 18. SQL Server 2005で選択せずにストアドプロシージャを実行する方法?
- 19. SQL Server 2005一方向レプリケーション
- 20. Redislabs Enterprise Clusterを実装する方法高い可用性?
- 21. 高性能Excel VSTO to SQL Serverを達成するには?
- 22. SQL Serverの機能のようなmsacessマスクを実装する方法
- 23. SQL Server BI Devでプロジェクトを実行する方法。 SQL Server 2005 R2のStudio 2008 R2
- 24. WPFツリービューでMVVMを実装する方法は?
- 25. SQL Server 2005でBEFORE DELETEトリガーをエミュレートする方法
- 26. SQL Server 2005でデッドロックを解除する方法は?
- 27. SQL Server 2005でoperatorとcaseステートメントを使用する方法
- 28. SQL Server 2005のコール/クエリでファイルシステムディレクトリを作成する方法
- 29. SQL Server 2005でDTSを比較する方法
- 30. SQL Server 2005でトリガーを使用する方法
テーブルの構造について詳しく教えていただけますか? このクエリは大きなデータベースでうまく動作しますか? – SirMoreno
ありがとうございます。 詳細な更新方法を教えてください。 - 親の下のすべてのノードを更新しますか? (孫を含む) – SirMoreno
ねえ、私はこれを動作させようとしています、そして、それはvqの項目dosentの仕事のように見えます、私は2008年に努力しています。また、テーブルに表示されていないので、データベースにレベルを保存する必要がありますか? –