我正在尝试优化此查询:
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' )
有可能优化吗? 任何建议都会有很大的帮助
答案 0 :(得分: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
子句中,可以将作为行加入而不是在结尾处应用,这比临时更有效结果集尽可能小。