1

このクエリを最適化しようとしています:

SELECT ob.id, obs.relation
FROM object_relation obs , object_table ob
WHERE obs.parent_id = 'ID_being_passed_as_parameter'
AND ob.id = obs.child_id        
AND ob.deleted_object_flag=0    
AND ob.id_prefix in ('prefix_variAble_passed')
ORDER BY  (SELECT m.value FROM metadata_table 
m WHERE ob.version_id=m.version_id AND m.name='SORTING_CONDITION' ) 

それを最適化することは可能ですか?どんな提案でも大いに役立ちます

4

1 に答える 1

1

すべての行でサブクエリを実行しているため、クエリは最悪order byです。

ほとんどのサブクエリは結合に変換できます。これは、メインクエリで結合を使用するだけでなく、行うべきことでもあります。

SELECT ob.id, obs.relation
FROM object_relation obs 
join object_table ob 
    on ob.id = obs.child_id 
    AND ob.deleted_object_flag=0 
    AND ob.id_prefix in ('prefix_variable_passed')
left join metadata_table m 
    on ob.version_id = m.version_id
    AND m.name = 'SORTING_CONDITION'
WHERE obs.parent_id = 'ID_being_passed_as_parameter'
ORDER BY m.value;

を使用するleft joinと、一致する行がmetadata_tableなくても結果に表示されます。

述語をon結合の句に移動することにも注意してください。行が最後ではなく結合されるときに適用できます。これは、一時的な結果セットが可能な限り小さいため、はるかに効率的です。

于 2012-07-09T07:29:10.537 に答える