проблема производительности с предложением ORDER BY с вызовом функции в списке выбора - PullRequest
0 голосов
/ 29 августа 2018

У меня есть проблемы в запросе ниже, так как запрос ниже использует вызов PKG.GET_PHONE_NUMBER в выбранном списке для получения сведений о телефоне, и с помощью ORDER BY для завершения 16k строк требуется около 2 минут. , без ORDER BY это быстро.

Ниже query появится столбец PK key с описанием и телефонными данными для вызова функции с указанными ниже параметрами для получения основного, дополнительного и факсимильного номеров.

    SELECT distinct PK_column , 
           description , 
           PKG.GET_PHONE_NUMBER (pk_column,'PRI') primary_phone_no ,
           PKG.GET_PHONE_NUMBER (pk_column,'SCD') sec_phone_no , 
           PKG.GET_PHONE_NUMBER (pk_column,'FAX') fax_phone_no
    FROM table_name
    ORDER BY pk_column

Любая помощь с настройкой запроса приветствуется без создания временных таблиц?


Эта функция GET_PHONE_NUMBER ниже:

SELECT P.PHONE_AREA_CODE || P.PHONE_NUMBER INTO V_PHONE_NUMBER 
FROM PHONE P WHERE UPPER(P.PK_column) = UPPER(PK_column) 
 AND P.PHONE_NUMBER_TYPE = IN_PHONE_NO_TYP; 

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

ниже - это последний запрос, который повышает производительность, когда этот основной запрос соединяется с запросом функции, как предложил Крокодилко:

SELECT   CC.pk_column   pk_column,
         CC.DESCRIPTION   DESCRIPTION,
         PRI.PHONE_AREA_CODE || PRI.PHONE_NUMBER  PRIMARY_PHONE_NUMBER,
         SCD.PHONE_AREA_CODE || SCD.PHONE_NUMBER  SECONDARY_PHONE_NUMBER,
         FAX.PHONE_AREA_CODE || FAX.PHONE_NUMBER  SECONDARY_PHONE_NUMBER
         FROM table_name CC
         LEFT JOIN PHONE PRI
       ON  UPPER(PRI.pk_column)  = UPPER(CC.pk_column)                                       
         AND PRI.PHONE_NUMBER_TYPE   ='PRI'
           LEFT JOIN PHONE SCD
       ON  UPPER(SCD.pk_column)  = UPPER(CC.pk_column)                                       
         AND SCD.PHONE_NUMBER_TYPE   ='SCD'
         LEFT JOIN PHONE FAX
       ON  UPPER(FAX.pk_column)  = UPPER(CC.pk_column)                                       
         AND FAX.PHONE_NUMBER_TYPE   ='FAX'
         ORDER BY pk_column
0 голосов
/ 29 августа 2018

без ЗАКАЗА по быстрому.

То есть, без ORDER BY вы сразу получаете результаты. Но сколько времени потребуется, чтобы получить все результаты? Это, вероятно, не быстро.

Без ORDER BY Oracle может начать давать вам результаты сразу же по мере их получения. Но с ORDER BY Oracle необходимо получить все результаты внутри, чтобы можно было их отсортировать. Только тогда он может начать возвращать результаты.

Эта разница вводит многих новичков в заблуждение, что один запрос выполняется быстрее, чем другой. Запрос без ORDER BY выполняется «быстрее», только если вам действительно нужны первые несколько результатов. Если вам нужны все результаты, значит, они примерно одинаковы.

Что касается настройки идей, я не могу сказать много, не видя логики внутри PKG.GET_PHONE_NUMBER.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...