Oracle SQLクエリでパフォーマンスが非常に低下しています。私は、テーブルibe_partos_m
で定義されたインデックス、フィールドcodlote
とフィールドcod
をしましたテーブルのパフォーマンスが低下します
SELECT distinct idm3.cod
FROM ibe_partos_m idm3, ibe_padron_prov_2010_m pad2
WHERE idm3.codLote = 1
AND idm3.activo = 1
AND ((pad2.ar = '2016' and pad2.mes='1') or (pad2.ar = '2015' and pad2.mes='7'))
AND idm3.cod NOT IN
(SELECT idm2.cod
FROM ibe_partos_m idm2,
ibe_padron_prov_2010_m pad
WHERE idm2.codLote = 1
AND idm2.activo = 1
AND ((pad.ar = '2016' and pad.mes='1') or (pad.ar = '2015' and pad.mes='7'))
AND pad.tiden != '2'
AND idm2.nombreM = pad.NOMB
AND idm2.apell1m = pad.APE1
AND idm2.apell2m = pad.APE2
AND ( idm2.numdocm = pad.IDEN || pad.LIDEN OR
idm2.numdocm = pad.NDOCU OR
idm2.numdocm = pad.LEXTR|| pad.IDEN|| pad.LIDEN OR
idm2.numdocm = pad.LEXTR || '0' || pad.IDEN|| pad.LIDEN OR
idm2.numdocm = pad.lextr || SUBSTR (pad.iden, 2, LENGTH (pad.iden))|| pad.liden)
)
AND idm3.PROREM = '07'
AND idm3.nombreM = pad2.nomb
AND idm3.apell1m = pad2.ape1
AND idm3.apell2m = pad2.ape2
AND ( (pad2.tiden = '1' AND pad2.liden IS NOT NULL)
OR ( pad2.tiden = '3'
AND pad2.liden IS NOT NULL
AND pad2.lextr IS NOT NULL));
;:クエリはこれですテーブルibe_padron_prov_2010_m
には、フィールドape1
,ape2
およびiden
が含まれています。すべてのインデックスは単純です。
パフォーマンスが悪い理由を理解できません... ape1
の2つのインデックスではなく、結合速度を向上させるにはape2
で十分ですか?
ありがとうございます!
編集:私が達成しようとしていることはこれです:
だがは、内側のSELECTで選択したレコードとして修正されているレコードを定義してみましょう。
私はかつての意味で正しいないレコードを取得しようとしているが、それでもいくつかのプロパティにフィット、であることだ。
idm3.codLote = 1 AND idm3.activo = 1 AND ((pad2.ar = '2016' and pad2.mes='1') or (pad2.ar = '2015' and pad2.mes='7')) AND idm3.PROREM = '07' AND idm3.nombreM = pad2.nomb AND idm3.apell1m = pad2.ape1 AND idm3.apell2m = pad2.ape2 AND ( (pad2.tiden = '1' AND pad2.liden IS NOT NULL) OR ( pad2.tiden = '3' AND pad2.liden IS NOT NULL AND pad2.lextr IS NOT NULL));
EDIT2:@Craigヤングとして、正確には、私は別のcod
を得ることに興味があります(どちらの選択でも)...しかし、一致した場合には、特定のibe_partos_m
の検索を停止するようにDBサーバに指示する方法はありますか?
あなたがしようとしていることを説明してください、私はあなたがこのクエリをより良く最適化できると信じてください。 – sagi
元の質問を編集しました、ありがとう! – Alex
Enterpriseヒントでパラレルヒントを使用している場合は、distinctの代わりにgroup byを使用します。あなたが100万の行を持っていて、あなたのインデックスがたくさんの価値の100の "行"から成っている場合、インデックスは非常に高価な方法です – Thomas