No Oracle, o LOB (incluindo BLOB) é armazenado como:
-
LOB in-the-table
- - se o LOB for menor que 3900 bytes, ele pode ser armazenado dentro da linha da tabela; por padrão, isso está ativado, a menos que você especifique DISABLE STORAGE IN ROW
- LOB normal - armazenado em um segmento separado, fora da tabela, você pode até colocá-lo em outro espaço de tabela; Para estes:
- um mínimo de bytes CHUNK são alocados e inteiramente redefinidos (mesmo que o LOB tenha apenas 1 byte)
- há um índice intermediário interno atrás de uma coluna LOB, que fica controversa em atualizações e pode praticamente serializá-las
- o acesso é de vários níveis e, portanto, relativamente mais lento
- com a opção NOCACHE, as waiters são "direct path read" - o padrão
- com a opção CACHE, os garçons são "leitura sequencial do arquivo db"
- em que CACHE_SIZE_THRESHOLD não é levado em consideração, portanto, um grande LOB pode desperdiçar seu cache
Portanto, se seus LOBs forem maiores que 4 kB, eles ficarão relativamente lentos, e isso pode simplesmente ser o seu caso. Eu examinaria os tamanhos.
Eu examinaria USER_LOBS (ou DBA_LOBS) para ver como as colunas LOB "boas" e "lentas" diferem em suas definições.
O ID 66431.1 da Metalink descreve isso e pode ser interessante para você, se você tiver acesso lá.
UPDATE : Fascinado pela quantidade selvagem aparentemente inexplicável de "leitura sequencial do arquivo db", eu fiz um pouco de pesquisa e descobri que coisas estranhas podem acontecer com o índice de lob após as DELETEs em massa . Apenas um palpite, mas parece muito semelhante ao seu caso. Se for isso, eu recompilar totalmente a coluna de lob . (Mover uma coluna de lob também pode reconstruir o índice de lob - não tenho certeza).