powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle UNIQUE INDEX
17 сообщений из 17, страница 1 из 1
Oracle UNIQUE INDEX
    #39626360
Olegush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Скажите пожалуйста какой смысл делать два UNIQUE INDEX по одним и тем же столбцам но в разной последовательности? Спасибо.
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626375
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Olegush,

От перестановки мест слагаемых, уникальность не меняется. А порядок разный может потребоваться для удовлетворения разных условий.
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626383
Olegush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,
авторОт перестановки мест слагаемых, уникальность не меняется. А порядок разный может потребоваться для удовлетворения разных условий.

То что уникальность не меняется я знаю. Вопрос был есть ли смысл именно два уникальных индекса иметь. И про удовлетворения разных условий я тоже знаю, вопрос - зачем именно уникальные сделали а не скажем один уникальный и один обычный?
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626417
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Olegush,

трудно что-то сказать, не зная деталей...
Может для уменьшения размера индекса
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
SQL> create table xtest as
  2  select
  3    level a, level b
  4  from dual
  5  connect by level<=1e6
  6  /

Table created.

SQL> create unique index ix1 on xtest(a,b);

Index created.

SQL> select bytes from user_segments where segment_name='IX1';

     BYTES
----------
  24117248

SQL> drop index ix1;

Index dropped.

SQL> create index ix1 on xtest(a,b);

Index created.

SQL> select bytes from user_segments where segment_name='IX1';

     BYTES
----------
  25165824


правда это добавляет оверхед на проверках уникальности при insert/update.
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626430
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender добавляет оверхед на проверках уникальности при insert/update.не факт, что декларация unique влияет на процесс изменения индекса.
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626442
d.nemolchev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-А порядок разный может потребоваться для удовлетворения разных условий.
Для поиска по различным сочетаниям вполне достаточно будет обычных индексов по составу полей, в который не входит хотя бы одно поле, входящее в состав полей уникального индекса.индекса.
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626443
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
-2-декларация unique влияет на процесс изменения индексапо-моему, это вполне очевидно, особенно, если в одной сессии удалить запись и не коммитить, а в другой попробовать вставить такие же значения.

зы. отдельно это можно сравнить с другим вариантом: если в одной сессии удалить вставить запись и не коммитить, а в другой попробовать вставить такие же значения.
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626444
d.nemolchev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПС.
Смысл создавать именно так поля вижу только для такого кейса:
Уникальным является сочетание (a,b), но будут извлечения значения <a> при поиске только по <b>, и для того чтобы оракл мог извлекать <a> напрямую из сегмента индекса, без чтения сегмента таблицы, и сделали индекс над (b, a).
А уникальным его сделали хз зачем, на всякий случай, видимо )
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626446
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
d.nemolchev-2-А порядок разный может потребоваться для удовлетворения разных условий.
Для поиска по различным сочетаниям вполне достаточно будет обычных индексов по составу полей, в который не входит хотя бы одно поле, входящее в состав полей уникального индекса.индекса.
если чисто гипотетически, то предикаты разные бывают, например, есть уникальные индексы на (a,b) и (b,a) есть такие наборы предикатов:
1. a in (:a1,:a2,:a3) and filter(b) = :fb
2. b in (:b1,:b2,:b3) and filter(a) = :fa

если из какого-нибудь из этих индексов убрать одно поле, например из уникального (b,a) сделать просто на b, то во втором варианте фильтр перейдет на таблицу
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626447
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ну и помимо этого диапазонные поиски по
1. a=:a and b between :b1 and :b2
2. b=:b and a between :a1 and :a2
будут не так эффективны.

Но это все гипотетически, в реальной жизни я такой необходимости еще не встречал
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626450
d.nemolchev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

я имел ввиду случай, когда к таблице обращаются ограниченным кол-вом запросов типа
1. select ... where a = :a1
2. select a from ... where b = :b1
для случая 2 при наличии индекса над (b,a) обращения же к сегменту таблицы не будет...
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626505
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d.nemolchev-2-А порядок разный может потребоваться для удовлетворения разных условий.Для поиска по различным сочетаниям вполне достаточно будет обычных индексов по составу полей, в который не входит хотя бы одно поле, входящее в состав полей уникального индекса.индекса.select a from t where b = :b; -- оптимальный индекс b, a
и
select b from t where a = :a; -- оптимальный индекс a, b

