我有張表的結構如下,屬于樹形的結構表 表名為NODE_TREE

NODE_ID,PARENT_ID資料型別均為number(10),PARENT_ID=0則為跟節點,NODE_ID為主鍵,唯一索引,parent_ID也是索引欄位。
在節點移動XX時,我需要同步更新NODE_PATH欄位。就需要更新該節點下所有子節點NODE_PATH,SQL如下:
UPDATE NODE_TREE A SET NODE_PATH=(
SELECT SYS_CONNECT_BY_PATH(NODE_ID,'/') FROM NODE_TREE B
WHERE A.NODE_ID=B.NODE_ID
START WITH B.PARENT_ID=0 CONNECT BY PRIOR B.NODE_ID=B.PARENT_ID
) WHERE A.NODE_ID IN (
SELECT NODE_ID FROM NODE_TREE START WITH NODE_ID=XX CONNECT BY PRIOR NODE_ID=PARENT_ID
)
此表目前資料量35000,若XX節點下子節點數量在2000左右,查詢速度很慢,耗時20分鐘,幾百條都需要80多秒。
求優化方案
uj5u.com熱心網友回復:
用游標也不是這個速度,更新 2000 行,超過 2 秒,就有必要改進一下;uj5u.com熱心網友回復:
試過游標,速度有差不多,請教有其他實作的思路嗎?
uj5u.com熱心網友回復:
查一下,表上是不是有觸發器,如果有的話,在這個觸發器上想想辦法;
uj5u.com熱心網友回復:
35000的記錄,全部重刷都不用這么久..uj5u.com熱心網友回復:
差個引數吧,把子節點調整到哪個父節點上啊uj5u.com熱心網友回復:
謝謝大家,這個sql的效率解決了。解決方式是通過將子查詢創建為臨時表。每次在更新的時候,先將資料全量插入臨時表,再做更新。均能在幾百毫秒內完成。至于原因,還請各路大神分析一下。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/94889.html
標籤:開發
