Упражнение 1
Первая задача сложности 1. Даже новички легко справляются с ее решением. Действительно, одна таблица, одно условие отбора по стоимости и ограничение вывода тремя столбцами:
SELECT model, speed, hd
FROM PC
WHERE price < 500;
[[ column ]] |
---|
[[ value ]] |
Казалось бы, какую пользу можно извлечь из анализа этой задачи? В ответ на этот вопрос предлагаем рассмотреть другое решение той же задачи:
SELECT Product.model, PC.speed, PC.hd
FROM Product, PC
WHERE Product.model = PC.model AND price < 500;
[[ column ]] |
---|
[[ value ]] |
Решения дают один и тот же результат в силу того, что поддерживается целостность по ссылкам между таблицами PC и Product по номеру модели (столбец model). В частности, это означает, что в таблице PC не может быть модели, которой бы не было в таблице Product. Однако второй запрос не принимался системой, в результате чего автор получил возмущенное письмо от приславшего решение.
Оказалось, что при переносе баз на другой сервер некоторые связи были утеряны, в результате чего в таблице PC появилась модель с удовлетворяющими условиям задачи характеристиками и номером, который отсутствовал в таблице Product. Естественно, второе решение не выдавало этой строки, и система проверки правильности не принимала такого решения.
Несогласованность данных была устранена, связь восстановлена, и второе решение стало благополучно проходить проверку. Мораль же этой истории заключается в том, что не нужно соединять таблицы, если в этом нет необходимости. По условиям задачи нам не нужна была информация из таблицы Product, поэтому не следовало ее использовать в запросе. Это не оправдание возникшей при удалении связи проблемы, хотя, как вы видели, даже при несогласованных данных первое решение продолжало давать отвечающий условию результат, а именно, выдавало все ПК со стоимостью менее 500 долларов.
Совет
Если наша цель не просто научиться писать запросы, а создавать их по возможности эффективными, то следует, безусловно, избегать излишних соединений таблиц.
Помимо того, что сама операция соединения весьма затратная с точки зрения ресурсов, она может вызвать наложение ненужных блокировок на таблицы (в нашем примере – на таблицу Product), что будет приводить в состояние ожидания параллельно выполняющиеся запросы (например, на модификацию данных), адресуемые к этим таблицам. В результате будет снижаться производительность всей системы.