PostgreSQL, MySQL - избыточное обновление / вставка / удаление оптимизации - PullRequest
1 голос
/ 12 августа 2011

У меня есть много операторов 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). Конечно, как уже упоминалось в ответе, предполагается, что триггеров не существует (как в моем случае).

1 Ответ

2 голосов
/ 12 августа 2011

В ваших примерах не будет выполнено никаких оптимизаций, базы данных будут вести себя точно так, как указано (INSERT сначала, затем DELETE).

SQL Server и Oracle support MERGE командакоторый объединяет INSERT, UPDATE и DELETE, но в настоящее время он не поддерживается ни PostgreSQL, ни MySQL.

MySQL также поддерживает INSERT … ON DUPLICATE KEY UPDATE, что может помочь в некоторых случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...