Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 7acb1bf

Browse files
authored
Create TODO.query_validation.md
1 parent 490822a commit 7acb1bf

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /