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 回答