Русские документы
Ежедневные компьютерные новости RSS rusdoc.ru  Найти :
Новости
Последние поступления
Книжный магазин
  Hardware:
Видеоустройства
Системные платы
Процессоры
Мобильные устройства
Аудиосистема
Охлаждение системы
Накопители информации
КПК и ноутбуки
Телефоны и связь
Периферия
Система
Сети
Разные устройства
 
  Programming:
Web-разработка
Языки программирования
Технологии и теория
Разработка игр
Программная инженерия
 
  Software:
Операционные системы
Windows 7
Базы данных
Обзоры программ
Графика и дизайн
   
  Life:
Компьютерная жизнь
Разные материалы
   
Партнеры
Публикация
Правовая информация
Реклама на сайте
Обратная связь
Экспорт в RSS Экспорт в RSS2.0
    Читать в Яндекс.Ленте



Как правильно писать SQL-запросы

Раздел: Software / Теория @ 08.06.2008 | Ключевые слова: SQL запросы oracle версия для печати

Автор: rachiu
Источник: habrahabr

Последние два года я программирую "тяжелую" web-ориентированную систему, и мне приходится постоянно писать запросы для баз данных(Oracle). За это время у меня выработался определенный вкус в этом деле. Хочу поделиться своими соображениями, которые, конечно, не претендуют на абсолютную верность.

Многие считают, что везде, где можно использовать "чистый" SQL вместо объектно-ориентированного подхода, нужно его использовать. Это заблуждение. Вы не поверите, сколько времени оно отняло у меня. Поясню. Предположим, что необходимо получить информацию о пользователе и некоторых объектах, которые с ним связаны.
Примерный вид решения на SQL:

SQLObject object = executeQuery (
"SELECT u.name user_name, dep.name dep_name\n" +
"FROM USERS u, DEPARTMENTS dep\n" +
" WHERE u.user_id = ?\n" +
" AND u.department_id = dep.department_id",
userID )

Примерный вид решения с использованием API:

User user = new User(userID);
Department department = user.getDepartment();

В чем преимущества первого решения: оно работает быстрее второго. В чем преимущество второго: оно более воспринимаемо человеком, и его намного легче поддерживать. Конечно, если этот код вызывается очень часто или разница во времени выполнения слишком большая, то следует использовать первый вариант. Во всех остальных случаях лучше взять второй, т. к. нужно думать о людях, а не о выигрыше миллисекунд.

От подзапросов можно отказаться в 99% случаев. Обычно подзапросами активно пользуются начинающие программисты. Вот типичный случай его использования: для пользователя из предыдущего случая нужно вывести название департамента, к которому он приписан, но при этом те пользователи, которые проходят стажировку, не приписаны к департаменту, и для них нужно вывести null.
С подзапросом (поверите, так очень многие пишут):

SELECT u.name user_name, (SELECT dep.name FROM DEPARTMENT dep WHERE u.department_id = dep.department_id) dep_name
FROM USERS u
WHERE u.user_id = ?

Без подзапроса:

SELECT u.name user_name, dep.name dep_name
FROM USERS u
LEFT JOIN DEPARTMENTS dep
ON u.department_id = dep.department_id
AND u.user_id = ?

В Oracle можно красивее:

SELECT u.name user_name, d.name dep_name
FROM USERS u, DEPARTMENTS dep
WHERE u.user_id = ?
AND dep.department_id(+) = u.department_id


Везде, где можно, используйте Prepared Statements. Во-первых, это безопаснее, а во-вторых, быстрее. Иногда отсутствие Prepared Statement в часто выполняющемся запросе может очень сильно сказаться на производительности базы данных. Пример. Нужно часто получать информацию о конкретном пользователе.
Решение без Prepared Statement:

String name = executeSimpleQuery("SELECT u.name FROM USERS u WHERE u.user = " + userID);

Решение с Prepared Statement:

String name = executePreparedQuery("SELECT u.name FROM USERS u WHERE u.user = ?", userID);

Почему второй вариант лучше (вопросов безопасности касаться пока не буду, т. к. могу дать несколько неверное объяснение)? Дело в том, что поступающие запросы анализируются СУБД и сохраняются в кэше. Два запроса без Prepared Statement с разными userID будут считаться разными, а анализ запроса с Prepared Statement поведется один раз (при условии, что его не вытеснят из кэша). Это первый аспект. Второй аспект состоит в том, что если в одном из запросов вы не стали использовать Prepared Statement, то его частая обработка будет вытеснять из кэша другие, уже проанализированный запросы, что сведёт всю систему кэширования на нет.

Используйте грамотные алиасы, особенно, когда во "FROM" стоит много таблиц. Также, не стоит забывать использовать комментарии в запросах.

Вообще, большинство вещей, о которых хотел написать, нашлись в статье Алексея Петрова http://www.citforum.ru/database/articles…. Тем не менее, если подобная тематика интересна сообществу, я могу продолжить.

Существует отличный сайт с упражнениями по SQL http://www.sql-ex.ru (правда база там - MS SQL).

P.p.s. Большое спасибо посмотреть профиль 366

Это интересно:








версия для печатиРаспечатать статью


Вернуться в раздел: Software / Теория


Реклама:
Читать наc на:

Add to Google
Читать в Яндекс.Ленте






Rambler's Top100
© Copyright 1998-2012 Александр Томов. All rights reserved.