2017-07-07 60 views
-1

多くのテーブルで多くの左結合を使用するコードがあります。このコードを実行すると、実行に1時間以上かかり、最後にSort Execution Failureでエラーが発生します。だから、私は複数のステップで左の結合を分解することを考えているが、私はそれを行う方法とあなたの助けが必要なのか分からない。 、Proc Sqlの複数のステップで複数の左結合を中断する

1、あなたが参照する各データセットに対してのみキープ:

Proc sql; 
create table newlib.Final_test as 
SELECT 
POpener.Name as Client, 
Popener.PartyId as Account_Number, 
Case 
    When BalLoc.ConvertedRefNo NE '' then BalLoc.ConvertedRefNo 
else BalLoc.Ourreferencenum 
End as LC_Number, 
BalLoc.OurReferenceNum , 
BalLoc.CnvLiabilityCode as Liability_Code, 
POfficer.PartyID as Officer_Num, 
POfficer.Name as Officer_Name, 
POpener.ExpenseCode, 
BalLoc.IssueDate as Issue_Date format=mmddyy10., 
BalLoc.ExpirationDate AS Expiry format=mmddyy10., 
BalLoc.LiabilityAmountBase as Total_LC_Balance, 
Case 
    When BalLoc.Syndicated = 0 Then BalLoc.LiabilityAmountBase 
    else 0 
End as SunTrust_Non_Syndicated_Exposure, 
Case 
    When BalLoc.Syndicated = 1 and BalLoc.PartOutGroupPkey NE 0 Then  
BalLoc.LiabilityAmountBase 
    else 0 
    End as SunTrust_Syndicated_Exposure, 
Case 
    When BalLoc.Syndicated = 1 and BalLoc.PartOutGroupPkey NE 0 Then 
(BalLoc.LiabilityAmountBase - (BalLoc.LiabilityAmountBase * 
(PParty.ParticipationPercent/100))) 
    Else BalLoc.LiabilityAmountBase 
End as SunTrust_Exposure, 
Case 
    When BalLoc.Syndicated = 1 and BalLoc.PartOutGroupPkey <> 0 Then 
(BalLoc.LiabilityAmountBase * PParty.ParticipationPercent/100) 
    Else 0 
End as Exposure_Held_By_Other_Banks, 
PBene.Name as Beneficiary_Trustee, 
cat(put(input(POpener.ObligorNumber,best10.),z10.),put(input 

    (BalLoc.CommitmentNumber,best10.),Z10.)) as Key, 
case 
when BalLoc.BeneCusip2 NE ' ' then catx 
('|',Balloc.BeneCusip,Balloc.BeneCusip2) 
else BalLoc.BeneCusip 
End as Cusip, 
Case 
    when balLoc.OKtoExpire = 1 then '0' 
    when balLOc.OKtoExpire=0 and BalLoc.AutoExtTermDays NE 0 then put 
(Balloc.AutoExtTermDays,z3.) 
    when balLoc.OKtoExpire=0 and BalLoc.AutoExtTermsMonth NE 0 then put 
(balloc.AutoExtTermsMonth,z3.) 
    else '000' 
End as Evergreen 
Case 
when blf.AnnualRate NE 0 then put(blf.AnnualRate,z7.) 
when blf.Amount NE 0 then cats('F',put(blf.amount,z7.)) 
else 'WAIVE' 
End as Pricing, 

FROM BalLocPrimary BalLoc 
Left JOIN Party POpener on POpener.Pkey = BalLoc.OpenerPkey 
Left join PartGroup PGroup on BallOC.PartOutGroupPkey = PGroup.pKey 
Left join PartParties PParty ON PGroup.pKey = PParty.PartGroupPkey and 
PParty.ParticipationPercent > 0 and 
PParty.combined in 
(select PPartParties.All_combined 
from PPartParties /*group by PartGroupPkey, PartyPkey*/) 

Left Join MemExpenseCodes ExpCodes on POpener.ExpenseCode = ExpCodes.Code 
Left JOIN Party PBene on PBene.Pkey = BalLoc.BenePkey 
Left join Party POfficer on POfficer.Pkey = BalLoc.AccountOfficerPkey 
left join maxfee on maxfee.LocPrimaryPkey = BalLoc.LocPrimaryPkey 
left join BalLocFee BLF on BLF.Pkey = maxfee.pkey 
Where BalLoc.LetterType not in ('STBA','EXPA', 'FEE',' ') and 
BalLoc.LiabilityAmountBase > 0 and BalLoc.irdb = 1 
; 
quit; 

シャンカール

+0

いくつかの統計情報なしで改善する方法を言うのは難しいです。これらのテーブルの大きさはどれくらいですか?それらは結合キーで索引付けされていますか?クエリのSELECT部分​​はどこですか? @Joe; – Joe

+0

;私はselect文を含むコード全体を追加しました。これらのテーブルは75,000から650,000の間の行を持ち、10から40の間の列を持ちます。 – shankar

答えて

0

、私は示唆しているいくつかのことをありがとう:として

コードがあります結合する必要がある変数、またはSELECTステートメントで使用される変数たとえば、あなたの党のdsetから、Pkeyフィールドと名前だけが必要なように見えます。あなたは、そのDSETに参加させるためとき、あなたが使用する必要があります。

FROM BalLocPrimary(where=(LetterType not in ('STBA','EXPA', 'FEE',' ') and 
LiabilityAmountBase > 0 and irdb = 1)) BalLoc 

をそして条件が順序であることを確認してください。

Left JOIN Party(keep=Pkey Name) PBene on PBene.Pkey = BalLoc.BenePkey 

2、そのように文のFROMにあなたのWHERE文を押してください

3、あなたはBalLocPrimaryデータセットをオフにして残りのすべてに参加しています。それはあなたが本当に意図していることですか?結果セットがクライアントまたはAccount_Numberなしで戻っても問題はありませんか?左結合は計算コストがかかりますが、左結合を最小限に抑えるほど効果的です。

4、Joeは結合フィールドのインデックスについて質問しました。あなたはおそらくいくつか持っているはずです。私は自分自身がブックマークするために定期的にthis SUGI paperを参照していることがわかりました。同様に、クエリからEXPLAIN PLANを確認して、どこにボトルネックが発生しているのかを確認することもできます。 Another SUGI paperは良いスタートになります。

5これは複数のステップに分割される可能性がありますか?それは良い直感です。ただし、最適なブレークは、基礎となるデータ、インデックス、および結合パスに大きく依存します。だから、スクリーンの反対側からそれを処方するのは難しいです。私がリンクしている2番目の論文は、あなたの特定のケースの最適化に関する良いヒントを与えることができると思います。

関連する問題