У меня есть много операторов SQL вставки / обновления / удаления, некоторые из которых являются избыточными. Например, у меня могут быть следующие типы избыточности:
1)
INSERT INTO "foo" ("id", ...) VALUES (123, ...)
...
DELETE FROM "foo" WHERE "id" = 123
2)
INSERT INTO "foo" ("id", "col", ...) VALUES (123, 'value', ...)
...
UPDATE "foo" SET "col" = 'other value' WHERE "id" = 123
3)
UPDATE "foo" SET "col" = 'value' WHERE "id" = 123
...
UPDATE "foo" SET "col" = 'other value' WHERE "id" = 123
4)
DELETE FROM "foo" WHERE "id" = 123
...
INSERT INTO "foo" ("id", ...) VALUES (123, ...)
Я мог бы забыть о некоторых других типах избыточности, которые существуют там. Учитывая, что:
- Между этими операторами вставки / обновления / удаления выполняется нет
SELECT
запросов,
- Операторы выполняются в одной транзакции,
- Операторы отправляются в базу данных одним вызовом API, анализируются базой данных и выполняются вместе
Какой смысл пытаться удалить эти избыточности перед отправкой их в базу данных? Другими словами, есть ли в базах данных, таких как PostgreSQL, MySQL, механизмы для удаления лишнего кода самостоятельно перед его фактическим запуском?
Важный отказ от ответственности: Я не контролирую фактический выполняемый код SQL. Я пишу обертку вокруг ORM API, которая должна автоматически оптимизировать эти операторы. Однако это сложно - нужно позаботиться о многих вещах, таких как внешний ключ и уникальные ограничения. Очевидно, что любая оптимизация на стороне клиента окажет положительное влияние на производительность базы данных. Однако это сложная задача, и если на конце базы данных уже выполняются только аналогичные алгоритмы, я бы предпочел, чтобы они выполнили эту работу.
Решение
Я перешел на PostgreSQL 9.0, где ограничения UNIQUE
и REFERENCES
являются отложенными. В случае базы данных, в которой она хранится, можно сжать произвольную последовательность примитивных операций в одной строке до одной операции (т. Е. ..., DELETE
, INSERT
-> UPDATE
). Конечно, как уже упоминалось в ответе, предполагается, что триггеров не существует (как в моем случае).