Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 долгий запрос, потом быстро  [new]
flint1
Member

Откуда:
Сообщений: 61
добрый день. не имею опыта в sql .. просто подскажите.. спасибо.

запрос выполняется 15 минут. callsign_base ~ 15 млн строк, callsign_sps ~ 4.5 млн строк. Если выполнить сразу второй раз , то выполнится не более чем за 30 сек ... через некоторое время снова по 15 минут. oradb ver 12.1.0.2

Подскажите, что сделать для быстрого выполнения?
сделать индекс на 2 поля (t0.id$ и t0.callsign)?
Загнать в костыльный джоб этот селект, чтобы из кэша не выпадало?
Может сам запрос с условием построен не верно?
хинты какие добавить?



SELECT
*
FROM
(
SELECT
a.*,
ROWNUM rnum
FROM
(
SELECT
----- тут ещё много полей
t0.id$ AS a1,
t0.type$id AS a2,
t0.callsign AS a5,
t1.id$ AS a22,
t1.format AS a23
FROM
callsign_base t0,
callsign_sps t1
WHERE
( ( t0.callsign LIKE '%%' AND
( t1.format = 'INT' ) )
AND ( ( t1.id$ = t0.id$ )
AND ( t0.type$id = 318903 ) ) )
ORDER BY
t0.callsign
) a
WHERE
ROWNUM <= 1000
)
WHERE
rnum > 0;

plan:

----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1000 | 2461K| 5643 (1)| 00:00:01 |
|* 1 | VIEW | | 1000 | 2461K| 5643 (1)| 00:00:01 |
|* 2 | COUNT STOPKEY | | | | | |
| 3 | VIEW | | 1189 | 2912K| 5643 (1)| 00:00:01 |
| 4 | NESTED LOOPS | | 1189 | 104K| 5643 (1)| 00:00:01 |
| 5 | NESTED LOOPS | | 1189 | 104K| 5643 (1)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID| CALLSIGN_BASE | 3566K| 268M| 4146 (1)| 00:00:01 |
|* 7 | INDEX FULL SCAN | CALLSGN | 4598 | | 15 (0)| 00:00:01 |
|* 8 | INDEX UNIQUE SCAN | U$PK$0000318903 | 1 | | 1 (0)| 00:00:01 |
|* 9 | TABLE ACCESS BY INDEX ROWID | CALLSIGN_SPS | 1 | 11 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------


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

1 - filter("RNUM">0)
2 - filter(ROWNUM<=1000)
6 - filter("T0"."TYPE$ID"=318903)
7 - filter("T0"."CALLSIGN" LIKE '%%')
8 - access("T1"."ID$"="T0"."ID$")
9 - filter("T1"."FORMAT"='INT')

Note
-----
- dynamic statistics used: dynamic sampling (level=2)
- 1 Sql Plan Directive used for this statement
28 ноя 18, 18:23    [21747764]     Ответить | Цитировать Сообщить модератору
 Re: долгий запрос, потом быстро  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 635
flint1,

Такое? Ну и со скобками - зачем, и LIKE '%%' можно менять на is not null
                SELECT
----- тут ещё много полей
                    t0.id$                      AS a1,
                    t0.type$id                AS a2,
                    t0.callsign                AS a5,
                    t1.id$                      AS a22,
                    t1.format                 AS a23
                FROM
                    callsign_base t0,
                    callsign_sps t1
                WHERE
                    ( ( t0.callsign LIKE '%%'  AND 
                            ( t1.format = 'INT' ) )
                      AND ( ( t1.id$ = t0.id$ )
                            AND ( t0.type$id = 318903 ) ) )
                ORDER BY
                    t0.callsign
FETCH FIRST 1000 ROWS ONLY;
28 ноя 18, 19:19    [21747828]     Ответить | Цитировать Сообщить модератору
 Re: долгий запрос, потом быстро  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16899
flint1
Может сам запрос с условием построен не верно?
хинты какие добавить?



|* 6 | TABLE ACCESS BY INDEX ROWID| CALLSIGN_BASE | 3566K| 268M| 4146 (1)| 00:00:01 |
==>|* 7 | INDEX FULL SCAN | CALLSGN | 4598 | | 15 (0)| 00:00:01 |


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

6 - filter("T0"."TYPE$ID"=318903)
7 - filter("T0"."CALLSIGN" LIKE '%%')

Note
-----
==> - dynamic statistics used: dynamic sampling (level=2)
==> - 1 Sql Plan Directive used for this statement


1. Освежите статистику на таблицах и индексах.
2. План запроса прибит гвоздиком, изучайте тему
https://docs.oracle.com/database/121/TGSQL/tgsql_profiles.htm#TGSQL599
3. 15 минут - это когда пошариться по индексам и реально собрать данные с диска. При указанном плане данные попадут в буферный кэш, и последующие вызовы не будут читать диск.
К сожалению, SGA не резиновая и прочитанные индексные блоки будут вымываться из кэша.
Попытаться удержать их в SGA, конечно, можно, но очень не рекомендовал бы - коллеги обидятся :)
4. Сократить "15 минут" с указанным набором предикат можно, если уйти от IFS CALLSGN в пользу FTS CALLSIGN_BASE, однако не уверен, что "t0.callsign LIKE '%%'" - именно то, ради чего создавался запрос.
28 ноя 18, 19:33    [21747836]     Ответить | Цитировать Сообщить модератору
 Re: долгий запрос, потом быстро  [new]
Melkomyagkii_newbi
Member

Откуда: из прошлого
Сообщений: 1700
а нет возможности показать план с реальными цифрами? Может он замониторился и есть необходимая лицензия - тогда например так:
select dbms_sqltune.report_sql_monitor(sql_id => '&sql_id', type => 'TEXT', report_level => 'ALL') as report from dual;
29 ноя 18, 20:05    [21749076]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить