Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Влияние смены типа колонки CLOB на VARCHAR(4000) на перформанс с Database Cache  [new]
Antei
Member

Откуда: Ukraine
Сообщений: 121
Привет, форумчане!

Предыстория.
"перехожу" с Oracle на DB2.
Данные таблиц Oracle хранит данные в блоках, и в большинстве случаев если мы вставляем строку в таблицу, мы получим данные строки (все колонки которые не LOB) сохранённые в одном блокe.
Все LOB данные помещаются в отдельный space, в tablespace нашей таблицы мы будем иметь лишь референс на LOB.

Проблема.
Предположим что есть таблицы
- T1(F1 NUMBER, F2 CLOB) и
- T2(F1 NUMBER, F2 VARCHAR2(4000))

Предположим что данные по полю F2 нас не интересуют в большинстве случаев.
делаем селект:
1. SELECT F1 FROM T1
2. SELECT F1 FROM T2
В обоих случаях, т.к. Oracle работает с блоками, он поднимет в буфер всё что есть в блоке по строкам: F1(NUMBER) и F2(референс на CLOB или VARCHAR2)

То есть в случае 1 мы имеем в буфере просто ссылку на CLOB которая достаточно мала, а во 2м - сами строковые данные которые до 4000 байтов на строку таблицы. Т.е. в Оракле - смена CLOB на VARCHAR(4000) на перформанс работы DB Cache бы - повлияла существенно.

Вопрос.
Товарищи эксперты, поясните пожалуйста, как это работает в DB2, какой импакт там?

Спасибо.
21 фев 13, 19:53    [13963263]     Ответить | Цитировать Сообщить модератору
 Re: Влияние смены типа колонки CLOB на VARCHAR(4000) на перформанс с Database Cache  [new]
Константин Краснов
Member

Откуда: Москва
Сообщений: 26
В данной ситуации аналогично.
22 фев 13, 10:38    [13965318]     Ответить | Цитировать Сообщить модератору
 Re: Влияние смены типа колонки CLOB на VARCHAR(4000) на перформанс с Database Cache  [new]
Евгений Хабаров
Member

Откуда: Москва
Сообщений: 773
Если LOB небольшого размера (до 32К), его можно хранить прямо в строке таблицы.
Максимальный размер для INLINE-хранения можно задать явно.
Все что больше этого размера будет храниться в отдельном LOB-пространстве.

DB2 V9.7 : Storing LOBs inline in table rows
DB2 V9.7 : Inline LOBs improve performance
22 фев 13, 11:00    [13965474]     Ответить | Цитировать Сообщить модератору
 Re: Влияние смены типа колонки CLOB на VARCHAR(4000) на перформанс с Database Cache  [new]
mustaccio
Member

Откуда: Москва -> Торонто
Сообщений: 494
Antei
Т.е. в Оракле - смена CLOB на VARCHAR(4000) на перформанс работы DB Cache бы - повлияла существенно.


Зависит от того, что вы понимаете под "перформанс работы DB Cache". Заменив CLOB на VARCHAR(4000), вы будете за одну операцию чтения с диска переносить в буфер меньше строк. Если вы сканируете всю таблицу, то разница в скорости, очевидно, будет. Если вы читаете отдельные записи -- то, скорее всего, нет.

Следует отметить, что вввод/вывод LOBов в ДБ2 не буферизуется, то есть в тех случаях, когда вам все-таки потребуется F2, обращение к CLOB вызовет синхронную операцию чтения с диска.
22 фев 13, 11:18    [13965581]     Ответить | Цитировать Сообщить модератору
 Re: Влияние смены типа колонки CLOB на VARCHAR(4000) на перформанс с Database Cache  [new]
CawaSPb
Member

Откуда: Питер/Москва/Wroclaw
Сообщений: 1091
Antei,

Как Константин написал, ситуация аналогична... и двояка.

Действительно, если CLOB в подавляющем большинстве случаев не трогаем, то при преобразовании его в varchar размер строки вырастет на пару порядков (!!!) (ну, пусть меньше, не все же строки будут в 4000 символов)

НО! У T2 dедь наверняка есть индекс по T1. На селектах типа "2" будет задействован только он.
Работа же с LOB объёктами (особенно если она идёт не через LOB LOCATOR'ы) для базы - это "ад адский".
22 фев 13, 15:53    [13967757]     Ответить | Цитировать Сообщить модератору
 Re: Влияние смены типа колонки CLOB на VARCHAR(4000) на перформанс с Database Cache  [new]
Antei
Member

Откуда: Ukraine
Сообщений: 121
Всем огромное спасибо за исчерпывающие ответы!
Раз ситуация аналогичная с Oracle, тогда проблема становится более понятной.

Резюмируя:
- поля таблицы можно покрыть индексом (ами) не включая VARCHAR(4000) поле, т.е. избежать обращения к таблице
- про-профилировать запросы чтобы понять реальный импакт (просто запросы еще пишутся), действительно ведь импакт будет ощущаться только в случае массивных выборок и возможно лучшим решением будет использовать VARCHAR(4000) (данные здесь планируются всегда под завязку 4000)
- избегаем преобразования CLOB->VARCHAR в SQL запросах если оставляем CLOB
22 фев 13, 18:49    [13968676]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить