Oracle использует переменную в в запросе SQL - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть что-то вроде этого:

With a as (select id from table_a)
select * from table_b where table_b.id > (select min(id) from a)

table_a - это огромная таблица с миллионами записей, и я не хочу просматривать все записи, чтобы найти min (i) каждый раз, когда захочуиспользовать мин (я).Есть ли способ сохранить мин (id) в переменной и использовать его в запросе?Как то так:

With a as (select id from table_a),
b as ((select min(id) into min_id from a))
select * from table_b where table_b.id > min_id

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы можете помочь Oracle, определив индекс для table_a в столбце id до , не просматривая все записи, чтобы найти min .

Если индекс определенOracle выполняет доступ с одним индексом для получения минимальной строки.

Без индекса вам придется выполнить одну FULL TABLE SCAN большой таблицы.

Лучший способ проверить этособлюдать план выполнения:

 create index idx_a on table_a(id);  

EXPLAIN PLAN  SET STATEMENT_ID = 'q1' into   plan_table  FOR
With a as (select id from table_a)
select * from table_b 
where table_b.id > (select min(id) from a);
SELECT * FROM table(DBMS_XPLAN.DISPLAY('plan_table', 'q1','ALL')); 

---------------------------------------------------------------------------------------
| Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |         |  5524 | 71812 |    49   (3)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL          | TABLE_B |  5524 | 71812 |    47   (3)| 00:00:01 |
|   2 |   SORT AGGREGATE            |         |     1 |    13 |            |          |
|   3 |    INDEX FULL SCAN (MIN/MAX)| IDX_A   |     1 |    13 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------------

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

   1 - filter("TABLE_B"."ID"> (SELECT MIN("ID") FROM "TABLE_A" "TABLE_A"))
0 голосов
/ 07 февраля 2019

Ваш запрос должен делать то, что вы хотите.Но, если вы действительно хотите быть уверенным, переместите подзапрос в предложение from:

select b.*
from table_b b join
     (select min(id) as min_id from a) a
     on b.id > a.min_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...