Вы можете поместить большую часть своего кода в общую библиотеку.
После этого у вас будет исходный файл с вашей «обычной» функцией main
, который сам компилируется в исполняемый файл и использует общую библиотеку. Затем вы можете написать отдельную тестовую программу, которая также ссылается на библиотеку и может выполнять различные необходимые тесты.
Вы уверены, что у Вас "нет полномочий" для наблюдения плана выполнения? Что относительно того, чтобы использовать 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")
Как Вы видите, это предоставляет довольно много подробной информации о том, как запрос будет выполняться. Это говорит мне что:
Этот порядок приложения не имеет никакого отношения к способу, которым предикаты заказаны в операторе 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")
База данных решит что порядок выполнить условия в.
Обычно (но не всегда) это будет использовать индекс сначала, если это возможно.
Наконец, в теории реляционной базы данных говорится, что Вы никогда не можете зависеть от порядка подписания пунктов запроса, так лучше всего для не попытки. Как другие сказали, оптимизатор на основе издержек пытается выбрать то, что он думает, является лучшим, но даже просмотр объясняет, что план не гарантирует фактического порядка, это используется. Объясните, что план просто говорит Вам, что рекомендует CBO, но это все еще не 100%.
Возможно, если Вы объясняете, почему Вы пытаетесь сделать это, некоторые могли предложить план?
Как был сказан, смотрение на план выполнения даст Вам некоторую информацию. Однако, если Вы не используете функцию устойчивости плана, Вы не можете полагаться на план выполнения, всегда остающийся тем же.
В случае запроса Вы отправили, не похоже, что порядок оценки изменит логику всегда, таким образом, я предположу то, о чем Вы думаете, эффективность. Довольно вероятно, что оптимизатор 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'
"Осуществить" подсказка должна заставить оптимизатор выполнять встроенный запрос сначала, затем просканировать тот набор результатов для других условий.
Я не советую сделать это как общую привычку. В большинстве случаев просто запись простого запроса приведет к лучшим планам выполнения.
Для добавления к другим комментариям к планам выполнения под основанной на CPU ценной моделью, представленной в 9i и используемый по умолчанию в 10 г +, Oracle также сделает оценку, которой порядок оценки предиката приведет к более низкой вычислительной стоимости, даже если это не будет влиять на порядок доступа таблицы и метод. При выполнении одного предиката, прежде чем другой приводит к меньшему количеству вычислений предикатов, выполняемых затем, что оптимизация может быть применена.
Дополнительную информацию см. в этой статье: http://www.oracle.com/technology/pub/articles/lewis_cbo.html
Кроме того, Oracle не должна даже выполнять предикаты, где сравнение с определениями проверочного ограничения или раздела указывает, что никакие строки не были бы возвращены так или иначе.
Сложный материал.