Форум "DataBase и SQL"
Язык запросов баз даных
Firedird: уникальные индексы, уникальные ограничения и внешние ключиПросветите чайничка. ;) Есть подчиненная таблица, которая связана с главной по полю имеющему внешний ключ. Кроме этого у этой таблицы есть еще два внешних ключа на справочники. Значения по всем трем полям должны давать уникальную комбинацию. Подчиненная таблица будет достаточно большой(тысячи записей), справочники можно считать маленькими(сотни записей). Что в даном случае правильнее сделать: 1)построить уникальный индекс по всем троим полям или 2)добавить уникальное ограничение по значениям полей? Что будет работать быстрее? Насколько эффективен индекс по полям имеющим внешние ключи? Внешние ключи не более чем тригера проверящие связующие значения таблиц и к индексу не имеют никакого отношения или все же они имеют механизмы ускоряющие выборку(поиск) записей? Как влияет на быстродействие выборки составной индекс? Если в критерии поиска участвует только одно из троих полей, что лучше - один индекс по трем полям или три индекса по каждому полю?
|
|
#1 Andrey © 13.09.07 12:31:52
>Что в даном случае правильнее сделать А что правильнее, намылить шею или шею намылить? Уникальный констреинт в ФБ организован с помощью создания уникального индекса ) >Насколько эффективен индекс по полям имеющим внешние ключи На столько же, на сколько эфективен по полям не имеющим внешних ключей. >Внешние ключи не более чем тригера проверящие связующие значения таблиц И к индексу не имеют никакого отношения... но используют его, если он есть, для ускорения проверки. И всётаки это немного более чем триггера т.к. они работают вне контекста транзакции... но этим голову лучше не забивать ) >Как влияет на быстродействие выборки составной индекс? Если в критерии >поиска участвует только одно из троих полей, что лучше - один индекс по >трем полям или три индекса по каждому полю? Обычно влияет хорошо... когда используется... а когда не используется - никак не влияет ) А используется далеко не всегда. Например create table t1 (f1 integer, t2 integer, t3 integer); create index i1 on t1 (f1, f2, f3); -- используется индекс i1 select 1 from t1 where f1 = 1 and f2 = 2 and f3 = 3 select 1 from t1 where f1 = 1 and f2 = 2 select 1 from t1 where f1 = 1 -- НЕ используется индекс i1 select 1 from t1 where f2 = 2 select 1 from t1 where f3 = 3 Вобщем частично используется когда есть условие для первого поля, еще больше когда есть условия для первого и второго полей, и используется полностью когда есть усливия для первого, второго и третьего полей. Дальше писать лень ) |
|
> Уникальный констреинт в ФБ организован с помощью создания > уникального индекса это 100% ? тогда почему выделяют уникальный индекс отдельно и констрейнт отдельно? а если вот так? > select 1 from t1 where f1 = 1 and f3 = 3 |
|
#3 Andrey © 13.09.07 15:51:51
>это 100% Такую гарантию может дать только морг. Я думаю что они организованы одинаково. По крайне мере в служебной таблице RDB$INDEXSES (или как там ее) при создании уник констреинта добавляется запись. Почему они разделены - незнаю, думаю что исторически сложилось ) >а если вот так А если бы у бабушки был член это был бы уже дедушка. Индекс будет использоваться только для поиска по части условия f1 = 1, для второй части условия будет выбран перебор... при наличии отдельного индекса начинающегося с поля f3 взможно будет выбрано слияние индексов (при достаточно высокой их селективности обоих индексов). |
Написать ответ |
|

