Изменить упорядоченное на ведущее

#sql #oracle #oracle11g

Вопрос:

Я пытаюсь найти наиболее избирательные критерии для начала присоединения к SQL.

Я попробовал это:

 SELECT /*  ordered */ 
  r3.object_id
FROM nc_references src
    INNER JOIN nc_objects     o ON o.object_type_id = 9146598858613093106
                               AND o.object_class_id = 90000330 
                               AND src.object_id = o.object_id
                               AND src.reference = 9155224548713314821
                               AND src.attr_id = 90100080 
    INNER JOIN nc_params      p ON ( p.list_value_id = 90100071  OR p.list_value_id = 90100072 )
                              AND p.object_id = o.object_id
                              AND p.attr_id = 90100070 
    INNER JOIN nc_po_actions  poa ON poa.manual_task_id = o.object_id
    INNER JOIN nc_po_tasks    pot ON pot.task_id = poa.task_id
    INNER JOIN nc_references  r1 ON r1.object_id = pot.container_id
                                   AND r1.attr_id = 9145923960313063683 
    INNER JOIN nc_references  r2 ON r2.object_id = pot.container_id
                                   AND r2.attr_id = 9145685312013687931 
    INNER JOIN nc_references  r3 ON r2.reference = r3.object_id
                                   AND r3.attr_id = 9145065302013613216 
                                   AND r1.reference = r3.reference
                     ;
 

Но это ordered устарело. Как я могу реализовать этот запрос с помощью leading ?

Комментарии:

1. Вы пробовали без подсказки? Оптимизатор Oracle может поступить правильно.

2. Да, но данные огромны, а время выполнения составляет около 50 секунд.

3. Может быть, 50 секунд — это лучшее, что может сделать Оракул? Или у вас есть признаки того, что база данных оптимизируется неэффективно?

4. У меня нет доступа к этим данным. Можете ли вы показать мне пример, leading пожалуйста?

5. хорошо, не могли бы вы вставить это в качестве полного ответа, пожалуйста?

Ответ №1:

Используйте подсказку в начале и поместите псевдонимы таблиц между круглыми скобками в том порядке, в котором вы хотите, чтобы база данных присоединилась к ним, например:

 SELECT /*  leading(src o p poa) */ 
  r3.object_id
FROM nc_references src
INNER JOIN nc_objects     o ON o.object_type_id = 9146598858613093106
                           AND o.object_class_id = 90000330 
                           AND src.object_id = o.object_id
                           AND src.reference = 9155224548713314821
                           AND src.attr_id = 90100080 
INNER JOIN nc_params      p ON ( p.list_value_id = 90100071  OR p.list_value_id = 90100072 )
                          AND p.object_id = o.object_id
                          AND p.attr_id = 90100070 
INNER JOIN nc_po_actions  poa ON poa.manual_task_id = o.object_id
INNER JOIN nc_po_tasks    pot ON pot.task_id = poa.task_id
INNER JOIN nc_references  r1 ON r1.object_id = pot.container_id
                               AND r1.attr_id = 9145923960313063683 
INNER JOIN nc_references  r2 ON r2.object_id = pot.container_id
                               AND r2.attr_id = 9145685312013687931 
INNER JOIN nc_references  r3 ON r2.reference = r3.object_id
                               AND r3.attr_id = 9145065302013613216 
                               AND r1.reference = r3.reference
                 ;
 

Это позволит базе данных начать с src (nc_references), затем o (nc_objects) и т. Д.