|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Цель была - понять есть ли в языке достаточно возможностей для реализации несложных constraints по колонке. Есть, инкапсулируешь логику работы с сущностью в пакете и не даешь прямого доступа к таблице. Триггеры, как ты уже убедился, не самый лучший способ реализации бизнес логики. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 14:40 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Эффективно - значит без table lock или строгой сериализации доступа к таблице. Материализованное представление с первичным ключем и check constraint в режиме refresh fast on commit. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 14:43 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode НеофитSQL Цель была - понять есть ли в языке достаточно возможностей для реализации несложных constraints по колонке. Есть, инкапсулируешь логику работы с сущностью в пакете и не даешь прямого доступа к таблице. Триггеры, как ты уже убедился, не самый лучший способ реализации бизнес логики. Извините, это общие слова. PL/SQL он одинаковый, что в триггере что в функции. Например, я реализую constraint двуникальности. Допустим я готов сделать таблицу недоступной, тем самым поломав парадигму SQL. Я умею написать пакет с функциями, но я не умею: - запретить прямой доступ не требуя переключения контекста - легко "инкапсулировать логику двуникальности" в пакете без сериализации доступа ко всей таблице Constraint по колонке - это непростая в целом задача для многопользовательского режима. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 14:55 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
andrey_anonymous НеофитSQL Эффективно - значит без table lock или строгой сериализации доступа к таблице. Материализованное представление с первичным ключем и check constraint в режиме refresh fast on commit. Первичный ключ не даст мне вставить второе значение, или я чего-то не понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 14:56 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
andrey_anonymous Материализованное представление с первичным ключем и check constraint в режиме refresh fast on commit. А зачем с первичным ключем? Ну и следует упомянуть это будет имитация отложенного ключа. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 15:14 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
SY А зачем с первичным ключем? Ну и следует упомянуть это будет имитация отложенного ключа. Для упрощения жизни - mat.view все-таки. ...deferred - да. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 15:20 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
andrey_anonymous Для упрощения жизни - mat.view все-таки. A что GROUP BY может выдать дубли? SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 15:26 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL, А кто тебе сказал, что реальная бизнес логика должна решаться исключительно парадигмой SQL, и что такое парадигма SQL? Если массовые вставки не планируются и вторых значений не много, то можно инкапсулировать вставку в триггере на вьюхе или процедуре, добавить поле номер двууникального значения и сделать уникальный ключ, вставка в процедуре/триггере off вьюхи идет с номером 1, если ошибка по уникальности то повторяем вставку с номером 2, если все равно ошибка по уникальности, то прокидываем ее наверх. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 15:34 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode НеофитSQL, А кто тебе сказал, что реальная бизнес логика должна решаться исключительно парадигмой SQL, и что такое парадигма SQL? Если массовые вставки не планируются и вторых значений не много, то можно инкапсулировать вставку в триггере на вьюхе или процедуре, добавить поле номер двууникального значения и сделать уникальный ключ, вставка в процедуре/триггере off вьюхи идет с номером 1, если ошибка по уникальности то повторяем вставку с номером 2, если все равно ошибка по уникальности, то прокидываем ее наверх. > что такое парадигма SQL? Я имел в виду, когда к данным применимы табличные операции. Если я правильно понял ваше решение, оно полагается на составной PK из двух колонок - одно для значения, второе для счетчика (1-2). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:15 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Я имел в виду, когда к данным применимы табличные операции. К представлениям применимы табличные операции. НеофитSQL Если я правильно понял ваше решение, оно полагается на составной PK из двух колонок - одно для значения, второе для счетчика (1-2). Да. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:22 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode НеофитSQL Я имел в виду, когда к данным применимы табличные операции. К представлениям применимы табличные операции. Хорошо. Я спрятал таблицу, но чтобы к ней можно было писАть через SQL, сделал представление. Теперь мне снова нужен триггер, только теперь на вьюхе, чтобы мой "особый" constraint исполнить. Так что ли? И как мне "прятать" исходную таблицу, чтобы руками не лезли, а только через представление? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:35 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Вопрос по теме: как в Оракле можно эффективно реализовать constraint двуникальности? Чтобы в одной колонке находилось не более двух одинаковых значений? Ну и я таки разочаровался в твоей адекватности ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:41 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров НеофитSQL Вопрос по теме: как в Оракле можно эффективно реализовать constraint двуникальности? Чтобы в одной колонке находилось не более двух одинаковых значений? С удовольствием почитал 15-летнюю тему, где все еще были молодые, решали задачки и не боялись ошибаться :) Да, там было много решений, но ни одно так и не оказалось полным. Решение с построчным dbmslock мне понравилось больше всего, т.к. у меня похоже, только я использую ITL locks, которых больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:34 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode НеофитSQL Если я правильно понял ваше решение, оно полагается на составной PK из двух колонок - одно для значения, второе для счетчика (1-2). Да. К сожалению, такое не работает для двух сессий. Жаль, выглядит просто и понятно (как это обычно и происходит в мире с одной сессией). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:35 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL я использую ITL locks, которых больше. Вы уверены что понимаете что есть ITL? А решение есть - и оно Вам было озвучено и тут, и там. Mat.view Refresh on commit + constraint на mat.view. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:37 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL К сожалению, такое не работает для двух сессий. Жаль, выглядит просто и понятно (как это обычно и происходит в мире с одной сессией). У тебя штатный PK перестал работать для двух сессий? Просто и понятно, но катастрофически для производительности при массовых вставках или большом количестве дублей. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 18:39 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
andrey_anonymous НеофитSQL я использую ITL locks, которых больше. Вы уверены что понимаете что есть ITL? А решение есть - и оно Вам было озвучено и тут, и там. Mat.view Refresh on commit + constraint на mat.view. Я услышал про Mat.view Refresh on commit. Там совершенно другое поведение, запоздалое, с уникальными граблями. https://dnikiforov.wordpress.com/2011/08/25/materialized-view-and-unique-constraints/ Кроме того, в этой теме обсуждается реализация unique constraint без использования встроенного, прикрепленного к чему-то другому. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 18:59 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Кроме того, в этой теме обсуждается реализация unique constraint без использования встроенного, прикрепленного к чему-то другому. Ты до сих пор носишься с этой бессмысленной идеей? В PL/SQL нет средств построения своих хранимых, независящих от таблиц индексов и блокировки их листов, поэтому решить эффективно можно только пользуясь стандартными индексами. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 19:09 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode НеофитSQL К сожалению, такое не работает для двух сессий. Жаль, выглядит просто и понятно (как это обычно и происходит в мире с одной сессией). У тебя штатный PK перестал работать для двух сессий? Просто и понятно, но катастрофически для производительности при массовых вставках или большом количестве дублей. Я думал о следующем примере: Код: plsql 1. 2. 3. 4. 5.
Неоправданное блокирование второй сессии. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 19:13 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Неоправданное блокирование второй сессии. А что, при обычной уникальности не висит? SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 19:24 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode НеофитSQL Кроме того, в этой теме обсуждается реализация unique constraint без использования встроенного, прикрепленного к чему-то другому. Ты до сих пор носишься с этой бессмысленной идеей? В PL/SQL нет средств построения своих хранимых, независящих от таблиц индексов и блокировки их листов, поэтому решить эффективно можно только пользуясь стандартными индексами. Это "hello world" для constraints по колонкам. Если я могу решить задачу уникальности, я могу решить общий случай, где критерий уникальности ключа является внешней функцией Distance(key1,key2) < М. Например: на период пандемии натуральным id не разрешается соприкасаться (разница должна быть > 1) :) Реализовать эффективный constraint на колонке, удовлетворяющий это правило. Второй пример: для таблицы регистрации торговых знаков нужно реализовать constraint, который не позволит им быть слишком похожими друг на друга. Похожесть определяется функцией расстояния DistanceTM(clob, clob) (описание торгового знака содержится в колонке типа CLOB). Третий пример: для улучшения диверсити лотереи гринкарты было решено отсеять "слишком похожих" кандидатов, соблюдая очередность поступления. Для этого DistanceGC(row,row) считает корреляцию по 300 параметрам, и кандидат "слишком похожий" на уже имеющихся в базе, считается "дупликатом". Насколько я понимаю, в многосессионном режиме Оракл такое не умеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 19:36 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
SY НеофитSQL Неоправданное блокирование второй сессии. А что, при обычной уникальности не висит? SY. При обычной уникальности висит. При "двуникальности" не должен, т.к. разрешено одно повторение. При "стоникальности" подвисание 99 сессий без необходимости становится серьезным барьером для производительности. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 19:39 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Это "hello world" для constraints по колонкам. Если я могу решить задачу уникальности, я могу решить общий случай, где критерий уникальности ключа является внешней функцией Distance(key1,key2) < М. Например: на период пандемии натуральным id не разрешается соприкасаться (разница должна быть > 1) :) Реализовать эффективный constraint на колонке, удовлетворяющий это правило. Второй пример: для таблицы регистрации торговых знаков нужно реализовать constraint, который не позволит им быть слишком похожими друг на друга. Похожесть определяется функцией расстояния DistanceTM(clob, clob) (описание торгового знака содержится в колонке типа CLOB). Третий пример: для улучшения диверсити лотереи гринкарты было решено отсеять "слишком похожих" кандидатов, соблюдая очередность поступления. Для этого DistanceGC(row,row) считает корреляцию по 300 параметрам, и кандидат "слишком похожий" на уже имеющихся в базе, считается "дупликатом". Насколько я понимаю, в многосессионном режиме Оракл такое не умеет. Кстати, раньше один эксперт хорошо известный в узких кругах пытался продавать такой продукт. В гугл - Oracle RuleGen Сейчас он сайт удалил и многое выпилено (но при умении искать можно найти), а раньше была доступна вся документация и даже исходники. Так вот "фишка" его решения была сериализация через dbms_lock. Ключевое различие в "id не разрешается соприкасаться" и озученного тобой ранее что-то типа "расстояние Левенштейна не превышает N" это то что в первом случае достаточно сравнить с двумя соседями а во втором со всеми записями в таблице. Вот тут можно пытаться сводить проблему полного перебора к неполному с помощью domain indexes (как, например, сделано в Spatial). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 20:01 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Кобанчег Ключевое различие в "id не разрешается соприкасаться" и озученного тобой ранее что-то типа "расстояние Левенштейна не превышает N" это то что в первом случае достаточно сравнить с двумя соседями а во втором со всеми записями в таблице. Для меня это не ключевое различие, это свойство функции расстояния, которое может повлиять на скорость. На логику кода реализующего constraint уникальности влияет мало. Индекс это полезная, но ортогональная оптимизация. Если строки короткие, я могу построить индекс в пространстве Левенштейна (а не линейный) и вместо полного перебора сравнивать только 2N соседей в N измерениях. Мое желание скопировать поведение PK связано с тем, что оно хорошо отполировано и широко известно. Лучше для общего случая я не придумаю. Пока я решил для insert (в пределах возможностей моих 3-сессионных тестов). Если не найду интереснее задачек, допилю delete/update. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 20:16 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Почитал про Oracle RuleGen, интересно. Учитывая количество подводных камней для multirow constraints, было бы намного лучше чтобы такие задачи решались профессионально. Еще лучше - чтобы были встроены в БД производителем, или продавались как надстройка. Даже если окажется что я худо-бедно и в основном на ощупь один раз правильно реализовал multirow constraint в триггере, это не значит что такой код легко сопровождаемый, или что я не сделаю ошибку в следующий раз в немного усложненной ситуации. Свои цели в этом вопросе я достиг, обработку конфликтов в PK понимаю намного лучше чем пару дней назад, использовал select..for update почти по прямому назначению, и увидел что большинство решений тяготеют или к MV-on-commit или GTT+автономные транзакции (я использовал второе). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 20:40 |
|
|
start [/forum/topic.php?fid=52&msg=40019666&tid=1880705]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 322ms |
total: | 475ms |
0 / 0 |