xtender-2-декларация unique влияет на процесс изменения индексапо-моему, это вполне очевидно, особенно, если в одной сессии удалить запись и не коммитить, а в другой попробовать вставить такие же значения.Вполне очевидно, что вопрос уникальности это бизнес-требования. Приведенную тобой ситуацию неправильно рассматривать как "оверхед". Рассматривать оверхед от указания unique нужно в контексте дублирующего индекса или одного индекса, когда обеспечивается естественная уникальность. Только в этом случае допустим выбор между указывать или не указывать unique.
Утверждаю, что такого оверхеда нет. Если один и тот же индекс (не)указать unique, на время вставки и апдейта уникального ключа это не повлияет.
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626543
d.nemolchev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

where b = :b; -- оптимальный индекс b, a

Он оптимален если выбирается только <а>.
А если там ещё и другие поля вытаскивают, то включение в состав индекса поля <а> Избыточно и бессмысленно.
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626545
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d.nemolchevА если там ещёа если еще и в where нет условия по b, то жизнь бессмысленна и беспощадна.
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626559
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
-2-Приведенную тобой ситуациюммда... вообще-то я имел ввиду не сами блокировки, а просто показал, что с уникальными индексами вызывается дополнительный код проверки уникальности - он не может быть бесплатным.


-2-Утверждаю, что такого оверхеда нет. Если один и тот же индекс (не)указать unique, на время вставки и апдейта уникального ключа это не повлияет.
например так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
SQL> create table xtest(a int,b int,c int,d int);

Table created.

SQL> insert into xtest select level,level,level,level from dual connect by level<=3e4;

30000 rows created.

SQL>
SQL> create index ixa on xtest(a);

Index created.

SQL> create index ixb on xtest(b);

Index created.

SQL> create index ixc on xtest(c);

Index created.

SQL> create index ixd on xtest(d);

Index created.

SQL> set timing on;
SQL> update xtest set a=a*2,b=b*2,c=c*2,d=d*2;

30000 rows updated.

Elapsed: 00:00:04.61
SQL>
SQL> set timing off;
SQL> drop index ixa;

Index dropped.

SQL> drop index ixb;

Index dropped.

SQL> drop index ixc;

Index dropped.

SQL> drop index ixd;

Index dropped.

SQL> truncate table xtest;

Table truncated.

SQL> insert into xtest select level,level,level,level from dual connect by level<=3e4;

30000 rows created.

SQL> create unique index ixa on xtest(a);

Index created.

SQL> create unique index ixb on xtest(b);

Index created.

SQL> create unique index ixc on xtest(c);

Index created.

SQL> create unique index ixd on xtest(d);

Index created.

SQL> set timing on;
SQL> update xtest set a=a*2,b=b*2,c=c*2,d=d*2;

30000 rows updated.

Elapsed: 00:00:11.79

...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626595
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderнапример такэто специфичный тест, связанный со значительным увеличением размера ключа. В случае неуникального индекса увеличение ключа играет значительно меньшую роль на фоне размера rowid.

Исходный insert level у меня дал: 00:00:03.572 и 00:00:08.440 (u).
Если в исходном инсерте вставлять большие значения, то разница уже в пределах погрешности.
insert level+1e6: 00:00:01.982 и 00:00:01.965(u)
...
Рейтинг: 0 / 0
Oracle UNIQUE INDEX
    #39626614
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
-2-вставлять большие значенияпросто тогда нивелируется разница за счет выигрыша в размере индекса.

а вот с большими так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
SQL> create table xtest(a varchar2(20),b varchar2(20),c varchar2(20),d varchar2(20));

Table created.

SQL>
SQL> insert into xtest select lpad(level,20,'0'),lpad(level,20,'0'),lpad(level,20,'0'),lpad(level,20,'0') from dual connect by level<=3e4;

30000 rows created.

SQL>
SQL> create index ixa on xtest(a,b,c,d);

Index created.

SQL> set timing on;
SQL> update xtest set a=translate(a,'0','x'),b=translate(b,'0','x'),c=translate(c,'0','x'),d=translate(d,'0','x');

30000 rows updated.

Elapsed: 00:00:02.78
SQL> select bytes from user_segments where segment_name='IXA';

     BYTES
----------
   9437184

SQL> set timing off;
SQL> drop index ixa;

Index dropped.

SQL> truncate table xtest;

Table truncated.

SQL> insert into xtest select lpad(level,20,'0'),lpad(level,20,'0'),lpad(level,20,'0'),lpad(level,20,'0') from dual connect by level<=3e4;

30000 rows created.

SQL> create unique index ixa on xtest(a,b,c,d);

Index created.

SQL> set timing on;
SQL> update xtest set a=translate(a,'0','x'),b=translate(b,'0','x'),c=translate(c,'0','x'),d=translate(d,'0','x');

30000 rows updated.

Elapsed: 00:00:03.05
SQL> select bytes from user_segments where segment_name='IXA';

     BYTES
----------
   9437184

...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle UNIQUE INDEX
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]