TL; DR: Избегайте CLOB, используйте VARCHAR2 с разумной длиной.
Я полностью согласен с @a_horse_with_no_name относительно CLOB и varchar2(32767)
.
Однако, Я бы не рекомендовал максимальный размер для VARCHAR2(4000)
, но использовать разумный верхний предел, который на самом деле довольно сложно оценить. Пользователи и другие разработчики будут ненавидеть вас, если поле будет слишком коротким. И база данных будет делать странные вещи, если поле слишком длинное.
Поскольку VARCHAR2
хранит только фактические используемые символы, вы не найдете никакой разницы на стороне хранилища, это производительность во время вставки, обновления или delete, скорее всего, идентичен.
Однако иногда Oracle предполагает, что максимальная длина действительно используется:
CREATE TABLE t (
a VARCHAR2( 1 CHAR),
b VARCHAR2( 1 CHAR),
c VARCHAR2(4000 CHAR),
d VARCHAR2(4000 CHAR)
);
CREATE INDEX i1 ON t(a,b);
Index I1 created.
CREATE INDEX i1000 ON t(c, d);
ORA-01450: maximum key length (6398) exceeded
Кроме того, иногда возникает влияние на производительность, когда сервер базы данных (или клиент application) выделяет память по максимальной длине, например:
INSERT INTO t SELECT 'a','a','a','a' FROM all_objects;
INSERT INTO t SELECT 'b','b','b','b' FROM all_objects;
INSERT INTO t SELECT 'c','c','c','c' FROM all_objects;
INSERT INTO t SELECT 'd','d','d','d' FROM all_objects;
EXECUTE dbms_stats.gather_table_stats(null, 't');
SET AUTOTRACE TRACEONLY STAT
Теперь сортировка по столбцам VARCHAR2(1)
происходит в памяти (что быстро):
SELECT a,b FROM t ORDER BY a,b;
Statistics
----------------------------------------------------------
1 sorts (memory)
0 sorts (disk)
268520 rows processed
при сортировке по столбцы VARCHAR2(4000)
не помещаются в памяти и поэтому должны быть отсортированы на диске, что происходит медленно:
SELECT c,d FROM t ORDER BY c,d;
Statistics
----------------------------------------------------------
0 sorts (memory)
1 sorts (disk)
268520 rows processed
Я должен признать, что я установил доступную память на очень малое количество просто для того, чтобы докажите, но я думаю, вы уловили идею.