Я использую Oracle 10g, и у меня есть представление, которое объединяет две большие таблицы (миллионы записей). Я пытаюсь выбрать ограниченный «образец» данных для пользователя следующим образом:
select * from VIEW_NAME where ROWNUM < 5;
Это очень медленно, и я думаю, что этого не должно быть, потому что мне просто нужно несколько строк результата, поэтому Oracle не должен вычислять полное соединение.
Требование состоит в том, что пользователь должен иметь возможность интерактивно указывать количество возвращаемых строк (неважно, какие именно строки из результата). Есть ли способ добиться этого? (с rownum или другим методом)
(Я могу изменить определение представления или способ построения окончательного SQL, но, насколько мне известно, я не могу динамически передавать информацию о желаемом количестве строк в представление)
РЕДАКТИРОВАТЬ: определение представления очень простое, примерно так:
CREATE OR REPLACE VIEW VIEW_NAME AS
(
select
e.id as ID,
e.somefield as something,
... (some similar selects from e)
c.field as anotherthing,
... (lots of other fields from c)
from SCHEMA.TABLE1 e
inner join SCHEMA.TABLE2 c on e.key = c.key
)
В плане объяснения упоминается полный доступ к таблицам для обеих таблиц, что неудивительно, потому что просто возврат первых нескольких строк не должен занимать много времени.
EDIT2: вот полный план
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2644394598
----------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Pstart| Pstop | TQ |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 1252 | | 43546 (1)| 00:08:43 | | | | | |
|* 1 | COUNT STOPKEY | | | | | | | | | | | |
| 2 | PX COORDINATOR | | | | | | | | | | | |
| 3 | PX SEND QC (RANDOM) | :TQ10002 | 696K| 207M| | 43546 (1)| 00:08:43 | | | Q1,02 | P->S | QC (RAND) |
|* 4 | COUNT STOPKEY | | | | | | | | | Q1,02 | PCWC | |
|* 5 | HASH JOIN BUFFERED | | 696K| 207M| 49M| 43546 (1)| 00:08:43 | | | Q1,02 | PCWP | |
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
| 6 | BUFFER SORT | | | | | | | | | Q1,02 | PCWC | |
| 7 | PX RECEIVE | | 696K| 90M| | 5137 (1)| 00:01:02 | | | Q1,02 | PCWP | |
| 8 | PX SEND HASH | :TQ10000 | 696K| 90M| | 5137 (1)| 00:01:02 | | | | S->P | HASH |
| 9 | TABLE ACCESS FULL| TABLE1 | 696K| 90M| | 5137 (1)| 00:01:02 | | | | | |
| 10 | PX RECEIVE | | 892K| 149M| | 5260 (1)| 00:01:04 | | | Q1,02 | PCWP | |
| 11 | PX SEND HASH | :TQ10001 | 892K| 149M| | 5260 (1)| 00:01:04 | | | Q1,01 | P->P | HASH |
| 12 | PX BLOCK ITERATOR | | 892K| 149M| | 5260 (1)| 00:01:04 | 1 | 140 | Q1,01 | PCWC | |
| 13 | TABLE ACCESS FULL| TABLE2 | 892K| 149M| | 5260 (1)| 00:01:04 | 1 | 140 | Q1,01 | PCWP | |
----------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------
1 - filter(ROWNUM<5)
4 - filter(ROWNUM<5)
5 - access("E"."KEY"="C"."KEY")
27 rows selected.
e
? - person Justin Cave   schedule 20.09.2012