Что ж, этот может иметь смысл для больших баз данных, когда вам нужно быстрый ответ на массовый DML
(INSERT / UPDATE / DELETE
).
Проблема в том, что если вы полагаетесь на способ обеспечения целостности базы данных, вы вряд ли сможете ее оптимизировать.
Существует также вещь, называемая SQL/PLSQL context switching
в Oracle
: если вы создадите пустой триггер на столе, он замедлится DML
примерно в 20 раз - просто потому, что триггер существует.
В Oracle, когда вы пишете триггер ON UPDATE
и обновляете строки 50,000
в таблице, триггер и запрос в нем вызываются 50,000
раз. Внешние ключи работают лучше, но они также могут запаздывать (и вы ничего не можете сделать с базовыми запросами)
В этом случае лучше поместить результаты, которые вы хотите обновить, во временную таблицу, ввести MERGE
, проверить целостность до и после и применить бизнес-правила. Один запрос, обрабатывающий 50,000
строк, работает быстрее, чем цикл из 50,000
запросов, обрабатывающих одну строку.
Конечно, это очень сложно реализовать и окупается только тогда, когда у вас есть действительно большая база данных и вам нужно выполнить действительно массивных обновлений для нее.
В Oracle
в любом случае ограничения FOREING KEY
работают лучше, чем у тигров, реализующих ту же функциональность.
PRIMARY KEYS
, скорее всего, улучшит производительность, поскольку первичный ключ подразумевает создание UNIQUE INDEX
в ограниченном поле, и этот индекс может эффективно использоваться в запросах. UNIQUE INDEX
также является естественным и наиболее эффективным способом обеспечения уникальности.
Но, конечно, как и любой индекс, замедляется INSERTS
и те UPDATES
и DELETES
, чье WHERE
условие не является селективным.
I. е. если вам нужно UPDATE
или DELETE
1
строка 2,000,000
, то индекс ваш друг; если вам нужно UPDATE
или DELETE
1,500,000
строк по 2,000,000
, индекс - ваш враг. Это вопрос компромисса.
Вы также можете увидеть мой ответ здесь .