Упражнение 8 (подсказки и решения) стр. 2 |
|||||
На примере этой несложной задачи можно продемонстрировать многообразие решений, которое обусловлено гибкостью языка SQL. Решение 4.4.4. Внешнее самосоединение
Левое соединение таблицы Product с собой при условии, что производитель один и тот же, а тип продукции из второй таблицы есть блокнот. Тогда в столбце p1.maker будет находиться NULL, если у поставщика нет моделей портативных компьютеров, что и используется в предикате предложения WHERE наряду с условием, что в той же строке типом продукции является ПК. Решение 4.4.5. Группировка
В подзапросе выбираются уникальные пары {поставщик, тип}, если типом является ПК или портативный компьютер. Затем выполняется группировка по поставщику, при этом сгруппированные строки должны отвечать следующим условиям: COUNT(*) = 1 — то есть поставщик должен выпускать только один тип продукции из оставшихся (поскольку мы уже отсекли принтеры, то остается либо ПК, либо портативный компьютер); MAX(type) = 'PC' — этим типом продукции является ПК. Поскольку в предложении HAVING не могут присутствовать ссылки на столбцы без агрегатных функций, то используется MAX(type), хотя с тем же успехом можно было написать и MIN(type). При таком обилии подходов естественен вопрос об эффективности, то есть какой из представленных запросов будет выполняться быстрее. Лидером здесь, как по числу операций, так и по оценке времени исполнения, является решение 4.4.5. Наихудшие показатели у третьего варианта. Остальные примерно в два раза по времени уступают лидеру. Оценку времени, а также процедурный план выполнения запроса в текстовом представлении можно получить в Query Analyzer (SQL Server), выполнив сначала команду.
SET SHOWPLAN_ALL ON;
а затем выполняя интересующие нас запросы. Чтобы вернуться к обычному режиму выполнения запросов, нужно в том же подключении дать команду
SET SHOWPLAN_ALL OFF;
Если у вас не установлен Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server, вы можете получить план выполнения запроса непосредственно на сайте: http://www.sql-ex.ru/perfcon.php. Вернуться к обсуждению упражнения 8
|