IsiR_19 Ответов: 1

Как повысить производительность моего SQL-скрипта


Привет надеюсь у тебя все хорошо

В настоящее время я сталкиваюсь с проблемой с производительностью моего SQL-скрипта, скрипт возвращает то, что требуется, когда количество данных достигает примерно 10 000 записей, то он начинает замедляться, иногда занимая до 2 минут, чтобы вернуть количество.

Как я мог бы улучшить свой сценарий, чтобы повысить скорость?

Таким образом, в основном то, что я пытаюсь достичь, заключается в том, что я пытаюсь сделать подсчет конкретного процесса(Pro_id), основанного на статусе

Чего я хотел добиться, так это разбить каждый статус на их собственный столбец, а не иметь их в своей собственной строке.

У меня есть встроенные подзапросы для этого, но как только количество данных начинает доходить до 10 000-12 000 записей, требуется некоторое время, чтобы вернуть данные, и я использую это для мониторинга состояния, поэтому должен быть как можно быстрее

Что я уже пробовал:

select int_desc "Interface",
       NVL((select count(*)
       from queue, "interface" where
       "interface" = interface_key
       and que_from_cde in
       (
        select queue_key from queue
       WHERE que_filepath like '\\MyNet\TESTING\' || "interface" ||  batch || '\%'
       and pro_id = 36 and status_id = 3
       )
       and pro_id in (80)
       and status_id = 1
       and que_interface_key = c.que_interface_key
       group by int_desc,status_id),0) as "Pending",
       NVL((select count(*)
       from queue,"interface" where
       que_interface_key = interface_key(+)
       and que_from_cde in
       (
       select queue_key from queue
       WHERE que_filepath like '\\MyNet\TESTING\' || interface || batch|| '\%'
       and pro_id = 36 and status_id = 3
       )
       and pro_id in (80)
       and status_id = 2
       and que_interface_key = c.que_interface_key
       group by int_desc,status_id),0) as "Processing",
       NVL((select count(*)
       from queue,"interface" where
       que_interface_key = interface_key(+)
       and que_from_cde in
       (
       select queue_key from queue
       WHERE que_filepath like '\\MyNet\TESTING\' || interface ||  batch|| '\%'
       and pro_id = 36 and status_id = 3
       )
       and pro_id in (80)
       and status_id = 3
       and que_interface_key = c.que_interface_key
       group by int_desc,status_id),0) as "Sucessful",
       NVL((select count(*)
       from queue,"interface" where
       que_interface_key = interface_key(+)
       and que_from_cde in
       (
       select queue_key from queue
       WHERE que_filepath like '\\MyNet\TESTING\' || interface ||  batch|| '\%'
       and pro_id = 36 and status_id = 3
       )
       and pro_id in (80)
       and status_id = 4
       and que_interface_key = c.que_interface_key
       group by int_desc,status_id),0) as "Failed",
       NVL((select count(*)
       from queue,"interface" where
       que_interface_key = interface_key(+)
       and que_from_cde in
       (
       select queue_key from queue
       WHERE que_filepath like '\\MyNet\TESTING\' || interface ||  batch|| '\%'
       and pro_id = 36 and status_id = 3
       )
       and pro_id in (80)
     and status_id = 5
 and que_interface_key = c.que_interface_key
    group by int_desc,status_id),0) as "Duplicate/In Progress"
      from queue c,"interface" where
      que_interface_key = interface_key(+)
     and queue_key in
     (
     select queue_key from queue
    WHERE que_filepath like '\\MyNet\TESTING\' || interface ||  batch|| '\%'
   and pro_id = 36
      )
      and c.status_id = 3
    group by int_desc,"interface"

1 Ответов

Рейтинг:
2

W∴ Balboos, GHB

Вот, пожалуй, закуска:

Вы продолжаете выполнять ту же самую инструкцию SQL:

select queue_key from queue
       WHERE que_filepath like '\\MyNet\TESTING\' || interface ||  batch|| '\%'
       and pro_id = 36 and status_id = 3
Как насчет того, чтобы выполнить его один раз и поместить результаты во временную таблицу? Таким образом, когда вы делаете оставшуюся часть своей работы, ставя в очередь временную таблицу, и вам не нужно держать (если у вас нет индексов, сканируйте!) целые таблицы снова и снова для одного и того же результата.

Если вы будете делать это часто, то вместо временной таблицы вы можете рассмотреть представление.

Попробуйте это для начала.