Порядок выполнения условий в SQL, 'где' пункт

Вы можете поместить большую часть своего кода в общую библиотеку.

После этого у вас будет исходный файл с вашей «обычной» функцией main, который сам компилируется в исполняемый файл и использует общую библиотеку. Затем вы можете написать отдельную тестовую программу, которая также ссылается на библиотеку и может выполнять различные необходимые тесты.

14
задан sarego 4 December 2008 в 10:26
поделиться

5 ответов

Вы уверены, что у Вас "нет полномочий" для наблюдения плана выполнения? Что относительно того, чтобы использовать AUTOTRACE?

SQL> set autotrace on
SQL> select * from emp
  2  join dept on dept.deptno = emp.deptno
  3  where emp.ename like 'K%'
  4  and dept.loc like 'l%'
  5  /

no rows selected


Execution Plan
----------------------------------------------------------

----------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)|
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |              |     1 |    62 |     4   (0)|
|   1 |  NESTED LOOPS                |              |     1 |    62 |     4   (0)|
|*  2 |   TABLE ACCESS FULL          | EMP          |     1 |    42 |     3   (0)|
|*  3 |   TABLE ACCESS BY INDEX ROWID| DEPT         |     1 |    20 |     1   (0)|
|*  4 |    INDEX UNIQUE SCAN         | SYS_C0042912 |     1 |       |     0   (0)|
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("EMP"."ENAME" LIKE 'K%' AND "EMP"."DEPTNO" IS NOT NULL)
   3 - filter("DEPT"."LOC" LIKE 'l%')
   4 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")

Как Вы видите, это предоставляет довольно много подробной информации о том, как запрос будет выполняться. Это говорит мне что:

  • условие "emp.ename как 'K %'" будет применено сначала на полном сканировании EMP
  • затем записи ОТДЕЛА соответствия будут выбраны через индекс на dept.deptno (с помощью метода ВЛОЖЕННЫХ ЦИКЛОВ)
  • наконец фильтр "dept.loc как 'l %' будет применен.

Этот порядок приложения не имеет никакого отношения к способу, которым предикаты заказаны в операторе Where, поскольку мы можем показать с этим переупорядоченным запросом:

SQL> select * from emp
  2  join dept on dept.deptno = emp.deptno
  3  where dept.loc like 'l%'
  4  and emp.ename like 'K%';

no rows selected


Execution Plan
----------------------------------------------------------

----------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)|
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |              |     1 |    62 |     4   (0)|
|   1 |  NESTED LOOPS                |              |     1 |    62 |     4   (0)|
|*  2 |   TABLE ACCESS FULL          | EMP          |     1 |    42 |     3   (0)|
|*  3 |   TABLE ACCESS BY INDEX ROWID| DEPT         |     1 |    20 |     1   (0)|
|*  4 |    INDEX UNIQUE SCAN         | SYS_C0042912 |     1 |       |     0   (0)|
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("EMP"."ENAME" LIKE 'K%' AND "EMP"."DEPTNO" IS NOT NULL)
   3 - filter("DEPT"."LOC" LIKE 'l%')
   4 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")
20
ответ дан 1 December 2019 в 07:52
поделиться

База данных решит что порядок выполнить условия в.

Обычно (но не всегда) это будет использовать индекс сначала, если это возможно.

7
ответ дан 1 December 2019 в 07:52
поделиться

Наконец, в теории реляционной базы данных говорится, что Вы никогда не можете зависеть от порядка подписания пунктов запроса, так лучше всего для не попытки. Как другие сказали, оптимизатор на основе издержек пытается выбрать то, что он думает, является лучшим, но даже просмотр объясняет, что план не гарантирует фактического порядка, это используется. Объясните, что план просто говорит Вам, что рекомендует CBO, но это все еще не 100%.

Возможно, если Вы объясняете, почему Вы пытаетесь сделать это, некоторые могли предложить план?

1
ответ дан 1 December 2019 в 07:52
поделиться

Как был сказан, смотрение на план выполнения даст Вам некоторую информацию. Однако, если Вы не используете функцию устойчивости плана, Вы не можете полагаться на план выполнения, всегда остающийся тем же.

В случае запроса Вы отправили, не похоже, что порядок оценки изменит логику всегда, таким образом, я предположу то, о чем Вы думаете, эффективность. Довольно вероятно, что оптимизатор Oracle выберет план, который эффективен.

Существуют приемы, которые можно сделать для поощрения особого упорядочивания, если Вы хотите сравнить производительность с основным запросом. Скажите, например, что Вы хотели, чтобы условие метки времени было выполнено сначала. Вы могли сделать это:

WITH subset AS
  ( SELECT /*+ materialize */
      FROM my_table
      WHERE CURRENT_TIMESTAMP - 1 < x.CREATION_TIMESTAMP
  )
SELECT *
  FROM subset
  WHERE 
  d.attribute3 = 'abcd*'  
  AND x.STATUS != 'P' 
  AND x.STATUS != 'J' 
  AND x.STATUS != 'X' 
  AND x.STATUS != 'S' 
  AND x.STATUS != 'D'

"Осуществить" подсказка должна заставить оптимизатор выполнять встроенный запрос сначала, затем просканировать тот набор результатов для других условий.

Я не советую сделать это как общую привычку. В большинстве случаев просто запись простого запроса приведет к лучшим планам выполнения.

6
ответ дан 1 December 2019 в 07:52
поделиться

Для добавления к другим комментариям к планам выполнения под основанной на CPU ценной моделью, представленной в 9i и используемый по умолчанию в 10 г +, Oracle также сделает оценку, которой порядок оценки предиката приведет к более низкой вычислительной стоимости, даже если это не будет влиять на порядок доступа таблицы и метод. При выполнении одного предиката, прежде чем другой приводит к меньшему количеству вычислений предикатов, выполняемых затем, что оптимизация может быть применена.

Дополнительную информацию см. в этой статье: http://www.oracle.com/technology/pub/articles/lewis_cbo.html

Кроме того, Oracle не должна даже выполнять предикаты, где сравнение с определениями проверочного ограничения или раздела указывает, что никакие строки не были бы возвращены так или иначе.

Сложный материал.

1
ответ дан 1 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: