Oracle Internals - varchar и сборщик мусора - PullRequest
1 голос
/ 27 марта 2012

Мой вопрос основан на следующем: у меня есть блок кода, в котором я определил строку varchar, например:

v_string varchar(100);

Мой блок кода выглядит примерно так:

...   
v_string := 'x = ' || x || ', y = ' || y;
...

То есть v_string - это текст, который я использую для записи значений x и y.

Может кто-нибудь объяснить, как Oracle хранит такие объединенные строки? Я имею в виду, это положить их в кучу? Если так, будут ли они (могут) собирать мусор? Это слишком сильно влияет на производительность?

Спасибо!

1 Ответ

4 голосов
/ 28 марта 2012

Промежуточные объекты не будут созданы, поэтому не будет ничего для сборки мусора.

Когда вы объявляете v_string, Oracle выделяет 100 байт хранилища (при условии, что NLS_LENGTH_SEMANTICS является значением по умолчанию BYTE) для строки (более крупные строки не будут предварительно выделены, как это, и что составляет «больший размер» Строка "зависит от версии. В 11.2 ограничение составляет 4000 байт , хотя раньше оно составляло 2000 байт, и я не уверен, когда он изменился). Поскольку 100-байтовый буфер был предварительно выделен, достаточно легко объединить различные другие строки в этом предварительно выделенном буфере. Нет необходимости выделять дополнительное пространство для хранения промежуточных результатов, поэтому нет ресурсов для освобождения.

В какой-то момент v_string выйдет из области видимости, и буфер, выделенный для него, будет, конечно, освобожден. Но это будет в конце блока, где объявлен v_string.

...