Бих искал да преценя броя на редовете и времето за изпълнение на моята заявка преди изпълнение. Възможно ли е?
Отговори:
4 за отговор № 1Планът за заявка може да ви покаже колко редовепрогнозите за оптимизатора ще бъдат върнати (или променени) и колко дълго оптимизаторът оценява заявката. Тъй като тези оценки са обвързани, наред с други неща, със статистическите данни на таблиците, обаче, напълно е възможно те да са диви неправилни.
Ако обаче вземам прост въпрос
SQL> explain plan for select count(*) from emp where deptno = 10;
Explained.
SQL> select *
2 from table( dbms_xplan.display );
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2083865914
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 3 | | |
|* 2 | TABLE ACCESS FULL| EMP | 3 | 9 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
2 - filter("DEPTNO"=10)
14 rows selected.
Oracle очаква пълно сканиране на таблицата EMP
таблица, филтрирайки редовете къде deptno = 10
ще се върне 3 реда и ще отнеме 1 секунда ( Rows
и Time
колони от плана за заявка за реда с id = 2
). Oracle очаква COUNT(*)
агрегиране в реда с id = 1
за да намалите това до 1 ред. Така че, на ред с id = 0
, Oracle очаква SELECT
заявление да се върне 1 ред и да се изпълни за 1 секунда.