powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / долгий запрос, потом быстро
4 сообщений из 4, страница 1 из 1
долгий запрос, потом быстро
    #39740023
flint1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день. не имею опыта в sql .. просто подскажите.. спасибо.

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

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



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
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:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
----------------------------------------------------------------------------------------------------
| 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
...
Рейтинг: 0 / 0
долгий запрос, потом быстро
    #39740071
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flint1,

Такое? Ну и со скобками - зачем, и LIKE '%%' можно менять на is not null
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
                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;
...
Рейтинг: 0 / 0
долгий запрос, потом быстро
    #39740076
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flint1Может сам запрос с условием построен не верно?
хинты какие добавить?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
|*  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 '%%'" - именно то, ради чего создавался запрос.
...
Рейтинг: 0 / 0
долгий запрос, потом быстро
    #39740545
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а нет возможности показать план с реальными цифрами? Может он замониторился и есть необходимая лицензия - тогда например так:
Код: plsql
1.
select dbms_sqltune.report_sql_monitor(sql_id => '&sql_id', type => 'TEXT', report_level => 'ALL') as report from dual;
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / долгий запрос, потом быстро
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]