Oracle
 sql >> база данни >  >> RDS >> Oracle

Дали производителността ще се отрази, когато процедурата на базата данни се извиква от приложение много пъти?

Вашият съвет е правилен, би било по-добре да изпълнявате всички задачи на базата данни наведнъж. Във вашия сценарий има 2 основни въздействия върху производителността

  1. Превключването на контекста на pro*c между SQL машината и PL/SQL машината за изпълнение на нишките ви многократно. Обикновено най-големият проблем при много PL/SQL извиквания от клиентско приложение.
  2. Овърхедът на мрежовия стек (TNS) в комуникациите между вашето pro*c приложение и машината на базата данни - особено ако приложението ви е на различен физически хост.

Като каза това, вие създавате пул за свързване в края на приложението, слушателят на TNS също трябва да има пул от завещани сървърни shadow процеси, чакащи всяка мрежова връзка (това е настроено в listener.ora).

OCI влизането/излизането, когато shadow процесът вече чака свързване, е много бърз и не е огромен фактор за забавяне - не се тревожа за това, освен ако не трябва да стартира нов shadow процес на сървъра - тогава може да е много скъпо обаждане. Тъй като използвате групиране на връзки от страна на клиента, това обикновено не е проблем, а просто нещо, което трябва да имате предвид поради нишките във вашите повиквания. След като изчерпите набора от процеси в сянка на сървъра, ще забележите огромно влошаване, ако слушателят на TNS трябва да стартира още процес в сянка на сървъра.

Редактиране в отговор на новите въпроси:

  1. Много е свързано. Както беше посочено по-рано, трябва да минимизирате количеството plsql и sql извиквания във вашето C++ приложение. Всяко PLSQL извикване в рамките на извикването на вашето C++ приложение извиква SQL машината, която след това извиква PLSQL машината за извикването на процедурата. Така че, ако разделите процедурата си на 2 - вие удвоявате контекстните превключвания от SQL към PLSQL, което е по-скъпият превключвател, както е посочено в статията на Tom Kyte и моя личен опит.

  2. Отговаря се в 1. Но както казах по-рано, комуникационните разходи са на второ място, освен ако вашите хостове не са в различни физически мрежи и типовете данни, които прехвърляте. Например големите обектни параметри на C++ и големите набори от резултати на Oracle с много извиквания очевидно ще повлияят на забавянето на комуникациите с двупосочни пътувания. Не забравяйте, че с повече PLSQL извиквания вие също добавяте повече SQLNET трафик за настройката за всяка връзка и набор от резултати.

  3. няма 3. въпрос

  4. PLSQL към SQL в рамките на PLSQL двигателя е незначителен, така че не се вкопчвайте в него. Поставете всичките си SQL извиквания в рамките на 1 PLSQL извикване за максимална производителност. Не разделяйте обажданията само за да сте по-красноречиви на цената на изпълнението.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Функция за получаване на броя на делничните дни между две дати, с изключение на празниците

  2. SET NULL:Посочете низ, който да се връща всеки път, когато се появи нулева стойност в SQLcl / SQL*Plus

  3. добавяне на първичен ключ към sql изглед

  4. Oracle SQL Developer - прозорец с резултати от заявка с липсваща мрежа

  5. PL/SQL (Как да изчислим първия и последния ден на всяко тримесечие на всяка година)