Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Unique constraint + index  [new]
collow
Member

Откуда:
Сообщений: 324
То есть я не решаю практическую задачу, я пытаюсь понять, почему так, хотя, по-моему, ничто не мешало бы сделать еще и так.
20 мар 12, 19:00    [12283692]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
collow
почему принципиально нельзя подсунуть "частичный индекс" под уникальный ключ

ну с ручника то пора уже сниматся на второй то странице...) ответьте на вопрос. как частичный индекс с 10 записями на условие может быть уникальным? вот мы навешиваем constraint и видим неуникальные данные. игнорировать? ну ок. проигнорили.. забили. вставляем новые данные. лочим всю таблицу, индекс то неуникальный и шерстим всю таблицу.
попробуйте перечитать концепции что такое индекс. почему он и зачем он.
collow
Индекс на модификацию - имел ввиду что модифицировать обычно надо по первичному ключу, а читать - по другим ключам

бред. и модифицировать можно по "другим ключам" и выбирать можно по первичному ключу. все зависит от задачи
20 мар 12, 19:07    [12283721]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
collow
Member

Откуда:
Сообщений: 324
Индекс и не будет уникальным. Уникальным будет констрейнт, который для обеспечения уникальности будет блокировать больше, чем нужно, но тем не менее это можно ему позволить.

Бред, простите, когда пишут "всегда, потому что плохо". Я пишу - "обычно так". То есть чаще так, чем по другому, в OLTP по крайней мере.
20 мар 12, 19:15    [12283764]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Don't feed the troll

К сообщению приложен файл. Размер - 20Kb
20 мар 12, 19:43    [12283884]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
collow
Индекс и не будет уникальным. Уникальным будет констрейнт, который для обеспечения уникальности будет блокировать больше, чем нужно, но тем не менее это можно ему позволить.


Ну и ради бога. Создай неуникальный индекс a затем уникальный констрейнт ссылающийся на неуникальный индекс.

SQL> create table emp1 as select empno,ename from emp
  2  /

Table created.

SQL> create index emp1_idx1 on emp1(empno)
  2  /

Index created.

SQL> alter table emp1
  2    add constraint emp1_uk1
  3    unique(empno)
  4    using index emp1_idx1
  5  /

Table altered.

SQL> insert
  2    into emp1
  3    values(1,'SY')
  4  /

1 row created.

SQL> insert
  2    into emp1
  3    values(7782,'collow')
  4  /
insert
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.EMP1_UK1) violated


SQL> 


SY.
20 мар 12, 20:55    [12284134]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
Глупый Телевизор
Member

Откуда: телевизор больше не смотреть (с)
Сообщений: 679
SY,

Осталось только заметить, что фактически неуникальных индексов быть не может.
Хотя это уже философия.
http://www.oracle.com/technetwork/issue-archive/o14asktom-084433.html
The only difference between a unique and a nonunique index is whether the ROWID is considered part of the key for uniqueness or not. In a conventional B*Tree index, there is only one kind of index: unique. In a nonunique index, Oracle Database will consider the ROWID as part of the key.

Since a ROWID is unique within a table, that will ensure that all of the keys in the B*Tree are unique. So the key in a nonunique B*Tree index includes the ROWID value. In a unique index, Oracle Database does not consider the ROWID as part of the key—but rather, just as data. In that fashion, the database will ensure that your indexed columns are, in fact, unique in the table. In both cases, Oracle Database is storing your indexed columns and the ROWID . It just uses the ROWID as part of the key in a nonunique index.
20 мар 12, 21:05    [12284167]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
умный радиоприёмник
Guest
Глупый Телевизор
SY,

Осталось только заметить, что фактически неуникальных индексов быть не может.
Хотя это уже философия.
http://www.oracle.com/technetwork/issue-archive/o14asktom-084433.html
The only difference between a unique and a nonunique index is whether the ROWID is considered part of the key for uniqueness or not. In a conventional B*Tree index, there is only one kind of index: unique. In a nonunique index, Oracle Database will consider the ROWID as part of the key.

Since a ROWID is unique within a table, that will ensure that all of the keys in the B*Tree are unique. So the key in a nonunique B*Tree index includes the ROWID value. In a unique index, Oracle Database does not consider the ROWID as part of the key—but rather, just as data. In that fashion, the database will ensure that your indexed columns are, in fact, unique in the table. In both cases, Oracle Database is storing your indexed columns and the ROWID . It just uses the ROWID as part of the key in a nonunique index.


Слушайте, зачем здесь демонстрировать свою крутость?
Неужели SY будучи модератором, не знает как устроен индекс?

Да и зачем эту глупость про то что неуникальных индексов не бывает, транслировать.
Как устроен индекс внутри рассматривают на уровне администраторов-экспертов, понимание уникальности, неуникальности индекса даётся на уровне разработки приложений. Вы пытаетесь состыковать уровни, которые в принципе не предназначены для стыковки.
20 мар 12, 21:57    [12284411]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
умный радиоприёмник,

