Вредные советы по SQL Фёдор Самородов Фёдор Самородов • Fedor@Samorodov.ru • http://Samorodov.SU Страница 2 www.specialist.ru Вредны ли вредные советы? Вредные советы – это антишаблоны – Распознать опасную ситуацию – Сэкономить время Страница 3 www.specialist.ru Вредны ли вредные советы? Решение сложных инженерных задач всегда заканчиваются компромиссом. Объём ресурсов, используемых SQL-запросом Решение должно быть адекватно задаче. И любой антишаблон из тех, что мы сегодня рассмотрим, в некоторых обстоятельствах может оказаться лучше любого «правильного» решения! Страница 4 Скорость работы SQLзапроса Время, затраченное на написание, отладку и доработку SQLзапроса www.specialist.ru Вредный совет №1 Используйте конструкцию «SELECT * …» Страница 5 www.specialist.ru Вредный совет №1 Используйте конструкцию «SELECT * …» • Нет необходимости вспоминать структуру таблицы • Можно печатать гораздо меньше текста (или поставить макрос) • Кто знает, какие столбцы понадобятся в будущем • Меньше работы при модификации приложения • Скорость разработки возрастает • Чем проще текст запроса, тем лучше Страница 6 www.specialist.ru Вредный совет №1 Используйте конструкцию «SELECT * …» • Проблемы с ассоциативными массивами в приложении • Игнорирование некластеризованных индексов • А как насчёт вычисляемых столбцов? • Дополнительная нагрузка на сеть при передаче результата запроса приложению Страница 7 www.specialist.ru Вредный совет №1.1 При сортировке обращайтесь к столбцам по номерам Страница 8 www.specialist.ru Вредный совет №1.1 Обращайтесь к столбцам по номерам • Простое решение – лучшее решение! • Можно печатать гораздо меньше текста Страница 9 www.specialist.ru Вредный совет №1.1 Обращайтесь к столбцам по номерам • При изменении структуры объектов связь по номерам разрушается! Страница 10 www.specialist.ru Вредный совет №1.2 При вставке используйте конструкцию «INSERT INTO Table1 VALUES …» Страница 11 www.specialist.ru Вредный совет №1.2 Используйте «INSERT INTO Table1 VALUES …» • Простое решение – лучшее решение! • Можно печатать гораздо меньше текста Страница 12 www.specialist.ru Вредный совет №1.2 Используйте «INSERT INTO Table1 VALUES …» • При добавлении новых столбцов в таблицу, написанные ранее INSERT’ы перестают работать! Страница 13 www.specialist.ru Вредный совет №2 Всегда старайтесь решить задачу одним запросом Страница 14 www.specialist.ru Вредный совет №2 Решайте любую задачу одним запросом • Почувствуйте себя мастером • Если даже один запрос выполняется медленно, то несколько запросов будут ещё медленнее! • Один запрос всегда элегантнее и изящнее Страница 15 www.specialist.ru Вредный совет №2 Решайте любую задачу одним запросом • Сложно писать, сложно модифицировать, сложно отлаживать • Резко возрастает вероятность ошибки • Решение перестаёт помещаться в голове Страница 16 www.specialist.ru Вредный совет №3 Для получения случайных строк используйте выборку с сортировкой по генератору случайных чисел Страница 17 www.specialist.ru Вредный совет №3 Сортируйте строки по случайным значениям • Получаем действительно случайную строку • Простое решение Страница 18 www.specialist.ru Вредный совет №3 Сортируйте строки по случайным значениям • Не используются индексы • Скалярные вычисления для каждой строки • После вычисления всех значений 99,999% результата выбрасывается (много напрасной работы и бесполезной нагрузки на сервер) Страница 19 www.specialist.ru Вредный совет №3.1 Применяйте скалярные функции к столбцам в секциях WHERE и ORDER BY Страница 20 www.specialist.ru Вредный совет №3.1 Используйте функции в WHERE и ORDER BY • Простое решение • Запрос легче читается Страница 21 www.specialist.ru Вредный совет №3.1 Используйте функции в WHERE и ORDER BY • Не используются индексы • Скалярные вычисления для каждой строки Страница 22 www.specialist.ru Вредный совет №4 Используйте LIKE для поиска по тексту Используйте регулярные выражения для поиска по тексту Страница 23 www.specialist.ru Вредный совет №4 Используйте LIKE/RegEx для поиска по тексту • Простое решение • Можно искать сложные конструкции Страница 24 www.specialist.ru Вредный совет №4 Используйте LIKE/RegEx для поиска по тексту • Очень медленно! • Решение не масштабируется • Практически невозможно искать слова Страница 25 www.specialist.ru Вредный совет №5 Используйте NULL, как обычное значение Страница 26 www.specialist.ru Вредный совет №5 Используйте NULL, как обычное значение Если уж придуман NULL, надо его использовать Страница 27 www.specialist.ru Вредный совет №5 Используйте NULL, как обычное значение NULL – это не значение Страница 28 www.specialist.ru Вредные советы 1. Используйте конструкцию «SELECT * …» 1. Обращайтесь к столбцам по номерам 2. Используйте «INSERT INTO Table1 VALUES …» 2. Решайте любую задачу одним запросом 3. Сортируйте строки по случайным значениям 1. Применяйте скалярные функции к столбцам в WHERE и ORDER BY 4. Используйте LIKE для поиска по тексту 5. Используйте NULL, как обычное значение Страница 29 www.specialist.ru Задача Сколько блоков размером 2x1x1 находится внутри этого параллелепипеда? Невидимая часть полностью заполнена. Страница 30 www.specialist.ru В следующих сериях Это были вредные советы для тех, кто пишет SQL-запросы, то есть для пользователей баз данных. А дальше: Ещё одна порция вредных советов для пользователей баз данных Вредные советы для разработчиков баз данных Вредные советы для администраторов баз данных Вредные советы для разработчиков приложений, использующих базы данных Страница 31 www.specialist.ru