今、経路列挙モデルでツリー構造を管理しているテーブルがあるのですが、この各ノードに対して、それに紐づく末端のノードを取得する方法を考えています。
一応、末端の子孫ノードは抽出できているものの、時間がかかりすぎるので効率化したいのですが、お知恵を貸していただけないでしょうか。
モデルのイメージは以下の様な感じです。
SQL
1-- 経路列挙モデルを採用しているテーブル 2select node_id, node_path from t_node 3 4 node_id | node_path 5---------+----------- 6 1 | 1 7 2 | 2 8 3 | 1-3 9 4 | 1-3-4 10 5 | 2-5 11 6 | 2-5-6 12 7 | 2-5-6-7 13 8 | 2-8 14 9 | 1-3-9 15 10 | 1-3-9-10 16 17-- view_last_node は末端ノードを抽出するビューです 18select node_id, node_path from view_last_node 19 20 node_id | node_path 21---------+----------- 22 4 | 1-3-4 23 7 | 2-5-6-7 24 8 | 2-8 25 10 | 1-3-9-10 26
ここで今、以下の様なSQLで紐づくノードを抽出しています。マテリアライズド・ビューとしているのですが、現状1万5千レコードほどでもリフレッシュに1分以上かかっています。
node_idはプライマリキーで、node_pathにもインデックスは貼っています。
SQL
1select 2 tn.node_id, 3 tn.node_path, 4 tlast.node_id as last_node, 5 tlast.node_path as last_path 6from t_node as tn 7inner join t_node as tlast on(tlast.node_path like tn.node_path || '%') 8where tlast.node_id in( 9 select node_id from view_last_node 10); 11 12 node_id | node_path | last_node | last_path 13---------+-----------+-----------+------------- 14 1 | 1 | 4 | 1-3-4 15 1 | 1 | 10 | 1-3-9-10 16 2 | 2 | 7 | 2-5-6-7 17 2 | 2 | 8 | 2-8 18 3 | 1-3 | 4 | 1-3-4 19 3 | 1-3 | 10 | 1-3-9-10 20 4 | 1-3-4 | 4 | 1-3-4 21 5 | 2-5 | 7 | 2-5-6-7 22 6 | 2-5-6 | 7 | 2-5-6-7 23 7 | 2-5-6-7 | 7 | 2-5-6-7 24 8 | 2-8 | 8 | 2-8 25 9 | 1-3-9 | 10 | 1-3-9-10 26 10 | 1-3-9-10 | 10 | 1-3-9-10
ちょっとした事でも構いませんので、何かアドバイスいただければと思います。
よろしくお願い致します。m(_ _)m

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/08 09:59