Простите, что встрял в дискуссию.
20 мар 12, 23:26    [12284818]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18484
collow
почему принципиально нельзя подсунуть "частичный индекс" под уникальный ключ, чем собственно он принципиально отличается от неуникального индекса.
Чтобы проверить уникальность достаточно просмотреть только индекс. Если в нем не все поля, то необходимо будет еще лезть в таблицу. Нафига козе боян? Так можно договориться до того, что индекс вообще не нужен ;-)
collow
зачем собственно есть возможность использовать неуникальный индекс? В каких случаях это может быть востребовано
Например, отложенные (DEFERRED) ограничения уникальности
21 мар 12, 02:05    [12285201]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
collow
Member

Откуда:
Сообщений: 324
Вячеслав,
отложенная проверка может быть использована и на уникальном, и на неуникальном индексе. Это больше пример того, зачем нужен уникальный констрейнт, если можно обойтись индексом.
21 мар 12, 11:02    [12286189]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
89261046253
Guest
collow
отложенная проверка может быть использована и на уникальном

продемонстрируешь?
21 мар 12, 11:05    [12286209]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
collow
Member

Откуда:
Сообщений: 324
Факт, погорячился. Неуникальный индекс под отложенный констрейнт подсунуть нельзя. Ладно, тогда переформулирую. Этот пример не показывает необходимость использования неуникального индекса!
21 мар 12, 11:21    [12286324]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
collow
Member

Откуда:
Сообщений: 324
Опять погорячился, не так тест-кейс сделал.
21 мар 12, 11:23    [12286334]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
collow
Member

Откуда:
Сообщений: 324
Ладно, действительно один полезный вариант использования есть. На этом успокоился.
21 мар 12, 11:23    [12286341]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Unique constraint + index  [new]
Апну
Guest
Можно ли при создании уникального констрейнта по одному полу (id) с использованием существующего составного индекса
сделать так, чтобы оракл понимал, что при поиске по id надо делать unique scan, а не range scan?

То есть имеется индекс (id, filed1, field2)
Делаем констрейнт уникальности id
и дальше чтобы при запросе по id получали unique scan.
28 июн 16, 17:23    [19346796]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
Апну,

если у тебя нету уникального индекса по колонке id, то при создании констрейнта он создастся автоматически.
28 июн 16, 17:31    [19346853]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
прошу прощения, ступил..
28 июн 16, 17:40    [19346889]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Апну,

Цель добиться consistent gets - examination вместо consistent gets или преследуется иной глубокий смысл?
28 июн 16, 17:57    [19346989]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
Апну
Guest
dbms_photoshop
Цель добиться consistent gets - examination вместо consistent gets или преследуется иной глубокий смысл?

В такую внутрь не вникал. Цель - сравнить план. Сейчас в плане по рейнджскану выдает кост в сотни и выборку кучи байт/строк (статистика собрана). Не очень нравится это и хотелось бы дать ему понять, что id - уникальное поле. Но видимо, только если построить уникальный индекс только по id, но такой индекс тоже не устраивает, нужен составной.
28 июн 16, 20:22    [19347475]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
Takurava
Member

Откуда:
Сообщений: 1776
Апну
только если построить уникальный индекс только по id, но такой индекс тоже не устраивает, нужен составной.
Если ID уникально, то составной тоже будет уникальным.
28 июн 16, 22:30    [19347732]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
мудёр
Guest
Takurava
Если ID уникально, то составной тоже будет уникальным.
и что это дает для вопроса "при поиске по id надо делать unique scan, а не range scan"?
28 июн 16, 23:50    [19348019]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
Апну
только по id, но такой индекс тоже не устраивает, нужен составной.
простите, а чем именно не устраивает такой индекс, если id-таки уникально?
или вас не устраивает единовременное существование обоих индексов?
29 июн 16, 00:50    [19348096]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18484
When the Optimizer Considers Index Unique Scans
29 июн 16, 02:33    [19348138]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
Апну
Guest
--Eugene--
простите, а чем именно не устраивает такой индекс, если id-таки уникально?
или вас не устраивает единовременное существование обоих индексов?

Не устраивает тем, что составной индекс строится по полям where и select, т.о. при запросе к таблице не обращаемся, все берем из индекса, что ощутимо ускоряет запрос.
Вячеслав Любомудров, да.
docs.oracle.com
Oracle performs a unique scan if a statement contains a UNIQUE or a PRIMARY KEY constraint that guarantees that only a single row is accessed.

Замечательно и вроде как известно, но ок:
1. делаем табличку
CREATE TABLE test_tab
AS  
SELECT ROWNUM ID, '123' vl FROM dual CONNECT BY LEVEL<1000000;

2. делаем нужный составной индекс
CREATE INDEX test_tab_i ON test_tab(id, vl) TABLESPACE uix;

3. создаем констрейнт
ALTER TABLE test_tab ADD CONSTRAINT test_tab_uk PRIMARY KEY (id) USING INDEX test_tab_i;

(можно уник., результат тот же)
Условие изложенное в доке выполнено? Вроде да.
Но
SELECT ID FROM test_tab WHERE id = :id

дает range scan :( Только что там не сказано, что он обязательно выберет unique scan, но все равно досадно )
29 июн 16, 09:37    [19348488]     Ответить | Цитировать Сообщить модератору
 Re: Unique constraint + index  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18484
Уже и читать тебя учить?
по ссылке
This access path is used when all columns of a unique (B-tree) index or an index created as a result of a primary key constraint are specified with equality conditions.
29 июн 16, 09:40    [19348504]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Oracle Ответить