Прочитал интересную статью со сборником частых ошибок, которые допускают при написании SQL-запросов.
Для себя могу отметить следующее (далее пункты соответствуют пунктам в статье):
- Правильность типа данных очень важна.
- SELECT * - зло!
- Alias нужны всегда и для всех объектов.
- Нельзя ориентироваться на порядок колонок в таблице.
- Коварный NULL (его необходимо учитывать при сравнениях).
- Константы даты только YYYYMMDD (раньше писал с дефисами, больше не буду).
- Интересные решения по фильтрации по дате - вычисляемое поле и индекс.
- Нельзя преобразовывать колонки в WHERE.
- Всегда необходимо указывать правильный тип констант (строки в кавычках).
- Для поиска с начала только LIKE.
- Для констант в UNICODE всегда N (иначе будет приведение к ANSI).
- COLLATE очень важен.
- Для LIKE c %Value% можно использовать BINARY COLLATE.
- Имена всех объектов писать строго как в БД (иначе м.б. проблемы с COLLATE).
- Внимание с CHAR и VARCHAR (т.к. есть отличия в сравнении по LIKE).
- Важно указывать размерность типа (просто VARCHAR = VARCHAR(1), но в CAST/CONVERT будет VARCHAR(30)).
- ISNULL и COALESCE (первый приводит к меньшему типу, второй к большему, но работает медленнее).
- Внимательнее с математическими операциями - результат зависит от типов операндов.
- UNION vs UNION ALL (первый медленно, но может выполняться параллельно, второй быстро но последовательно).
- Внимательнее с подзапросами в SELECT - могут быть лишние чтения.
- В подзапросах может вернуться более одного результата (тогда ошибка).
- CASE WHEN - может привести многократному вычислению одних и тех же операторов.
- Scalar func - зло (особенно с параметрами и вычислениями).
- Внимательнее с VIEWs (могут быть проблемы с производительностью, если нужны не все колонки).
- CURSORs - зло (только если по-другому нельзя).
- Пока нет STRING_CONCAT - XML оптимальный вариант (90% случаев).
- SQL Injection - использовать sp_executesql с параметрами, вместо ручной склейки строки.
PS: Для отображение численных характеристик выполнения запроса можно использовать SET STATISTICS TIME, IO ON перед запросом и OFF после.
Комментарии