|
| 1 | +# Валидация потенциальных ошибок в SQL запросах |
| 2 | + |
| 3 | +К валидатору схемы БД это не относится. Собираю на будущее для другого валидатора. |
| 4 | + |
| 5 | +1) Вместо `NOT IN(...)` [лучше](https://github.com/rin-nas/postgresql-patterns-library/blob/master/README.md#%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81-%D1%81-%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%BC-%D0%B2-NOT-IN-%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D1%82-0-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9) использовать `NOT EXISTS(...)` |
| 6 | + |
| 7 | +2) Возможные ошибки с `timestamp[tz]` в границах значений. |
| 8 | + |
| 9 | +Неправильно: |
| 10 | +```sql |
| 11 | +SELECT sum(amount) |
| 12 | +FROM transactions |
| 13 | +WHERE transaction_timestamp |
| 14 | +BETWEEN ('2023年02月05日 00:00' AND '2023年02月06日 00:00'); |
| 15 | +``` |
| 16 | + |
| 17 | +Правильно: |
| 18 | +```sql |
| 19 | +SELECT sum(amount) |
| 20 | +FROM transactions |
| 21 | +WHERE transaction_timestamp >= '2023年02月05日 00:00' |
| 22 | +AND transaction_timestamp < '2023年02月06日 00:00'; |
| 23 | +``` |
| 24 | + |
| 25 | +3) Несколько DDL запросов для одного объекта БД лучше объединять в 1 запрос, если позволяет синтаксис. |
| 26 | +4) Несколько DDL запросов для разных объектов БД лучше собирать в группу. Т.е. д.б. группа из DDL запросов и группа из DML запросов. |
| 27 | +5) Группу из DDL запросов лучше размещать после группы из DML запросов, так будет меньше длительность эксклюзивной блокировки таблиц. |
| 28 | +6) Длительность выполнения группы DDL запросов д.б. < 3 секунд. |
| 29 | +7) Обнаруживать звёздочку в месте перечисления колонок в SELECT запросе, рекомендовать её заменить на явное перечисление колонок |
| 30 | +8) Если в запросе присутствует `LIMIT` и `OFFSET`, но отсутствует `ORDER BY`, то рекомендовать добавить его. |
| 31 | +9) Запретить `UPDATE` запросы без `WHERE`, т.к. он блокирует все строки таблицы. При одновременном выполнении этого запроса в разных транзакциях возникают взаимоблокировки. |
| 32 | + |
| 33 | +## Ссылки |
| 34 | + |
| 35 | +* https://fosdem.org/2023/schedule/event/postgresql_dont_do_this/attachments/slides/5948/export/events/attachments/postgresql_dont_do_this/slides/5948/DontDoThis.pdf |
0 commit comments