0

何百万ものレコードに対して実行されると予想されるカーソルについて、いくつかの提案が必要です。これが私のカーソルクエリです。

CURSOR items_cursor IS       -- Brings only records that need to be updated
        SELECT a.*, b.* FROM  
        ( SELECT DataId, Name, VersionNum, OwnerId, SubType, LEVEL Lev FROM DTree 
          START WITH ParentId = startFrom CONNECT BY PRIOR DataId= ABS(ParentId)        -- Brings ABS of ParentId
        )a, 
        (                  
         SELECT o.DataId pDataId, o.Permissions OwnerPerm, p.Permissions PublicPerm FROM DTreeAcl o, DTreeAcl p WHERE
         o.DataId=p.Dataid AND o.AclType=1 AND p.AclType=3 AND (o.Permissions != ownerPerm OR p.Permissions != publicPerm)
        )b        
        WHERE a.Lev >= 1 AND a.Lev <= 3 AND a.DataId = b.pDataId;

最初のカーソル自体ですべてを結合するよりも、最初のカーソル内の別のカーソルの2番目のテーブルからデータを取得する方が良いですか??

4

1 に答える 1

3

結合するためにデータベースが構築されます。ほとんどの場合、PL/SQL で独自に記述しようとするよりも、SQL でデータベースに結合を実行させる方が適切です。

PL/SQL で結合を記述したほうがよい唯一の方法は、ネストされたループ結合が必要であり、Oracle オプティマイザがはるかに効率の悪い計画を選択することがわかっている場合です。ただし、その場合は、PL/SQL でネストされたループ結合を記述するよりも、オプティマイザに必要な計画を提供してもらう方がよいでしょう。

于 2013-04-11T17:08:50.630 に答える