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

Oracle 10g small Blob или Clob не се съхраняват в линия?

Поведението на Oracle LOB е следното.

LOB се съхранява вградено, когато:

(
  The size is lower or equal than 3964
  AND
  ENABLE STORAGE IN ROW has been defined in the LOB storage clause
) OR (
  The value is NULL
)

LOB се съхранява извън реда, когато:

(
  The value is not NULL
) AND (
  Its size is higher than 3964
  OR
  DISABLE STORAGE IN ROW has been defined in the LOB storage clause
)

Сега това не е единственият проблем, който може да повлияе на производителността.

Ако най-накрая LOB не се съхраняват вградени, поведението по подразбиране на Oracle е да избягва кеширането им (само вградените LOB се кешират в буферния кеш с другите полета на реда). За да кажете на Oracle да кешира и невградени LOB, трябва да се използва опцията CACHE, когато LOB е дефиниран.

Поведението по подразбиране е ENABLE STORAGE IN ROW и NOCACHE, което означава, че малките LOB ще бъдат вградени, големите LOB няма (и няма да бъдат кеширани).

И накрая, има и проблем с производителността на ниво комуникационен протокол. Типичните клиенти на Oracle ще извършат 2 допълнителни двупосочни посещения на LOB, за да ги извлекат:- едно за извличане на размера на LOB и съответно разпределяне на памет - едно за извличане на самите данни (при условие, че LOB е малък)

Тези допълнителни обиколки се извършват дори ако се използва интерфейс на масив за извличане на резултатите. Ако извлечете 1000 реда и размерът на вашия масив е достатъчно голям, ще платите за 1 двупосочно пътуване за извличане на редовете и 2000 двупосочни посещения за извличане на съдържанието на LOB.

Моля, имайте предвид, че не не зависят от факта, че LOB се съхранява в линия или не. Това са напълно различни проблеми.

За да оптимизира на ниво протокол, Oracle предостави нов OCI глагол за извличане на няколко LOB в едно двупосочно преминаване (OCILobArrayRead). Не знам дали нещо подобно съществува с JDBC.

Друг вариант е да обвържете LOB от страна на клиента, сякаш е голям RAW/VARCHAR2. Това работи само ако може да се дефинира максимален размер на LOB (тъй като максималният размер трябва да бъде предоставен по време на свързване). Този трик избягва допълнителните обиколки:LOB просто се обработват като RAW или VARCHAR2. Използваме го много в нашите интензивни LOB приложения.

След като броят на двупосочните пътувания бъде оптимизиран, размерът на пакета (SDU) може да бъде преоразмерен в мрежовата конфигурация, за да пасне по-добре на ситуацията (т.е. ограничен брой големи двупосочни посещения). Има тенденция да намалява събитията за изчакване „SQL*Net повече данни към клиента“ и „SQL*Net повече данни от клиента“.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. можем ли да изпълним unix команда от процедурата oracle10g

  2. Защо получавам PLS-00302:компонентът трябва да бъде деклариран, когато съществува?

  3. Изпълняване на 2 заявки едновременно на Oracle SQL Developer?

  4. Как да намеря параметри в заявка на Oracle, получена от v$sql?

  5. Excel ODBC Data Connection Време за заявка, необходимо за опресняване на всяка заявка