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

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

То что уникальность не меняется я знаю. Вопрос был есть ли смысл именно два уникальных индекса иметь. И про удовлетворения разных условий я тоже знаю, вопрос - зачем именно уникальные сделали а не скажем один уникальный и один обычный?
...
Рейтинг: 0 / 0
05.04.2018, 22:16
    #39626417
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle UNIQUE INDEX
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
05.04.2018, 23:06
    #39626430
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle UNIQUE INDEX
xtender добавляет оверхед на проверках уникальности при insert/update.не факт, что декларация unique влияет на процесс изменения индекса.
...
Рейтинг: 0 / 0
06.04.2018, 01:14
    #39626442
d.nemolchev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle UNIQUE INDEX
-2-А порядок разный может потребоваться для удовлетворения разных условий.
Для поиска по различным сочетаниям вполне достаточно будет обычных индексов по составу полей, в который не входит хотя бы одно поле, входящее в состав полей уникального индекса.индекса.
...
Рейтинг: 0 / 0
06.04.2018, 01:20
    #39626443
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle UNIQUE INDEX
-2-декларация unique влияет на процесс изменения индексапо-моему, это вполне очевидно, особенно, если в одной сессии удалить запись и не коммитить, а в другой попробовать вставить такие же значения.

зы. отдельно это можно сравнить с другим вариантом: если в одной сессии удалить вставить запись и не коммитить, а в другой попробовать вставить такие же значения.
...
Рейтинг: 0 / 0
06.04.2018, 01:20
    #39626444
d.nemolchev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle UNIQUE INDEX
ПС.
Смысл создавать именно так поля вижу только для такого кейса:
Уникальным является сочетание (a,b), но будут извлечения значения <a> при поиске только по <b>, и для того чтобы оракл мог извлекать <a> напрямую из сегмента индекса, без чтения сегмента таблицы, и сделали индекс над (b, a).
А уникальным его сделали хз зачем, на всякий случай, видимо )
...
Рейтинг: 0 / 0
06.04.2018, 01:26
    #39626446
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle UNIQUE INDEX
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
06.04.2018, 01:31
    #39626447
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle UNIQUE INDEX
ну и помимо этого диапазонные поиски по
1. a=:a and b between :b1 and :b2
2. b=:b and a between :a1 and :a2
будут не так эффективны.

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

я имел ввиду случай, когда к таблице обращаются ограниченным кол-вом запросов типа
1. select ... where a = :a1
2. select a from ... where b = :b1
для случая 2 при наличии индекса над (b,a) обращения же к сегменту таблицы не будет...
...
Рейтинг: 0 / 0
06.04.2018, 08:38
    #39626505
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle UNIQUE INDEX
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
06.04.2018, 09:29
    #39626543
d.nemolchev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle UNIQUE INDEX
-2-,

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

Он оптимален если выбирается только <а>.
А если там ещё и другие поля вытаскивают, то включение в состав индекса поля <а> Избыточно и бессмысленно.
...
Рейтинг: 0 / 0
06.04.2018, 09:34
    #39626545
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle UNIQUE INDEX
d.nemolchevА если там ещёа если еще и в where нет условия по b, то жизнь бессмысленна и беспощадна.
...
Рейтинг: 0 / 0
06.04.2018, 09:45
    #39626559
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle UNIQUE INDEX
-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
06.04.2018, 10:13
    #39626595
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle UNIQUE INDEX
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
06.04.2018, 10:42
    #39626614
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle UNIQUE INDEX
-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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle UNIQUE INDEX / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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